00001
00002
00003 #if !defined(__cpt_StateBase_h__)
00004 #define __cpt_StateBase_h__
00005
00006
00007 #include "Grid.h"
00008 #include "BRep.h"
00009
00010 #include "../geom/mesh/iss/distance.h"
00011
00012 #include <iostream>
00013
00014 #include <cmath>
00015
00016 namespace cpt {
00017
00019
00022 template < std::size_t N, typename T = double >
00023 class StateBase {
00024
00025
00026
00027
00028 protected:
00029
00031 typedef T Number;
00033 typedef geom::BBox<N, Number> BBox;
00035 typedef geom::RegularGrid<N, T> Lattice;
00037 typedef cpt::Grid<N, T> Grid;
00039 typedef cpt::BRep<N, T> BRep;
00040
00042 typedef typename Grid::Point Point;
00044 typedef typename Grid::SizeList SizeList;
00046 typedef typename Grid::IndexList IndexList;
00048 typedef typename Grid::IndexList IndexedFace;
00050 typedef typename Grid::Index Index;
00052 typedef typename Grid::Range Range;
00053
00054
00055
00056
00057
00058 protected:
00059
00061 bool _hasBRepBeenSet;
00063 bool _hasCptBeenComputed;
00065
00066 BBox _domain;
00068 Number _maximumDistance;
00070 Lattice _lattice;
00072 std::vector<Grid> _grids;
00074 BRep _brep;
00075
00076
00077
00078
00079
00080 private:
00081
00083 StateBase(const StateBase&);
00084
00086 StateBase&
00087 operator=(const StateBase&);
00088
00089 public:
00090
00091
00093
00094
00096 StateBase() :
00097 _hasBRepBeenSet(false),
00098 _hasCptBeenComputed(false),
00099 _domain(),
00100 _maximumDistance(-1),
00101 _lattice(),
00102 _grids(),
00103 _brep() {}
00104
00106 ~StateBase() {}
00107
00109
00111
00112
00114 std::size_t
00115 getNumberOfGrids() const {
00116 return _grids.size();
00117 }
00118
00120 const Grid&
00121 getGrid(const std::size_t n) const {
00122 return _grids[n];
00123 }
00124
00126 bool
00127 hasBRepBeenSet() const {
00128 return _hasBRepBeenSet;
00129 }
00130
00132 const BBox&
00133 getDomain() const {
00134 return _domain;
00135 }
00136
00138 Number
00139 getMaximumDistance() const {
00140 return _maximumDistance;
00141 }
00142
00144
00146
00147
00148
00150
00165 void
00166 setParameters(const BBox& domain, Number maximumDistance);
00167
00169
00172 void
00173 setParameters(const Number* domainLowerData, const Number* domainUpperData,
00174 const Number maximumDistance) {
00175 const Point domainLower = ext::copy_array<Point>(domainLowerData);
00176 const Point domainUpper = ext::copy_array<Point>(domainUpperData);
00177 setParameters(BBox(domainLower, domainUpper), maximumDistance);
00178 }
00179
00181
00186 void
00187 setParameters(const Number maximumDistance) {
00188
00189 const Point Infinity =
00190 ext::filled_array<Point>(std::numeric_limits<Number>::max());
00191
00192 setParameters(BBox(-Infinity, Infinity), maximumDistance);
00193 }
00194
00195
00196
00198
00202 void
00203 setLattice(const SizeList& extents, const BBox& domain);
00204
00206
00209 void
00210 setLattice(const int* extentsData, const Number* lowerData,
00211 const Number* upperData) {
00212 const SizeList extents = ext::copy_array<SizeList>(extentsData);
00213 const Point lower = ext::copy_array<Point>(lowerData);
00214 const Point upper = ext::copy_array<Point>(upperData);
00215 setLattice(extents, BBox(lower, upper));
00216 }
00217
00219
00232 void
00233 insertGrid(const SizeList& extents,
00234 const IndexList& bases,
00235 bool useGradientOfDistance,
00236 bool useClosestPoint,
00237 bool useClosestFace);
00238
00240
00250 void
00251 insertGrid(const SizeList& extents,
00252 const IndexList& bases,
00253 Number* distance,
00254 Number* gradientOfDistance,
00255 Number* closestPoint,
00256 int* closestFace);
00257
00259
00262 void
00263 insertGrid(const int* lowerBounds, const int* upperBounds, Number* distance,
00264 Number* gradientOfDistance, Number* closestPoint,
00265 int* closestFace) {
00266 const IndexList bases = ext::copy_array<IndexList>(lowerBounds);
00267 std::size_t extentsData[N];
00268 for (std::size_t i = 0; i < N; ++i)
00269 extentsData[i] = upperBounds[i] - lowerBounds[i] + 1;
00270 const SizeList extents = ext::copy_array<SizeList>(extentsData);
00271 insertGrid(extents, bases, distance, gradientOfDistance, closestPoint,
00272 closestFace);
00273 }
00274
00276
00280 void
00281 clearGrids() {
00282 _grids.clear();
00283 }
00284
00286
00303 std::pair<std::size_t, std::size_t>
00304 computeClosestPointTransformUsingBBox();
00305
00307
00325 std::pair<std::size_t, std::size_t>
00326 computeClosestPointTransformUsingBruteForce();
00327
00329
00346 std::pair<std::size_t, std::size_t>
00347 computeClosestPointTransformUsingTree();
00348
00350
00367 std::pair<std::size_t, std::size_t>
00368 computeClosestPointTransformUnsignedUsingBBox();
00369
00371
00389 std::pair<std::size_t, std::size_t>
00390 computeClosestPointTransformUnsignedUsingBruteForce();
00391
00393
00402 void
00403 floodFillAtBoundary(Number farAway);
00404
00406
00422 void
00423 floodFillDetermineSign(Number farAway);
00424
00426
00430 void
00431 floodFillUnsigned(Number farAway);
00432
00434
00441 bool
00442 areGridsValid();
00443
00445
00452 bool
00453 areGridsValidUnsigned();
00454
00456
00466 void
00467 setBRepWithNoClipping
00468 (const std::vector<std::tr1::array<Number, N> >& vertices,
00469 const std::vector<std::tr1::array<std::size_t, N> >& faces);
00470
00472 void
00473 setBRepWithNoClipping(std::size_t numVertices, const Number* vertices,
00474 std::size_t numFaces, const int* faces);
00475
00477
00488 void
00489 setBRep(const std::vector<std::tr1::array<Number, N> >& vertices,
00490 const std::vector<std::tr1::array<std::size_t, N> >& faces);
00491
00493 void
00494 setBRep(std::size_t numVertices, const Number* vertices,
00495 std::size_t numFaces, const int* faces);
00496
00498
00500
00501
00503 void
00504 displayInformation(std::ostream& out) const;
00505
00507
00509
00510
00511 protected:
00512
00514 void
00515 initializeGrids() {
00516 for (std::size_t n = 0; n != getNumberOfGrids(); ++n) {
00517 _grids[n].initialize();
00518 }
00519 }
00520
00522
00523 };
00524
00525 }
00526
00527 #define __cpt_StateBase_ipp__
00528 #include "StateBase.ipp"
00529 #undef __cpt_StateBase_ipp__
00530
00531 #endif