00001 
00002 
00008 #if !defined(__geom_ScanConversionPolyhedron_h__)
00009 #define __geom_ScanConversionPolyhedron_h__
00010 
00011 #include "IndexedEdgePolyhedron.h"
00012 #include "ScanConversionPolygon.h"
00013 
00014 #include "../kernel/SegmentMath.h"
00015 #include "../grid/RegularGrid.h"
00016 
00017 #include <iostream>
00018 #include <iomanip>
00019 #include <vector>
00020 
00021 #include <cassert>
00022 #include <cmath>
00023 
00024 BEGIN_NAMESPACE_GEOM
00025 
00027 
00035 template<typename T = double>
00036 class ScanConversionPolyhedron {
00037   
00038   
00039   
00040 
00041 public:
00042 
00044   typedef T Number;
00046   typedef ads::FixedArray<3,Number> Point;
00048   typedef SegmentMath<3,Number> Segment;
00049 
00050   
00051   
00052   
00053 
00054 private:
00055 
00056   typedef ScanConversionPolygon<Number> Polygon;
00057 
00058   
00059   
00060   
00061 
00062 private:
00063 
00065   std::vector<Segment> _edges;
00066 
00067 public:
00068 
00069   
00071   
00072 
00074   ScanConversionPolyhedron() :
00075     _edges()
00076   {}
00077 
00079   ScanConversionPolyhedron(const ScanConversionPolyhedron& other) : 
00080     _edges(other._edges) 
00081   {}
00082 
00084   ScanConversionPolyhedron& 
00085   operator=(const ScanConversionPolyhedron& other);
00086   
00088   ScanConversionPolyhedron& 
00089   operator=(const IndexedEdgePolyhedron<Number>& x);
00090   
00092   ~ScanConversionPolyhedron()
00093   {}
00094 
00095   
00096   
00098   
00099 
00101   void 
00102   computeBBox(BBox<3,Number>* bb) const;
00103 
00105   void
00106   convertLocationsToIndices(const RegularGrid<3,Number>& grid);
00107 
00109 
00113   template<typename IndexOutputIterator>
00114   void
00115   scanConvert(IndexOutputIterator coordinates, 
00116               const RegularGrid<3,Number>& grid) const;
00117 
00118   
00119   
00121   
00122 
00124   const std::vector<Segment>& 
00125   getEdges() const { 
00126     return _edges; 
00127   }
00128 
00129   
00130   
00132   
00133 
00135   void 
00136   clear() {
00137     _edges.clear();
00138   }
00139 
00141   void 
00142   insertEdge(const Point& p, const Point& q);
00143 
00144   
00145 
00146 private:
00147 
00148   
00149   void 
00150   computeZIntersection(Polygon* polygon, Number z) const;
00151 
00152 };
00153 
00154 
00155 
00156 
00157 
00158 
00159 
00161 
00162 template<typename T>
00163 std::ostream& 
00164 operator<<(std::ostream& out, const ScanConversionPolyhedron<T>& polyhedron);
00165 
00166 
00168 
00169 template<typename T>
00170 void 
00171 mathematicaPrint(std::ostream& out, 
00172                  const ScanConversionPolyhedron<T>& polyhedron);
00173 
00174 
00176 
00177 template<typename T>
00178 std::istream& 
00179 operator>>(std::istream& in, ScanConversionPolyhedron<T>& polyhedron);
00180 
00181 
00182 
00183 
00184 
00185 
00186 
00188 
00189 template<typename T>
00190 inline
00191 bool 
00192 operator==(const ScanConversionPolyhedron<T>& a, 
00193            const ScanConversionPolyhedron<T>& b) { 
00194   return a.getEdges() == b.getEdges(); 
00195 }
00196 
00197 
00199 
00200 template<typename T>
00201 inline
00202 bool 
00203 operator!=(const ScanConversionPolyhedron<T>& a, 
00204            const ScanConversionPolyhedron<T>& b) { 
00205   return !(a == b);
00206 }
00207 
00208 
00209 END_NAMESPACE_GEOM
00210 
00211 #define __geom_ScanConversionPolyhedron_ipp__
00212 #include "ScanConversionPolyhedron.ipp"
00213 #undef __geom_ScanConversionPolyhedron_ipp__
00214 
00215 #endif