Point Cloud Library (PCL)
1.11.0
pcl
surface
3rdparty
opennurbs
opennurbs_plane.h
1
/* $NoKeywords: $ */
2
/*
3
//
4
// Copyright (c) 1993-2012 Robert McNeel & Associates. All rights reserved.
5
// OpenNURBS, Rhinoceros, and Rhino3D are registered trademarks of Robert
6
// McNeel & Associates.
7
//
8
// THIS SOFTWARE IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY.
9
// ALL IMPLIED WARRANTIES OF FITNESS FOR ANY PARTICULAR PURPOSE AND OF
10
// MERCHANTABILITY ARE HEREBY DISCLAIMED.
11
//
12
// For complete openNURBS copyright information see <http://www.opennurbs.org>.
13
//
14
////////////////////////////////////////////////////////////////
15
*/
16
17
#if !defined(ON_PLANE_INC_)
18
#define ON_PLANE_INC_
19
20
class
ON_CLASS
ON_Plane
21
{
22
public
:
23
24
/*
25
Description:
26
The default constructor creates a plane
27
with orgin=(0,0,0), xaxis=(1,0,0), yaxis=(0,1,0)
28
zaxis=(0,0,1), and equation=(0,0,1,0).
29
*/
30
ON_Plane
();
31
32
/*
33
Description:
34
Construct a plane from a point and normal vector.
35
Parameters:
36
origin - [in] point on the plane
37
normal - [in] non-zero normal to the plane
38
Remarks:
39
origin = point, zaxis = unitized normal, xaxis
40
xaxis set with xaxis.PerpindicularTo(zaxis).
41
See Also:
42
ON_Plane::CreateFromNormal
43
*/
44
ON_Plane
(
45
const
ON_3dPoint
& origin,
46
const
ON_3dVector
& normal
47
);
48
49
/*
50
Description:
51
Construct a plane from a point, and two vectors in
52
the plane.
53
Parameters:
54
origin - [in] point on the plane
55
x_dir - [in] non-zero vector in the plane that
56
determines the xaxis direction.
57
y_dir - [in] non-zero vector not parallel to x_dir
58
that is used to determine the yaxis direction.
59
y_dir does not have to be perpendicular to x_dir.
60
*/
61
ON_Plane
(
62
const
ON_3dPoint
& origin,
63
const
ON_3dVector
& x_dir,
64
const
ON_3dVector
& y_dir
65
);
66
67
/*
68
Description:
69
Construct a plane from three non-colinear points.
70
Parameters:
71
origin - [in] point on the plane
72
x_point - [in] second point in the plane.
73
The xaxis will be parallel to x_point-origin.
74
y_point - [in] third point on the plane that is
75
not colinear with the first two points.
76
yaxis*(y_point-origin) will be > 0.
77
*/
78
ON_Plane
(
79
const
ON_3dPoint
& origin,
80
const
ON_3dPoint
& x_point,
81
const
ON_3dPoint
& y_point
82
);
83
84
/*
85
Description:
86
Construct a plane from an equation.
87
Parameters:
88
equation - [in] an array of 4 doubles with
89
one of equation[0], equation[1], or equation[2]
90
being non-zero.
91
*/
92
ON_Plane
(
93
const
double
equation[4]
94
);
95
96
~
ON_Plane
();
97
98
bool
operator==(
const
ON_Plane
&)
const
;
99
bool
operator!=(
const
ON_Plane
&)
const
;
100
101
/*
102
Description:
103
Create a plane from a point and normal vector.
104
Parameters:
105
origin - [in] point on the plane
106
normal - [in] non-zero normal to the plane
107
Remarks:
108
origin = point, zaxis = unitized normal, xaxis
109
xaxis set with xaxis.PerpindicularTo(zaxis).
110
Returns:
111
true if valid plane is created.
112
*/
113
bool
CreateFromNormal(
114
const
ON_3dPoint
& origin,
115
const
ON_3dVector
& normal
116
);
117
118
/*
119
Description:
120
Construct a plane from a point, and two vectors in
121
the plane.
122
Parameters:
123
origin - [in] point on the plane
124
x_dir - [in] non-zero vector in the plane that
125
determines the xaxis direction.
126
y_dir - [in] non-zero vector not parallel to x_dir
127
that is used to determine the yaxis direction.
128
y_dir does not have to be perpendicular to x_dir.
129
Returns:
130
true if valid plane is created.
131
*/
132
bool
CreateFromFrame(
133
const
ON_3dPoint
& origin,
134
const
ON_3dVector
& x_dir,
135
const
ON_3dVector
& y_dir
136
);
137
138
/*
139
Description:
140
Construct a plane from three non-colinear points.
141
Parameters:
142
origin - [in] point on the plane
143
point_on_x - [in] second point in the plane.
144
The xaxis will be parallel to x_point-origin.
145
point_on - [in] third point on the plane that is
146
not colinear with the first two points.
147
yaxis*(y_point-origin) will be > 0.
148
Returns:
149
true if valid plane is created.
150
*/
151
bool
CreateFromPoints(
152
const
ON_3dPoint
& origin,
153
const
ON_3dPoint
& point_on_x,
154
const
ON_3dPoint
& point_on
155
);
156
157
/*
158
Description:
159
Construct a plane from an equation.
160
Parameters:
161
equation - [in] an array of 4 doubles with
162
one of equation[0], equation[1], or equation[2]
163
being non-zero.
164
Remarks:
165
points on the plane will satisfy
166
x*equation[0] +y*equation[1] + z*equation[2] + equation[3] = 0
167
Returns:
168
true if valid plane is created.
169
*/
170
bool
CreateFromEquation(
171
const
double
equation[4]
172
);
173
174
/*
175
Description:
176
Test plane to see if it is valid.
177
Returns:
178
true if all fields contain reasonable
179
information and equation jibes with point and zaxis.
180
*/
181
bool
IsValid()
const
;
182
183
/*
184
Returns:
185
Plane origin.
186
*/
187
const
ON_3dPoint
& Origin()
const
;
188
189
/*
190
Returns:
191
Plane unit x-axis.
192
*/
193
const
ON_3dVector
& Xaxis()
const
;
194
195
/*
196
Returns:
197
Plane unit y-axis.
198
*/
199
const
ON_3dVector
& Yaxis()
const
;
200
201
/*
202
Returns:
203
Plane unit normal.
204
*/
205
const
ON_3dVector
& Normal()
const
;
206
207
208
/*
209
Description:
210
Set the origin and update the plane equation
211
Parameters:
212
origin - [in] the new origin
213
*/
214
void
SetOrigin(
const
ON_3dPoint
& origin );
215
216
/*
217
Description:
218
Evaluate a point on the plane
219
Parameters:
220
u - [in]
221
v - [in] evaulation parameters
222
Returns:
223
plane.origin + u*plane.xaxis + v*plane.yaxis
224
*/
225
ON_3dPoint
PointAt(
226
double
u,
227
double
v
228
)
const
;
229
230
/*
231
Description:
232
Evaluate a point on the plane
233
Parameters:
234
u - [in]
235
v - [in] evaluation parameters
236
w - [in] elevation parameter
237
Returns:
238
plane.origin + u*plane.xaxis + v*plane.yaxis + z*plane.zaxis
239
*/
240
ON_3dPoint
PointAt(
241
double
u,
242
double
v,
243
double
w
244
)
const
;
245
246
/*
247
Description:
248
Get an isoparameteric line on the plane.
249
Parameters:
250
dir - [in] direction of iso-parametric line
251
0: first parameter varies and second parameter is constant
252
e.g., line(t) = plane(t,c)
253
1: first parameter is constant and second parameter varies
254
e.g., line(t) = plane(c,t)
255
c - [in] value of constant parameter
256
Returns:
257
iso-parametric line
258
*/
259
ON_Line
IsoLine(
260
int
dir,
261
double
c
262
)
const
;
263
264
/*
265
Description:
266
Get signed distance from the plane to a point.
267
Parameters:
268
point - [in]
269
Returns:
270
Signed distance from a point to a plane.
271
Remarks:
272
If the point is on the plane, the distance is 0.
273
If the point is above the plane, the distance is > 0.
274
If the point is below the plane the distance is < 0.
275
The zaxis determines the plane's orientation.
276
*/
277
double
DistanceTo(
278
const
ON_3dPoint
& point
279
)
const
;
280
281
282
bool
GetDistanceToBoundingBox(
283
//returns false if plane has zero length normal
284
const
ON_BoundingBox
&,
// Box
285
286
//output
287
double
* min,
// min signed dist from plane to box
288
double
* max
//max signed dist from plane to box
289
)
const
;
290
291
/*
292
Description:
293
Update the plane equation based on the current values
294
of the origin and zaxis.
295
Returns:
296
true if successful. false if zaxis is zero.
297
Remarks:
298
If you modify a plane's origin or zaxis, call UpdateEquation()
299
to set equation[].
300
*/
301
bool
UpdateEquation();
302
303
/*
304
Description:
305
Get point on plane that is closest to a given point.
306
Parameters:
307
world_point - [in] 3d point
308
u - [out]
309
v - [out] The point ON_Plane::PointAt(*u,*v) is the point
310
on the plane that is closest to world_point.
311
Returns:
312
true if successful.
313
*/
314
bool
ClosestPointTo(
315
ON_3dPoint
world_point,
316
double
* u,
317
double
* v
318
)
const
;
319
320
/*
321
Description:
322
Get point on plane that is closest to a given point.
323
Parameters:
324
point - [in]
325
Returns:
326
A 3d point on the plane that is closest to world_point.
327
*/
328
ON_3dPoint
ClosestPointTo(
329
ON_3dPoint
point
330
)
const
;
331
332
// For intersections see ON_Intersect();
333
334
/*
335
Description:
336
Transform plane.
337
Parameters:
338
xform - [in] transformation to apply to plane
339
Returns:
340
true if successful
341
*/
342
bool
Transform(
343
const
ON_Xform
& xform
344
);
345
346
/*
347
Description:
348
Transform a plane by swapping coordinates.
349
Parameters:
350
i - [in]
351
j - [in] indices of coordinates to swap.
352
0 = x coordinate, 1 = y coordinate, 2 = z coordinate.
353
Returns:
354
true if successful.
355
*/
356
bool
SwapCoordinates(
357
int
i,
358
int
j
359
);
360
361
/*
362
Description:
363
Rotate a plane about its origin.
364
Parameters:
365
sin_angle - [in] sine of rotation angle
366
cos_angle - [in] cosine of rotation angle
367
axis - [in] axis of rotation
368
Returns:
369
true if successful
370
*/
371
bool
Rotate(
372
double
sin_angle,
373
double
cos_angle,
374
const
ON_3dVector
& axis
375
);
376
377
/*
378
Description:
379
Rotate a plane about its origin.
380
Parameters:
381
angle - [in] rotation angle in radians
382
axis - [in] axis of rotation
383
Returns:
384
true if successful
385
*/
386
bool
Rotate(
387
double
angle,
388
const
ON_3dVector
& axis
389
);
390
391
/*
392
Description:
393
Rotate a plane about a point.
394
Parameters:
395
sin_angle - [in] sine of rotation angle
396
cos_angle - [in] cosine of rotation angle
397
axis - [in] axis of rotation
398
center - [in] center of rotation
399
Returns:
400
true if successful
401
*/
402
bool
Rotate(
403
double
sin_angle,
404
double
cos_angle,
405
const
ON_3dVector
& axis,
406
const
ON_3dPoint
& center
407
);
408
409
/*
410
Description:
411
Rotate a plane about a point.
412
Parameters:
413
angle - [in] rotation angle in radians
414
axis - [in] axis of rotation
415
center - [in] center of rotation
416
Returns:
417
true if successful
418
*/
419
bool
Rotate(
420
double
angle,
421
const
ON_3dVector
& axis,
422
const
ON_3dPoint
& center
423
);
424
425
/*
426
Description:
427
Translate a plane.
428
Parameters:
429
delta - [in] translation vector
430
Returns:
431
true if successful
432
*/
433
bool
Translate(
434
const
ON_3dVector
& delta
435
);
436
437
/*
438
Description:
439
Flip plane orientation by swapping x and y axes,
440
reversing the zaxis, and updating the equation.
441
Returns:
442
true if successful
443
*/
444
bool
Flip();
445
446
// world plane coordinate system ON_Plane(ON_origin, ON_xaxis, ON_yaxis);
447
const
static
448
ON_Plane
World_xy
;
449
450
public
:
451
// origin of plane
452
ON_3dPoint
origin
;
453
454
// unit X axis of plane
455
ON_3dVector
xaxis
;
456
457
// unit Y axis of plane
458
ON_3dVector
yaxis
;
459
460
// unit Z axis of plane
461
ON_3dVector
zaxis
;
462
463
// equation of plane
464
ON_PlaneEquation
plane_equation
;
465
//double equation[4];
466
};
467
468
class
ON_CLASS
ON_ClippingPlaneInfo
469
{
470
public
:
471
// C++ defaults for construction, destruction, copy construction
472
// and operator= work fine.
473
474
// A point is visible if m_plane_equation.ValueAt(point) <= 0.
475
// (This is the opposite convention from what OpenGL uses.)
476
ON_PlaneEquation
m_plane_equation
;
477
ON_UUID
m_plane_id
;
478
bool
m_bEnabled
;
479
480
void
Default();
481
bool
Write(
ON_BinaryArchive
& )
const
;
482
bool
Read(
ON_BinaryArchive
& );
483
};
484
485
class
ON_CLASS
ON_ClippingPlane
486
{
487
public
:
488
ON_ClippingPlane
();
489
~
ON_ClippingPlane
();
490
491
void
Default();
492
493
ON_Plane
m_plane
;
494
ON_UuidList
m_viewport_ids
;
//ids of viewports that this clipping plane "clips"
495
ON_UUID
m_plane_id
;
496
bool
m_bEnabled
;
// true if this clipping plane is active
497
498
ON_ClippingPlaneInfo
ClippingPlaneInfo()
const
;
499
500
bool
Read(
class
ON_BinaryArchive
& );
501
bool
Write(
class
ON_BinaryArchive
& )
const
;
502
};
503
504
505
#if defined(ON_DLL_TEMPLATE)
506
507
// This stuff is here because of a limitation in the way Microsoft
508
// handles templates and DLLs. See Microsoft's knowledge base
509
// article ID Q168958 for details.
510
#pragma warning( push )
511
#pragma warning( disable : 4231 )
512
ON_DLL_TEMPLATE
template
class
ON_CLASS
ON_SimpleArray<ON_Plane>
;
513
ON_DLL_TEMPLATE
template
class
ON_CLASS
ON_ClassArray<ON_ClippingPlane>
;
514
ON_DLL_TEMPLATE
template
class
ON_CLASS
ON_SimpleArray<ON_ClippingPlaneInfo>
;
515
#pragma warning( pop )
516
517
#endif
518
519
extern
ON_EXTERN_DECL
const
ON_Plane
ON_xy_plane;
520
extern
ON_EXTERN_DECL
const
ON_Plane
ON_yz_plane;
521
extern
ON_EXTERN_DECL
const
ON_Plane
ON_zx_plane;
522
523
/*
524
Description:
525
Get a convex hull of a set of 3d points.
526
Parameters:
527
points - [in]
528
List of points. This function can handle tens of points
529
but is too slow for hundreds of points.
530
hull -[out]
531
Equations of the sides of the convex hull are appended to
532
this list.
533
A point P is inside the hull if hull[i].ValueAt(P) <= 0 for
534
every plane equation.
535
Returns:
536
Number of equations appended to hull[] array.
537
If 0, then the points are coincident or colinear.
538
If 2, then the points are coplanar and the returned
539
planes are parallel.
540
If >= 4, then the points are in a 3d convex hull.
541
*/
542
ON_DECL
543
int
ON_Get3dConvexHull(
544
const
ON_SimpleArray<ON_3dPoint>
& points,
545
ON_SimpleArray<ON_PlaneEquation>
& hull
546
);
547
548
#endif
ON_3dVector
Definition:
opennurbs_point.h:952
ON_Plane::origin
ON_3dPoint origin
Definition:
opennurbs_plane.h:452
ON_Plane::zaxis
ON_3dVector zaxis
Definition:
opennurbs_plane.h:461
ON_ClassArray
Definition:
opennurbs_array.h:821
ON_ClippingPlaneInfo::m_bEnabled
bool m_bEnabled
Definition:
opennurbs_plane.h:478
ON_ClippingPlane::m_bEnabled
bool m_bEnabled
Definition:
opennurbs_plane.h:496
ON_Xform
Definition:
opennurbs_xform.h:28
ON_SimpleArray
Definition:
opennurbs_array.h:46
ON_BoundingBox
Definition:
opennurbs_bounding_box.h:25
ON_Plane::yaxis
ON_3dVector yaxis
Definition:
opennurbs_plane.h:458
ON_ClippingPlane::m_viewport_ids
ON_UuidList m_viewport_ids
Definition:
opennurbs_plane.h:494
ON_ClippingPlaneInfo
Definition:
opennurbs_plane.h:468
ON_Plane::plane_equation
ON_PlaneEquation plane_equation
Definition:
opennurbs_plane.h:464
ON_ClippingPlane
Definition:
opennurbs_plane.h:485
ON_Line
Definition:
opennurbs_line.h:20
ON_ClippingPlaneInfo::m_plane_equation
ON_PlaneEquation m_plane_equation
Definition:
opennurbs_plane.h:476
ON_ClippingPlane::m_plane
ON_Plane m_plane
Definition:
opennurbs_plane.h:493
ON_Plane
Definition:
opennurbs_plane.h:20
ON_Plane::World_xy
const static ON_Plane World_xy
Definition:
opennurbs_plane.h:448
ON_BinaryArchive
Definition:
opennurbs_archive.h:731
ON_3dPoint
Definition:
opennurbs_point.h:418
ON_Plane::xaxis
ON_3dVector xaxis
Definition:
opennurbs_plane.h:455
ON_UuidList
Definition:
opennurbs_array.h:1202
ON_ClippingPlaneInfo::m_plane_id
ON_UUID m_plane_id
Definition:
opennurbs_plane.h:477
ON_UUID
Definition:
opennurbs_uuid.h:31
ON_PlaneEquation
Definition:
opennurbs_point.h:1192
ON_ClippingPlane::m_plane_id
ON_UUID m_plane_id
Definition:
opennurbs_plane.h:495