![]()
|
shape.h00001 //
00002 // shape.h
00003 //
00004 // Copyright (C) 1996 Limit Point Systems, Inc.
00005 //
00006 // Author: Curtis Janssen <cljanss@limitpt.com>
00007 // Maintainer: LPS
00008 //
00009 // This file is part of the SC Toolkit.
00010 //
00011 // The SC Toolkit is free software; you can redistribute it and/or modify
00012 // it under the terms of the GNU Library General Public License as published by
00013 // the Free Software Foundation; either version 2, or (at your option)
00014 // any later version.
00015 //
00016 // The SC Toolkit is distributed in the hope that it will be useful,
00017 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00018 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
00019 // GNU Library General Public License for more details.
00020 //
00021 // You should have received a copy of the GNU Library General Public License
00022 // along with the SC Toolkit; see the file COPYING.LIB. If not, write to
00023 // the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
00024 //
00025 // The U.S. Government is granted a limited license as per AL 91-7.
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 <math/isosurf/volume.h>
00036 #include <math/scmat/matrix.h>
00037 #include <math/scmat/vector3.h>
00038 #include <util/container/array.h>
00039 #include <util/container/avlset.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 // these are used to update the parameters describing the sphere
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]; // the intersect points
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 // these are needed for folded shapes
00185 // F1 and F2 are the two points of A, B, and C that are closed to M
00186 SCVector3 F1;
00187 SCVector3 F2;
00188
00189 // these are needed for reentrant surfaces to compute distances
00190 SCVector3 M; // projection of D onto ABC plane
00191 SCVector3 MD[2]; // M - D
00192 double theta_intersect; // angle M - D - intersect_point
00193 double r_intersect; // the radius of the intersect circle
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 AVLSet<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 // Local Variables:
00250 // mode: c++
00251 // c-file-style: "CLJ"
00252 // End:
Generated at Fri Jan 10 08:14:09 2003 for MPQC 2.1.3 using the documentation package Doxygen 1.2.14. |