00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #ifndef _math_isosurf_shape_h
00029 #define _math_isosurf_shape_h
00030
00031 #ifdef __GNUC__
00032 #pragma interface
00033 #endif
00034
00035 #include <set>
00036
00037 #include <math/isosurf/volume.h>
00038 #include <math/scmat/matrix.h>
00039 #include <math/scmat/vector3.h>
00040
00041 namespace sc {
00042
00048 class Shape: public Volume {
00049 public:
00050 Shape();
00051 Shape(const Ref<KeyVal>&keyval);
00052 virtual double distance_to_surface(const SCVector3&r,
00053 SCVector3*grad=0) const = 0;
00054 virtual int is_outside(const SCVector3&r) const;
00055 virtual ~Shape();
00056 void compute();
00057 void interpolate(const SCVector3& p1,
00058 const SCVector3& p2,
00059 double val,
00060 SCVector3& result);
00061
00062 int value_implemented() const;
00063 };
00064
00065
00066
00067 class SphereShape: public Shape {
00068 private:
00069 SCVector3 _origin;
00070 double _radius;
00071 public:
00072 SphereShape(const SCVector3&,double);
00073 SphereShape(const Ref<KeyVal>&);
00074 SphereShape(const SphereShape&);
00075 ~SphereShape();
00076 void boundingbox(double minvalue, double maxvalue,
00077 SCVector3& p1, SCVector3&p2);
00078 double radius() const { return _radius; }
00079 const SCVector3& origin() const { return _origin; }
00080 double distance_to_surface(const SCVector3&r,SCVector3*grad=0) const;
00081 void print(std::ostream&o=ExEnv::out0()) const;
00082
00083
00084 double radius(double r);
00085 const SCVector3& origin(const SCVector3& o);
00086
00087 int gradient_implemented() const;
00088 };
00089
00090 inline double
00091 SphereShape::radius(double r)
00092 {
00093 obsolete();
00094 return _radius = r;
00095 }
00096
00097 inline const SCVector3&
00098 SphereShape::origin(const SCVector3& o)
00099 {
00100 obsolete();
00101 _origin = o;
00102 return _origin;
00103 }
00104
00105 class UncappedTorusHoleShape: public Shape
00106 {
00107 private:
00108 SphereShape _s1;
00109 SphereShape _s2;
00110 double _r;
00111 protected:
00112 void in_plane_sphere(const SCVector3& point,
00113 SCVector3& origin) const;
00114 UncappedTorusHoleShape(double r,const SphereShape&,const SphereShape&);
00115 public:
00116 static UncappedTorusHoleShape*
00117 newUncappedTorusHoleShape(double r,
00118 const SphereShape&,
00119 const SphereShape&);
00120 inline ~UncappedTorusHoleShape() {};
00121 inline const SphereShape& sphere(int i) const { return (i?_s2:_s1); };
00122 inline const SCVector3 A() const { SCVector3 v(_s1.origin()); return v; }
00123 inline const SCVector3 B() const { SCVector3 v(_s2.origin()); return v; }
00124 inline double radius() const { return _r; };
00125 void print(std::ostream&o=ExEnv::out0()) const;
00126 void boundingbox(double valuemin, double valuemax,
00127 SCVector3& p1, SCVector3&p2);
00128
00129 int gradient_implemented() const;
00130 };
00131
00132 class NonreentrantUncappedTorusHoleShape: public UncappedTorusHoleShape
00133 {
00134 private:
00135 double rAP;
00136 double rBP;
00137 SCVector3 BA;
00138 public:
00139 NonreentrantUncappedTorusHoleShape(double r,
00140 const SphereShape&,
00141 const SphereShape&);
00142 ~NonreentrantUncappedTorusHoleShape();
00143 double distance_to_surface(const SCVector3&r,SCVector3*grad=0) const;
00144
00145 int gradient_implemented() const;
00146 };
00147
00148 class ReentrantUncappedTorusHoleShape: public UncappedTorusHoleShape
00149 {
00150 private:
00151 double rAP;
00152 double rBP;
00153 SCVector3 BA;
00154 SCVector3 I[2];
00155 public:
00156 ReentrantUncappedTorusHoleShape(double r,
00157 const SphereShape&,
00158 const SphereShape&);
00159 ~ReentrantUncappedTorusHoleShape();
00160 int is_outside(const SCVector3&r) const;
00161 double distance_to_surface(const SCVector3&r,SCVector3*grad=0) const;
00162
00163 int gradient_implemented() const;
00164 };
00165
00166 class Uncapped5SphereExclusionShape: public Shape
00167 {
00168 private:
00169 int _solution_exists;
00170 int _reentrant;
00171 int _folded;
00172 SphereShape _s1;
00173 SphereShape _s2;
00174 SphereShape _s3;
00175 SCVector3 D[2];
00176 double BDxCDdotAD[2];
00177 SCVector3 BDxCD[2];
00178 double CDxADdotBD[2];
00179 SCVector3 CDxAD[2];
00180 double ADxBDdotCD[2];
00181 SCVector3 ADxBD[2];
00182 double _r;
00183
00184
00185
00186 SCVector3 F1;
00187 SCVector3 F2;
00188
00189
00190 SCVector3 M;
00191 SCVector3 MD[2];
00192 double theta_intersect;
00193 double r_intersect;
00194 int _intersects_AB;
00195 SCVector3 IABD[2][2];
00196 int _intersects_BC;
00197 SCVector3 IBCD[2][2];
00198 int _intersects_CA;
00199 SCVector3 ICAD[2][2];
00200
00201 protected:
00202 Uncapped5SphereExclusionShape(double r,
00203 const SphereShape&,
00204 const SphereShape&,
00205 const SphereShape&);
00206 public:
00207 static Uncapped5SphereExclusionShape*
00208 newUncapped5SphereExclusionShape(double r,
00209 const SphereShape&,
00210 const SphereShape&,
00211 const SphereShape&);
00212 inline ~Uncapped5SphereExclusionShape() {};
00213 inline const SCVector3 A() const { SCVector3 v(_s1.origin()); return v; }
00214 inline const SCVector3 B() const { SCVector3 v(_s2.origin()); return v; }
00215 inline const SCVector3 C() const { SCVector3 v(_s3.origin()); return v; }
00216 inline double rA() const { return _s1.radius(); };
00217 inline double rB() const { return _s2.radius(); };
00218 inline double rC() const { return _s3.radius(); };
00219 inline double r() const { return _r; };
00220 inline int solution_exists() const { return _solution_exists; };
00221 double distance_to_surface(const SCVector3&r,SCVector3*grad=0) const;
00222 int is_outside(const SCVector3&) const;
00223 void boundingbox(double valuemin, double valuemax,
00224 SCVector3& p1, SCVector3&p2);
00225
00226 int gradient_implemented() const;
00227 };
00228
00230 class UnionShape: public Shape {
00231 protected:
00232 std::set<Ref<Shape> > _shapes;
00233 public:
00234 void add_shape(Ref<Shape>);
00235 UnionShape();
00236 ~UnionShape();
00237 double distance_to_surface(const SCVector3&r,SCVector3*grad=0) const;
00238 int is_outside(const SCVector3&r) const;
00239 void boundingbox(double valuemin, double valuemax,
00240 SCVector3& p1, SCVector3& p2);
00241
00242 int gradient_implemented() const;
00243 };
00244
00245 }
00246
00247 #endif
00248
00249
00250
00251
00252