MPQC  2.3.1
shape.h
1 //
2 // shape.h
3 //
4 // Copyright (C) 1996 Limit Point Systems, Inc.
5 //
6 // Author: Curtis Janssen <cljanss@limitpt.com>
7 // Maintainer: LPS
8 //
9 // This file is part of the SC Toolkit.
10 //
11 // The SC Toolkit is free software; you can redistribute it and/or modify
12 // it under the terms of the GNU Library General Public License as published by
13 // the Free Software Foundation; either version 2, or (at your option)
14 // any later version.
15 //
16 // The SC Toolkit is distributed in the hope that it will be useful,
17 // but WITHOUT ANY WARRANTY; without even the implied warranty of
18 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 // GNU Library General Public License for more details.
20 //
21 // You should have received a copy of the GNU Library General Public License
22 // along with the SC Toolkit; see the file COPYING.LIB. If not, write to
23 // the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
24 //
25 // The U.S. Government is granted a limited license as per AL 91-7.
26 //
27 
28 #ifndef _math_isosurf_shape_h
29 #define _math_isosurf_shape_h
30 
31 #ifdef __GNUC__
32 #pragma interface
33 #endif
34 
35 #include <set>
36 
37 #include <math/isosurf/volume.h>
38 #include <math/scmat/matrix.h>
39 #include <math/scmat/vector3.h>
40 
41 namespace sc {
42 
48 class Shape: public Volume {
49  public:
50  Shape();
51  Shape(const Ref<KeyVal>&keyval);
52  virtual double distance_to_surface(const SCVector3&r,
53  SCVector3*grad=0) const = 0;
54  virtual int is_outside(const SCVector3&r) const;
55  virtual ~Shape();
56  void compute();
57  void interpolate(const SCVector3& p1,
58  const SCVector3& p2,
59  double val,
60  SCVector3& result);
61 
62  int value_implemented() const;
63 };
64 
65 
66 
67 class SphereShape: public Shape {
68  private:
69  SCVector3 _origin;
70  double _radius;
71  public:
72  SphereShape(const SCVector3&,double);
73  SphereShape(const Ref<KeyVal>&);
74  SphereShape(const SphereShape&);
75  ~SphereShape();
76  void boundingbox(double minvalue, double maxvalue,
77  SCVector3& p1, SCVector3&p2);
78  double radius() const { return _radius; }
79  const SCVector3& origin() const { return _origin; }
80  double distance_to_surface(const SCVector3&r,SCVector3*grad=0) const;
81  void print(std::ostream&o=ExEnv::out0()) const;
82 
83  // these are used to update the parameters describing the sphere
84  double radius(double r);
85  const SCVector3& origin(const SCVector3& o);
86 
87  int gradient_implemented() const;
88 };
89 
90 inline double
91 SphereShape::radius(double r)
92 {
93  obsolete();
94  return _radius = r;
95 }
96 
97 inline const SCVector3&
98 SphereShape::origin(const SCVector3& o)
99 {
100  obsolete();
101  _origin = o;
102  return _origin;
103 }
104 
106 {
107  private:
108  SphereShape _s1;
109  SphereShape _s2;
110  double _r;
111  protected:
112  void in_plane_sphere(const SCVector3& point,
113  SCVector3& origin) const;
114  UncappedTorusHoleShape(double r,const SphereShape&,const SphereShape&);
115  public:
116  static UncappedTorusHoleShape*
117  newUncappedTorusHoleShape(double r,
118  const SphereShape&,
119  const SphereShape&);
120  inline ~UncappedTorusHoleShape() {};
121  inline const SphereShape& sphere(int i) const { return (i?_s2:_s1); };
122  inline const SCVector3 A() const { SCVector3 v(_s1.origin()); return v; }
123  inline const SCVector3 B() const { SCVector3 v(_s2.origin()); return v; }
124  inline double radius() const { return _r; };
125  void print(std::ostream&o=ExEnv::out0()) const;
126  void boundingbox(double valuemin, double valuemax,
127  SCVector3& p1, SCVector3&p2);
128 
129  int gradient_implemented() const;
130 };
131 
133 {
134  private:
135  double rAP;
136  double rBP;
137  SCVector3 BA;
138  public:
140  const SphereShape&,
141  const SphereShape&);
143  double distance_to_surface(const SCVector3&r,SCVector3*grad=0) const;
144 
145  int gradient_implemented() const;
146 };
147 
149 {
150  private:
151  double rAP;
152  double rBP;
153  SCVector3 BA;
154  SCVector3 I[2]; // the intersect points
155  public:
157  const SphereShape&,
158  const SphereShape&);
160  int is_outside(const SCVector3&r) const;
161  double distance_to_surface(const SCVector3&r,SCVector3*grad=0) const;
162 
163  int gradient_implemented() const;
164 };
165 
167 {
168  private:
169  int _solution_exists;
170  int _reentrant;
171  int _folded;
172  SphereShape _s1;
173  SphereShape _s2;
174  SphereShape _s3;
175  SCVector3 D[2];
176  double BDxCDdotAD[2];
177  SCVector3 BDxCD[2];
178  double CDxADdotBD[2];
179  SCVector3 CDxAD[2];
180  double ADxBDdotCD[2];
181  SCVector3 ADxBD[2];
182  double _r;
183 
184  // these are needed for folded shapes
185  // F1 and F2 are the two points of A, B, and C that are closed to M
186  SCVector3 F1;
187  SCVector3 F2;
188 
189  // these are needed for reentrant surfaces to compute distances
190  SCVector3 M; // projection of D onto ABC plane
191  SCVector3 MD[2]; // M - D
192  double theta_intersect; // angle M - D - intersect_point
193  double r_intersect; // the radius of the intersect circle
194  int _intersects_AB;
195  SCVector3 IABD[2][2];
196  int _intersects_BC;
197  SCVector3 IBCD[2][2];
198  int _intersects_CA;
199  SCVector3 ICAD[2][2];
200 
201  protected:
203  const SphereShape&,
204  const SphereShape&,
205  const SphereShape&);
206  public:
208  newUncapped5SphereExclusionShape(double r,
209  const SphereShape&,
210  const SphereShape&,
211  const SphereShape&);
212  inline ~Uncapped5SphereExclusionShape() {};
213  inline const SCVector3 A() const { SCVector3 v(_s1.origin()); return v; }
214  inline const SCVector3 B() const { SCVector3 v(_s2.origin()); return v; }
215  inline const SCVector3 C() const { SCVector3 v(_s3.origin()); return v; }
216  inline double rA() const { return _s1.radius(); };
217  inline double rB() const { return _s2.radius(); };
218  inline double rC() const { return _s3.radius(); };
219  inline double r() const { return _r; };
220  inline int solution_exists() const { return _solution_exists; };
221  double distance_to_surface(const SCVector3&r,SCVector3*grad=0) const;
222  int is_outside(const SCVector3&) const;
223  void boundingbox(double valuemin, double valuemax,
224  SCVector3& p1, SCVector3&p2);
225 
226  int gradient_implemented() const;
227 };
228 
230 class UnionShape: public Shape {
231  protected:
232  std::set<Ref<Shape> > _shapes;
233  public:
234  void add_shape(Ref<Shape>);
235  UnionShape();
236  ~UnionShape();
237  double distance_to_surface(const SCVector3&r,SCVector3*grad=0) const;
238  int is_outside(const SCVector3&r) const;
239  void boundingbox(double valuemin, double valuemax,
240  SCVector3& p1, SCVector3& p2);
241 
242  int gradient_implemented() const;
243 };
244 
245 }
246 
247 #endif
248 
249 // Local Variables:
250 // mode: c++
251 // c-file-style: "CLJ"
252 // End:
sc::Shape
A Shape is a Volume represents an 3D solid.
Definition: shape.h:48
sc::Shape::compute
void compute()
Recompute at least the results that have compute true and are not already computed.
sc::ReentrantUncappedTorusHoleShape
Definition: shape.h:148
sc::Ref
A template class that maintains references counts.
Definition: ref.h:332
sc::UncappedTorusHoleShape::print
void print(std::ostream &o=ExEnv::out0()) const
Print information about the object.
sc::Shape::value_implemented
int value_implemented() const
Information about the availability of values, gradients, and hessians.
sc::Compute::obsolete
virtual void obsolete()
Marks all results as being out of date.
sc::NonreentrantUncappedTorusHoleShape
Definition: shape.h:132
sc::UnionShape
A UnionShape is volume enclosed by a set of Shape's.
Definition: shape.h:230
point
Definition: implicit.h:5
sc::Volume
A Volume is a Function of three variables.
Definition: volume.h:42
sc::SphereShape::print
void print(std::ostream &o=ExEnv::out0()) const
Print information about the object.
sc::SCVector3
Definition: vector3.h:45
sc::ExEnv::out0
static std::ostream & out0()
Return an ostream that writes from node 0.
sc::UncappedTorusHoleShape
Definition: shape.h:105
sc::Uncapped5SphereExclusionShape
Definition: shape.h:166
sc::SphereShape
Definition: shape.h:67

Generated at Sun Jan 26 2020 23:33:04 for MPQC 2.3.1 using the documentation package Doxygen 1.8.16.