Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
ElmerCSC
GitHub Repository: ElmerCSC/elmerfem
Path: blob/devel/ElmerGUI/netgen/libsrc/gprim/geom3d.hpp
3206 views
1
#ifndef FILE_GEOM3D
2
#define FILE_GEOM3D
3
4
/* *************************************************************************/
5
/* File: geom3d.hh */
6
/* Author: Joachim Schoeberl */
7
/* Date: 5. Aug. 95 */
8
/* *************************************************************************/
9
10
11
12
13
extern void MyError (const char * ch);
14
15
class Point3d;
16
class Vec3d;
17
18
inline Vec3d operator- (const Point3d & p1, const Point3d & p2);
19
inline Point3d operator- (const Point3d & p1, const Vec3d & v);
20
inline Point3d operator+ (const Point3d & p1, const Vec3d & v);
21
Point3d & Add (double d, const Vec3d & v);
22
Point3d & Add2 (double d, const Vec3d & v,
23
double d2, const Vec3d & v2);
24
inline Point3d Center (const Point3d & p1, const Point3d & p2);
25
inline Point3d Center (const Point3d & p1, const Point3d & p2, const Point3d & p3);
26
inline Point3d Center (const Point3d & p1, const Point3d & p2,
27
const Point3d & p3, const Point3d & p4);
28
ostream & operator<<(ostream & s, const Point3d & p);
29
inline Vec3d operator- (const Vec3d & p1, const Vec3d & v);
30
inline Vec3d operator+ (const Vec3d & p1, const Vec3d & v);
31
inline Vec3d operator* (double scal, const Vec3d & v);
32
inline double operator* (const Vec3d & v1, const Vec3d & v2);
33
inline Vec3d Cross (const Vec3d & v1, const Vec3d & v2);
34
inline void Cross (const Vec3d & v1, const Vec3d & v2, Vec3d & prod);
35
double Angle (const Vec3d & v);
36
double FastAngle (const Vec3d & v);
37
double Angle (const Vec3d & v1, const Vec3d & v2);
38
double FastAngle (const Vec3d & v1, const Vec3d & v2);
39
ostream & operator<<(ostream & s, const Vec3d & v);
40
void Transpose (Vec3d & v1, Vec3d & v2, Vec3d & v3);
41
int SolveLinearSystem (const Vec3d & col1,
42
const Vec3d & col2,
43
const Vec3d & col3,
44
const Vec3d & rhs,
45
Vec3d & sol);
46
int SolveLinearSystemLS (const Vec3d & col1,
47
const Vec3d & col2,
48
const Vec2d & rhs,
49
Vec3d & sol);
50
int SolveLinearSystemLS2 (const Vec3d & col1,
51
const Vec3d & col2,
52
const Vec2d & rhs,
53
Vec3d & sol,
54
double & x, double & y);
55
int PseudoInverse (const Vec3d & col1,
56
const Vec3d & col2,
57
Vec3d & inv1,
58
Vec3d & inv2);
59
double Determinant (const Vec3d & col1,
60
const Vec3d & col2,
61
const Vec3d & col3);
62
63
/// Point in R3
64
class Point3d
65
{
66
protected:
67
///
68
double x[3];
69
70
public:
71
///
72
Point3d () { x[0] = x[1] = x[2] = 0; }
73
///
74
Point3d(double ax, double ay, double az)
75
{ x[0] = ax; x[1] = ay; x[2] = az; }
76
///
77
Point3d(double ax[3])
78
{ x[0] = ax[0]; x[1] = ax[1]; x[2] = ax[2]; }
79
80
///
81
Point3d(const Point3d & p2)
82
{ x[0] = p2.x[0]; x[1] = p2.x[1]; x[2] = p2.x[2]; }
83
84
Point3d (const Point<3> & p2)
85
{
86
for (int i = 0; i < 3; i++)
87
x[i] = p2(i);
88
}
89
90
///
91
Point3d & operator= (const Point3d & p2)
92
{ x[0] = p2.x[0]; x[1] = p2.x[1]; x[2] = p2.x[2]; return *this; }
93
94
///
95
int operator== (const Point3d& p) const
96
{ return (x[0] == p.x[0] && x[1] == p.x[1] && x[2] == p.x[2]); }
97
98
///
99
double & X() { return x[0]; }
100
///
101
double & Y() { return x[1]; }
102
///
103
double & Z() { return x[2]; }
104
///
105
double X() const { return x[0]; }
106
///
107
double Y() const { return x[1]; }
108
///
109
double Z() const { return x[2]; }
110
///
111
double & X(int i) { return x[i-1]; }
112
///
113
double X(int i) const { return x[i-1]; }
114
///
115
const Point3d & SetToMin (const Point3d & p2)
116
{
117
if (p2.x[0] < x[0]) x[0] = p2.x[0];
118
if (p2.x[1] < x[1]) x[1] = p2.x[1];
119
if (p2.x[2] < x[2]) x[2] = p2.x[2];
120
return *this;
121
}
122
123
///
124
const Point3d & SetToMax (const Point3d & p2)
125
{
126
if (p2.x[0] > x[0]) x[0] = p2.x[0];
127
if (p2.x[1] > x[1]) x[1] = p2.x[1];
128
if (p2.x[2] > x[2]) x[2] = p2.x[2];
129
return *this;
130
}
131
132
///
133
friend inline Vec3d operator- (const Point3d & p1, const Point3d & p2);
134
///
135
friend inline Point3d operator- (const Point3d & p1, const Vec3d & v);
136
///
137
friend inline Point3d operator+ (const Point3d & p1, const Vec3d & v);
138
///
139
inline Point3d & operator+= (const Vec3d & v);
140
inline Point3d & operator-= (const Vec3d & v);
141
///
142
inline Point3d & Add (double d, const Vec3d & v);
143
///
144
inline Point3d & Add2 (double d, const Vec3d & v,
145
double d2, const Vec3d & v2);
146
///
147
friend inline double Dist (const Point3d & p1, const Point3d & p2)
148
{ return sqrt ( (p1.x[0]-p2.x[0]) * (p1.x[0]-p2.x[0]) +
149
(p1.x[1]-p2.x[1]) * (p1.x[1]-p2.x[1]) +
150
(p1.x[2]-p2.x[2]) * (p1.x[2]-p2.x[2])); }
151
///
152
inline friend double Dist2 (const Point3d & p1, const Point3d & p2)
153
{ return ( (p1.x[0]-p2.x[0]) * (p1.x[0]-p2.x[0]) +
154
(p1.x[1]-p2.x[1]) * (p1.x[1]-p2.x[1]) +
155
(p1.x[2]-p2.x[2]) * (p1.x[2]-p2.x[2])); }
156
157
///
158
friend inline Point3d Center (const Point3d & p1, const Point3d & p2);
159
///
160
friend inline Point3d Center (const Point3d & p1, const Point3d & p2, const Point3d & p3);
161
///
162
friend inline Point3d Center (const Point3d & p1, const Point3d & p2,
163
const Point3d & p3, const Point3d & p4);
164
///
165
friend ostream & operator<<(ostream & s, const Point3d & p);
166
167
///
168
friend class Vec3d;
169
///
170
friend class Box3d;
171
172
173
operator Point<3> () const
174
{
175
return Point<3> (x[0], x[1], x[2]);
176
}
177
};
178
179
180
///
181
class Vec3d
182
{
183
protected:
184
///
185
double x[3];
186
187
public:
188
///
189
inline Vec3d() { x[0] = x[1] = x[2] = 0; }
190
///
191
inline Vec3d(double ax, double ay, double az)
192
{ x[0] = ax; x[1] = ay; x[2] = az; }
193
///
194
Vec3d(double ax[3])
195
{ x[0] = ax[0]; x[1] = ax[1]; x[2] = ax[2]; }
196
///
197
inline Vec3d(const Vec3d & v2)
198
{ x[0] = v2.x[0]; x[1] = v2.x[1]; x[2] = v2.x[2]; }
199
///
200
inline Vec3d(const Point3d & p1, const Point3d & p2)
201
{
202
x[0] = p2.x[0] - p1.x[0];
203
x[1] = p2.x[1] - p1.x[1];
204
x[2] = p2.x[2] - p1.x[2];
205
}
206
///
207
inline Vec3d(const Point3d & p1)
208
{
209
x[0] = p1.x[0];
210
x[1] = p1.x[1];
211
x[2] = p1.x[2];
212
}
213
214
Vec3d (const Vec<3> & v2)
215
{
216
for (int i = 0; i < 3; i++)
217
x[i] = v2(i);
218
}
219
220
operator Vec<3> () const
221
{
222
return Vec<3> (x[0], x[1], x[2]);
223
}
224
225
226
Vec3d & operator= (const Vec3d & v2)
227
{ x[0] = v2.x[0]; x[1] = v2.x[1]; x[2] = v2.x[2]; return *this; }
228
///
229
Vec3d & operator= (double val)
230
{ x[0] = x[1] = x[2] = val; return *this; }
231
///
232
double & X() { return x[0]; }
233
///
234
double & Y() { return x[1]; }
235
///
236
double & Z() { return x[2]; }
237
///
238
double & X(int i) { return x[i-1]; }
239
240
///
241
double X() const { return x[0]; }
242
///
243
double Y() const { return x[1]; }
244
///
245
double Z() const { return x[2]; }
246
///
247
double X(int i) const { return x[i-1]; }
248
249
///
250
double Length() const
251
{ return sqrt (x[0] * x[0] + x[1] * x[1] + x[2] * x[2]); }
252
///
253
double Length2() const
254
{ return x[0] * x[0] + x[1] * x[1] + x[2] * x[2]; }
255
256
///
257
Vec3d & operator+= (const Vec3d & v2);
258
///
259
Vec3d & operator-= (const Vec3d & v2);
260
///
261
Vec3d & operator*= (double s);
262
///
263
Vec3d & operator/= (double s);
264
///
265
inline Vec3d & Add (double d, const Vec3d & v);
266
///
267
inline Vec3d & Add2 (double d, const Vec3d & v,
268
double d2, const Vec3d & v2);
269
270
///
271
friend inline Vec3d operator- (const Point3d & p1, const Point3d & p2);
272
///
273
friend inline Point3d operator- (const Point3d & p1, const Vec3d & v);
274
///
275
friend inline Point3d operator+ (const Point3d & p1, const Vec3d & v);
276
///
277
friend inline Vec3d operator- (const Vec3d & p1, const Vec3d & v);
278
///
279
friend inline Vec3d operator+ (const Vec3d & p1, const Vec3d & v);
280
///
281
friend inline Vec3d operator* (double scal, const Vec3d & v);
282
283
///
284
friend inline double operator* (const Vec3d & v1, const Vec3d & v2);
285
///
286
friend inline Vec3d Cross (const Vec3d & v1, const Vec3d & v2);
287
///
288
friend inline void Cross (const Vec3d & v1, const Vec3d & v2, Vec3d & prod);
289
290
/// Returns one normal-vector to n
291
void GetNormal (Vec3d & n) const;
292
///
293
friend double Angle (const Vec3d & v);
294
///
295
friend double FastAngle (const Vec3d & v);
296
///
297
friend double Angle (const Vec3d & v1, const Vec3d & v2);
298
///
299
friend double FastAngle (const Vec3d & v1, const Vec3d & v2);
300
301
void Normalize()
302
{
303
double len = (x[0] * x[0] + x[1] * x[1] + x[2] * x[2]);
304
if (len == 0) return;
305
len = sqrt (len);
306
x[0] /= len; x[1] /= len; x[2] /= len;
307
}
308
309
///
310
friend ostream & operator<<(ostream & s, const Vec3d & v);
311
312
///
313
friend class Point3d;
314
friend void Transpose (Vec3d & v1, Vec3d & v2, Vec3d & v3);
315
friend int SolveLinearSystem (const Vec3d & col1,
316
const Vec3d & col2,
317
const Vec3d & col3,
318
const Vec3d & rhs,
319
Vec3d & sol);
320
friend int SolveLinearSystemLS (const Vec3d & col1,
321
const Vec3d & col2,
322
const Vec2d & rhs,
323
Vec3d & sol);
324
friend int SolveLinearSystemLS2 (const Vec3d & col1,
325
const Vec3d & col2,
326
const Vec2d & rhs,
327
Vec3d & sol,
328
double & x, double & y);
329
friend int PseudoInverse (const Vec3d & col1,
330
const Vec3d & col2,
331
Vec3d & inv1,
332
Vec3d & inv2);
333
friend double Determinant (const Vec3d & col1,
334
const Vec3d & col2,
335
const Vec3d & col3);
336
};
337
338
339
340
class QuadraticFunction3d
341
{
342
double c0, cx, cy, cz;
343
double cxx, cyy, czz, cxy, cxz, cyz;
344
345
public:
346
QuadraticFunction3d (const Point3d & p, const Vec3d & v);
347
double Eval (const Point3d & p)
348
{
349
return
350
c0
351
+ p.X() * (cx + cxx * p.X() + cxy * p.Y() + cxz * p.Z())
352
+ p.Y() * (cy + cyy * p.Y() + cyz * p.Z())
353
+ p.Z() * (cz + czz * p.Z());
354
}
355
};
356
357
358
359
inline Point3d Center (const Point3d & p1, const Point3d & p2)
360
{
361
return Point3d (0.5 * (p1.x[0] + p2.x[0]),
362
0.5 * (p1.x[1] + p2.x[1]),
363
0.5 * (p1.x[2] + p2.x[2]));
364
}
365
366
367
inline Point3d Center (const Point3d & p1, const Point3d & p2,
368
const Point3d & p3)
369
{
370
return Point3d (1.0/3.0 * (p1.x[0] + p2.x[0] + p3.x[0]),
371
1.0/3.0 * (p1.x[1] + p2.x[1] + p3.x[1]),
372
1.0/3.0 * (p1.x[2] + p2.x[2] + p3.x[2]));
373
}
374
375
inline Point3d Center (const Point3d & p1, const Point3d & p2,
376
const Point3d & p3, const Point3d & p4)
377
{
378
return Point3d (0.25 * (p1.x[0] + p2.x[0] + p3.x[0] + p4.x[0]),
379
0.25 * (p1.x[1] + p2.x[1] + p3.x[1] + p4.x[1]),
380
0.25 * (p1.x[2] + p2.x[2] + p3.x[2] + p4.x[2]));
381
}
382
383
384
385
inline Vec3d & Vec3d :: operator+= (const Vec3d & v2)
386
{
387
x[0] += v2.x[0];
388
x[1] += v2.x[1];
389
x[2] += v2.x[2];
390
return *this;
391
}
392
393
inline Vec3d & Vec3d :: operator-= (const Vec3d & v2)
394
{
395
x[0] -= v2.x[0];
396
x[1] -= v2.x[1];
397
x[2] -= v2.x[2];
398
return *this;
399
}
400
401
402
inline Vec3d & Vec3d :: operator*= (double s)
403
{
404
x[0] *= s;
405
x[1] *= s;
406
x[2] *= s;
407
return *this;
408
}
409
410
411
inline Vec3d & Vec3d :: operator/= (double s)
412
{
413
if (s != 0)
414
{
415
x[0] /= s;
416
x[1] /= s;
417
x[2] /= s;
418
}
419
#ifdef DEBUG
420
else
421
{
422
cerr << "Vec div by 0, v = " << (*this) << endl;
423
// MyError ("Vec3d::operator /=: Divisioin by zero");
424
}
425
#endif
426
return *this;
427
}
428
429
inline Vec3d & Vec3d::Add (double d, const Vec3d & v)
430
{
431
x[0] += d * v.x[0];
432
x[1] += d * v.x[1];
433
x[2] += d * v.x[2];
434
return *this;
435
}
436
437
inline Vec3d & Vec3d::Add2 (double d, const Vec3d & v,
438
double d2, const Vec3d & v2)
439
{
440
x[0] += d * v.x[0] + d2 * v2.x[0];
441
x[1] += d * v.x[1] + d2 * v2.x[1];
442
x[2] += d * v.x[2] + d2 * v2.x[2];
443
return *this;
444
}
445
446
447
448
449
450
451
452
453
inline Vec3d operator- (const Point3d & p1, const Point3d & p2)
454
{
455
return Vec3d (p1.x[0] - p2.x[0], p1.x[1] - p2.x[1],p1.x[2] - p2.x[2]);
456
}
457
458
459
inline Point3d operator- (const Point3d & p1, const Vec3d & v)
460
{
461
return Point3d (p1.x[0] - v.x[0], p1.x[1] - v.x[1],p1.x[2] - v.x[2]);
462
}
463
464
465
inline Point3d operator+ (const Point3d & p1, const Vec3d & v)
466
{
467
return Point3d (p1.x[0] + v.x[0], p1.x[1] + v.x[1],p1.x[2] + v.x[2]);
468
}
469
470
inline Point3d & Point3d::operator+= (const Vec3d & v)
471
{
472
x[0] += v.x[0];
473
x[1] += v.x[1];
474
x[2] += v.x[2];
475
return *this;
476
}
477
478
inline Point3d & Point3d::operator-= (const Vec3d & v)
479
{
480
x[0] -= v.x[0];
481
x[1] -= v.x[1];
482
x[2] -= v.x[2];
483
return *this;
484
}
485
486
inline Point3d & Point3d::Add (double d, const Vec3d & v)
487
{
488
x[0] += d * v.x[0];
489
x[1] += d * v.x[1];
490
x[2] += d * v.x[2];
491
return *this;
492
}
493
494
inline Point3d & Point3d::Add2 (double d, const Vec3d & v,
495
double d2, const Vec3d & v2)
496
{
497
x[0] += d * v.x[0] + d2 * v2.x[0];
498
x[1] += d * v.x[1] + d2 * v2.x[1];
499
x[2] += d * v.x[2] + d2 * v2.x[2];
500
return *this;
501
}
502
503
504
inline Vec3d operator- (const Vec3d & v1, const Vec3d & v2)
505
{
506
return Vec3d (v1.x[0] - v2.x[0], v1.x[1] - v2.x[1],v1.x[2] - v2.x[2]);
507
}
508
509
510
inline Vec3d operator+ (const Vec3d & v1, const Vec3d & v2)
511
{
512
return Vec3d (v1.x[0] + v2.x[0], v1.x[1] + v2.x[1],v1.x[2] + v2.x[2]);
513
}
514
515
516
inline Vec3d operator* (double scal, const Vec3d & v)
517
{
518
return Vec3d (scal * v.x[0], scal * v.x[1], scal * v.x[2]);
519
}
520
521
522
523
inline double operator* (const Vec3d & v1, const Vec3d & v2)
524
{
525
return v1.x[0] * v2.x[0] + v1.x[1] * v2.x[1] + v1.x[2] * v2.x[2];
526
}
527
528
529
530
inline Vec3d Cross (const Vec3d & v1, const Vec3d & v2)
531
{
532
return Vec3d
533
( v1.x[1] * v2.x[2] - v1.x[2] * v2.x[1],
534
v1.x[2] * v2.x[0] - v1.x[0] * v2.x[2],
535
v1.x[0] * v2.x[1] - v1.x[1] * v2.x[0]);
536
}
537
538
inline void Cross (const Vec3d & v1, const Vec3d & v2, Vec3d & prod)
539
{
540
prod.x[0] = v1.x[1] * v2.x[2] - v1.x[2] * v2.x[1];
541
prod.x[1] = v1.x[2] * v2.x[0] - v1.x[0] * v2.x[2];
542
prod.x[2] = v1.x[0] * v2.x[1] - v1.x[1] * v2.x[0];
543
}
544
545
inline double Determinant (const Vec3d & col1,
546
const Vec3d & col2,
547
const Vec3d & col3)
548
{
549
return
550
col1.x[0] * ( col2.x[1] * col3.x[2] - col2.x[2] * col3.x[1]) +
551
col1.x[1] * ( col2.x[2] * col3.x[0] - col2.x[0] * col3.x[2]) +
552
col1.x[2] * ( col2.x[0] * col3.x[1] - col2.x[1] * col3.x[0]);
553
}
554
555
556
///
557
class Box3d
558
{
559
protected:
560
///
561
double minx[3], maxx[3];
562
563
public:
564
///
565
Box3d () { };
566
///
567
Box3d ( double aminx, double amaxx,
568
double aminy, double amaxy,
569
double aminz, double amaxz );
570
///
571
Box3d ( const Box3d & b2 );
572
///
573
Box3d (const Point3d& p1, const Point3d& p2);
574
///
575
Box3d (const Box<3> & b2);
576
///
577
double MinX () const { return minx[0]; }
578
///
579
double MaxX () const { return maxx[0]; }
580
///
581
double MinY () const { return minx[1]; }
582
///
583
double MaxY () const { return maxx[1]; }
584
///
585
double MinZ () const { return minx[2]; }
586
///
587
double MaxZ () const { return maxx[2]; }
588
589
///
590
double Mini (int i) const { return minx[i-1]; }
591
///
592
double Maxi (int i) const { return maxx[i-1]; }
593
594
///
595
Point3d PMin () const { return Point3d(minx[0], minx[1], minx[2]); }
596
///
597
Point3d PMax () const { return Point3d(maxx[0], maxx[1], maxx[2]); }
598
599
///
600
void GetPointNr (int i, Point3d & point) const;
601
/// increase Box at each side with dist
602
void Increase (double dist);
603
/// increase Box by factor rel
604
void IncreaseRel (double rel);
605
/// return 1 if closures are intersecting
606
int Intersect (const Box3d & box2) const
607
{
608
if (minx[0] > box2.maxx[0] || maxx[0] < box2.minx[0] ||
609
minx[1] > box2.maxx[1] || maxx[1] < box2.minx[1] ||
610
minx[2] > box2.maxx[2] || maxx[2] < box2.minx[2])
611
return 0;
612
return 1;
613
}
614
/// return 1 if point p in closure
615
int IsIn (const Point3d & p) const
616
{
617
if (minx[0] <= p.x[0] && maxx[0] >= p.x[0] &&
618
minx[1] <= p.x[1] && maxx[1] >= p.x[1] &&
619
minx[2] <= p.x[2] && maxx[2] >= p.x[2])
620
return 1;
621
return 0;
622
}
623
///
624
inline void SetPoint (const Point3d & p)
625
{
626
minx[0] = maxx[0] = p.X();
627
minx[1] = maxx[1] = p.Y();
628
minx[2] = maxx[2] = p.Z();
629
}
630
631
///
632
inline void AddPoint (const Point3d & p)
633
{
634
if (p.x[0] < minx[0]) minx[0] = p.x[0];
635
if (p.x[0] > maxx[0]) maxx[0] = p.x[0];
636
if (p.x[1] < minx[1]) minx[1] = p.x[1];
637
if (p.x[1] > maxx[1]) maxx[1] = p.x[1];
638
if (p.x[2] < minx[2]) minx[2] = p.x[2];
639
if (p.x[2] > maxx[2]) maxx[2] = p.x[2];
640
}
641
642
///
643
const Box3d& operator+=(const Box3d& b);
644
645
///
646
Point3d MaxCoords() const;
647
///
648
Point3d MinCoords() const;
649
650
/// Make a negative sized box;
651
// void CreateNegMinMaxBox();
652
653
///
654
Point3d CalcCenter () const { return Point3d(0.5*(minx[0] + maxx[0]),
655
0.5*(minx[1] + maxx[1]),
656
0.5*(minx[2] + maxx[2])); }
657
///
658
double CalcDiam () const { return sqrt(sqr(maxx[0]-minx[0])+
659
sqr(maxx[1]-minx[1])+
660
sqr(maxx[2]-minx[2])); }
661
662
///
663
void WriteData(ofstream& fout) const;
664
///
665
void ReadData(ifstream& fin);
666
};
667
668
669
class Box3dSphere : public Box3d
670
{
671
protected:
672
///
673
double diam, inner;
674
///
675
Point3d c;
676
public:
677
///
678
Box3dSphere () { };
679
///
680
Box3dSphere ( double aminx, double amaxx,
681
double aminy, double amaxy,
682
double aminz, double amaxz);
683
///
684
const Point3d & Center () const { return c; }
685
686
///
687
double Diam () const { return diam; }
688
///
689
double Inner () const { return inner; }
690
///
691
void GetSubBox (int i, Box3dSphere & sbox) const;
692
693
// private:
694
///
695
void CalcDiamCenter ();
696
};
697
698
699
700
701
///
702
class referencetransform
703
{
704
///
705
Vec3d ex, ey, ez;
706
///
707
Vec3d exh, eyh, ezh;
708
///
709
Vec3d ex_h, ey_h, ez_h;
710
///
711
Point3d rp;
712
///
713
double h;
714
715
public:
716
717
///
718
void Set (const Point3d & p1, const Point3d & p2,
719
const Point3d & p3, double ah);
720
721
///
722
void ToPlain (const Point3d & p, Point3d & pp) const;
723
///
724
void ToPlain (const ARRAY<Point3d> & p, ARRAY<Point3d> & pp) const;
725
///
726
void FromPlain (const Point3d & pp, Point3d & p) const;
727
};
728
729
730
731
#endif
732
733