Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
ElmerCSC
GitHub Repository: ElmerCSC/elmerfem
Path: blob/devel/ElmerGUI/netgen/libsrc/csg/algprim.hpp
3206 views
1
#ifndef FILE_ALGPRIM
2
#define FILE_ALGPRIM
3
4
5
/**************************************************************************/
6
/* File: algprim.hh */
7
/* Author: Joachim Schoeberl */
8
/* Date: 1. Dez. 95 */
9
/**************************************************************************/
10
11
/*
12
13
Quadric Surfaces (Plane, Sphere, Cylinder)
14
15
*/
16
17
18
/**
19
A quadric surface.
20
surface defined by
21
cxx x^2 + cyy y^2 + czz z^2 + cxy x y + cxz x z + cyz y z +
22
cx x + cy y + cz z + c1 = 0.
23
**/
24
class QuadraticSurface : public OneSurfacePrimitive
25
{
26
protected:
27
double cxx, cyy, czz, cxy, cxz, cyz, cx, cy, cz, c1;
28
29
public:
30
virtual double CalcFunctionValue (const Point<3> & point) const;
31
virtual void CalcGradient (const Point<3> & point, Vec<3> & grad) const;
32
virtual void CalcHesse (const Point<3> & point, Mat<3> & hesse) const;
33
/*
34
virtual int RootInBox (const Box<3> & box)
35
const { return 0; }
36
virtual INSOLID_TYPE BoxInSolid (const BoxSphere<3> & box)
37
const { return DOES_INTERSECT; }
38
*/
39
virtual double HesseNorm () const { return cxx + cyy + czz; }
40
41
virtual Point<3> GetSurfacePoint () const;
42
43
44
virtual void Print (ostream & ist) const;
45
virtual void Read (istream & ist);
46
void PrintCoeff (ostream & ost) const;
47
};
48
49
50
/// A Plane (i.e., the plane and everything behind it).
51
class Plane : public QuadraticSurface
52
{
53
/// a point in the plane
54
Point<3> p;
55
/// outward normal vector
56
Vec<3> n;
57
58
double eps_base;
59
60
public:
61
///
62
Plane (const Point<3> & ap, Vec<3> an);
63
64
virtual void GetPrimitiveData (const char *& classname,
65
ARRAY<double> & coeffs) const;
66
virtual void SetPrimitiveData (ARRAY<double> & coeffs);
67
static Primitive * CreateDefault ();
68
69
virtual Primitive * Copy () const;
70
virtual void Transform (Transformation<3> & trans);
71
72
73
virtual int IsIdentic (const Surface & s2, int & inv, double eps) const;
74
75
///
76
virtual void DefineTangentialPlane (const Point<3> & ap1,
77
const Point<3> & ap2);
78
///
79
virtual void ToPlane (const Point<3> & p3d,
80
Point<2> & pplane, double h,
81
int & zone) const;
82
///
83
virtual void FromPlane (const Point<2> & pplane,
84
Point<3> & p3d,
85
double h) const;
86
///
87
virtual void Project (Point<3> & p) const;
88
89
///
90
virtual INSOLID_TYPE BoxInSolid (const BoxSphere<3> & box) const;
91
92
///
93
inline virtual double CalcFunctionValue (const Point<3> & p3d) const
94
{return cx * p3d(0) + cy * p3d(1) + cz * p3d(2) + c1;}
95
///
96
virtual void CalcGradient (const Point<3> & point,
97
Vec<3> & grad) const;
98
///
99
virtual void CalcHesse (const Point<3> & point,
100
Mat<3> & hesse) const;
101
///
102
virtual double HesseNorm () const;
103
///
104
virtual Point<3> GetSurfacePoint () const;
105
///
106
virtual void GetTriangleApproximation
107
(TriangleApproximation & tas,
108
const Box<3> & boundingbox, double facets) const;
109
110
};
111
112
// typedef Plane Plane;
113
114
115
///
116
class Sphere : public QuadraticSurface
117
{
118
///
119
Point<3> c;
120
///
121
double r;
122
public:
123
///
124
Sphere (const Point<3> & ac, double ar);
125
126
virtual void GetPrimitiveData (const char *& classname,
127
ARRAY<double> & coeffs) const;
128
virtual void SetPrimitiveData (ARRAY<double> & coeffs);
129
static Primitive * CreateDefault ();
130
131
virtual Primitive * Copy () const;
132
virtual void Transform (Transformation<3> & trans);
133
134
135
virtual int IsIdentic (const Surface & s2, int & inv, double eps) const;
136
137
///
138
virtual void DefineTangentialPlane (const Point<3> & ap1,
139
const Point<3> & ap2);
140
///
141
virtual void ToPlane (const Point<3> & p3d,
142
Point<2> & pplane, double h,
143
int & zone) const;
144
///
145
virtual void FromPlane (const Point<2> & pplane,
146
Point<3> & p, double h) const;
147
///
148
virtual void Project (Point<3> & p) const;
149
150
///
151
virtual INSOLID_TYPE BoxInSolid (const BoxSphere<3> & box) const;
152
///
153
virtual double HesseNorm () const;
154
///
155
virtual Point<3> GetSurfacePoint () const;
156
///
157
const Point<3> & Center () const { return c; }
158
///
159
double Radius () const { return r; }
160
161
///
162
virtual void GetTriangleApproximation (TriangleApproximation & tas,
163
const Box<3> & bbox,
164
double facets) const;
165
};
166
167
168
///
169
class Cylinder : public QuadraticSurface
170
{
171
///
172
Point<3> a, b;
173
///
174
double r;
175
///
176
Vec<3> vab;
177
178
public:
179
Cylinder (const Point<3> & aa, const Point<3> & ab, double ar);
180
Cylinder (ARRAY<double> & coeffs);
181
182
virtual void GetPrimitiveData (const char *& classname, ARRAY<double> & coeffs) const;
183
virtual void SetPrimitiveData (ARRAY<double> & coeffs);
184
static Primitive * CreateDefault ();
185
186
virtual Primitive * Copy () const;
187
virtual void Transform (Transformation<3> & trans);
188
189
///
190
virtual int IsIdentic (const Surface & s2, int & inv, double eps) const;
191
///
192
virtual void DefineTangentialPlane (const Point<3> & ap1,
193
const Point<3> & ap2);
194
///
195
virtual void ToPlane (const Point<3> & p,
196
Point<2> & pplane,
197
double h,
198
int & zone) const;
199
///
200
virtual void FromPlane (const Point<2> & pplane,
201
Point<3> & p,
202
double h) const;
203
///
204
virtual void Project (Point<3> & p) const;
205
206
///
207
virtual INSOLID_TYPE BoxInSolid (const BoxSphere<3> & box) const;
208
///
209
virtual double HesseNorm () const;
210
///
211
virtual Point<3> GetSurfacePoint () const;
212
///
213
virtual void GetTriangleApproximation (TriangleApproximation & tas,
214
const Box<3> & bbox,
215
double facets) const;
216
};
217
218
219
220
221
222
///
223
class EllipticCylinder : public QuadraticSurface
224
{
225
private:
226
///
227
Point<3> a;
228
///
229
Vec<3> vl, vs;
230
///
231
Vec<3> vab, t0vec, t1vec;
232
///
233
double vabl, t0, t1;
234
public:
235
///
236
EllipticCylinder (const Point<3> & aa,
237
const Vec<3> & avl, const Vec<3> & avs);
238
239
/*
240
static Primitive * CreateDefault ();
241
virtual void GetPrimitiveData (const char *& classname, ARRAY<double> & coeffs) const;
242
virtual void SetPrimitiveData (ARRAY<double> & coeffs);
243
*/
244
///
245
virtual INSOLID_TYPE BoxInSolid (const BoxSphere<3> & box) const;
246
///
247
virtual double HesseNorm () const;
248
///
249
virtual Point<3> GetSurfacePoint () const;
250
251
virtual void GetTriangleApproximation (TriangleApproximation & tas,
252
const Box<3> & bbox,
253
double facets) const;
254
255
256
virtual double MaxCurvature () const;
257
258
virtual double MaxCurvatureLoc (const Point<3> & /* c */ ,
259
double /* rad */) const;
260
261
262
private:
263
void CalcData();
264
};
265
266
267
268
269
270
271
///
272
class Ellipsoid : public QuadraticSurface
273
{
274
private:
275
///
276
Point<3> a;
277
///
278
Vec<3> v1, v2, v3;
279
///
280
double rmin;
281
public:
282
///
283
Ellipsoid (const Point<3> & aa,
284
const Vec<3> & av1,
285
const Vec<3> & av2,
286
const Vec<3> & av3);
287
///
288
virtual INSOLID_TYPE BoxInSolid (const BoxSphere<3> & box) const;
289
///
290
virtual double HesseNorm () const;
291
///
292
virtual double MaxCurvature () const;
293
///
294
virtual Point<3> GetSurfacePoint () const;
295
296
virtual void GetTriangleApproximation (TriangleApproximation & tas,
297
const Box<3> & bbox,
298
double facets) const;
299
300
private:
301
void CalcData();
302
};
303
304
305
306
307
308
309
310
311
///
312
class Cone : public QuadraticSurface
313
{
314
///
315
Point<3> a, b;
316
///
317
double ra, rb, minr;
318
///
319
Vec<3> vab, t0vec, t1vec;
320
///
321
double vabl, t0, t1;
322
public:
323
///
324
Cone (const Point<3> & aa, const Point<3> & ab, double ara, double arb);
325
///
326
static Primitive * CreateDefault ();
327
virtual void GetPrimitiveData (const char *& classname, ARRAY<double> & coeffs) const;
328
virtual void SetPrimitiveData (ARRAY<double> & coeffs);
329
330
///
331
virtual INSOLID_TYPE BoxInSolid (const BoxSphere<3> & box) const;
332
///
333
virtual double HesseNorm () const;
334
335
virtual double LocH (const Point<3> & p, double x,
336
double c, double hmax) const;
337
338
///
339
virtual Point<3> GetSurfacePoint () const;
340
341
virtual void GetTriangleApproximation (TriangleApproximation & tas,
342
const Box<3> & bbox,
343
double facets) const;
344
345
private:
346
void CalcData();
347
};
348
349
350
351
352
353
354
355
356
/// Torus
357
/// Lorenzo Codecasa ([email protected])
358
/// April 27th, 2005
359
///
360
/// begin...
361
class Torus : public OneSurfacePrimitive
362
{
363
/// center of the torus
364
Point<3> c;
365
/// vector normal to the symmetry plane of the torus
366
Vec<3> n;
367
/// Large radius of the torus
368
double R;
369
/// Small radius of the torus
370
double r;
371
372
public:
373
/// OK
374
Torus (const Point<3> & ac, const Vec<3> & an, double aR, double ar);
375
/// OK
376
const Point<3> & Center () const { return c; }
377
/// OK
378
const Vec<3> & NormalToPlane () const { return n; }
379
/// OK
380
double LargeRadius () const { return R; }
381
/// OK
382
double SmallRadius () const { return r; }
383
/// OK
384
virtual double CalcFunctionValue (const Point<3> & point) const;
385
/// OK
386
virtual void CalcGradient (const Point<3> & point, Vec<3> & grad) const;
387
/// OK
388
virtual void CalcHesse (const Point<3> & point, Mat<3> & hesse) const;
389
/// OK
390
virtual double HesseNorm () const;
391
/// OK
392
virtual Point<3> GetSurfacePoint () const;
393
/// OK
394
virtual void GetPrimitiveData (const char *& classname,
395
ARRAY<double> & coeffs) const;
396
/// OK
397
virtual void SetPrimitiveData (ARRAY<double> & coeffs);
398
/// OK
399
static Primitive * CreateDefault ();
400
/// OK
401
virtual Primitive * Copy () const;
402
/// OK
403
virtual void Transform (Transformation<3> & trans);
404
/// OK
405
virtual int IsIdentic (const Surface & s2, int & inv, double eps) const;
406
/// OK
407
/// virtual void DefineTangentialPlane (const Point<3> & ap1,
408
// const Point<3> & ap2);
409
/// OK
410
/// virtual void ToPlane (const Point<3> & p3d,
411
/// Point<2> & pplane,
412
/// double h, int & zone) const;
413
/// OK
414
/// virtual void FromPlane (const Point<2> & pplane,
415
// Point<3> & p, double h) const;
416
/// OK
417
/// virtual void Project (Point<3> & p) const;
418
/// OK
419
virtual INSOLID_TYPE BoxInSolid (const BoxSphere<3> & box) const;
420
/// OK
421
virtual void GetTriangleApproximation (TriangleApproximation & tas,
422
const Box<3> & bbox,
423
double facets) const;
424
/// OK
425
virtual void Print (ostream & ist) const;
426
/// OK
427
virtual void Read (istream & ist);
428
};
429
430
/// ...end
431
432
433
434
435
436
437
438
439
#endif
440
441