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
41namespace sc {
42
48class 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
67class SphereShape: public Shape {
68 private:
69 SCVector3 _origin;
70 double _radius;
71 public:
72 SphereShape(const SCVector3&,double);
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
90inline double
91SphereShape::radius(double r)
92{
93 obsolete();
94 return _radius = r;
95}
96
97inline const SCVector3&
98SphereShape::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:
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&);
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
230class 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:
virtual void obsolete()
Marks all results as being out of date.
static std::ostream & out0()
Return an ostream that writes from node 0.
A template class that maintains references counts.
Definition: ref.h:332
Definition: vector3.h:46
A Shape is a Volume represents an 3D solid.
Definition: shape.h:48
int value_implemented() const
Information about the availability of values, gradients, and hessians.
void compute()
Recompute at least the results that have compute true and are not already computed.
Definition: shape.h:67
void print(std::ostream &o=ExEnv::out0()) const
Print information about the object.
Definition: shape.h:167
Definition: shape.h:106
void print(std::ostream &o=ExEnv::out0()) const
Print information about the object.
A UnionShape is volume enclosed by a set of Shape's.
Definition: shape.h:230
A Volume is a Function of three variables.
Definition: volume.h:42
Definition: implicit.h:5

Generated at Wed Feb 28 2024 16:35:32 for MPQC 2.3.1 using the documentation package Doxygen 1.9.6.