Point Cloud Library (PCL)
1.9.1-dev
pcl
surface
3rdparty
opennurbs
opennurbs_circle.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_CIRCLE_INC_)
18
#define ON_CIRCLE_INC_
19
20
class
ON_NurbsCurve
;
21
22
/*
23
Description:
24
ON_Circle is a circle in 3d. The cirle is represented by a radius and an
25
orthonormal frame of the plane containing the circle, with origin at the center.
26
27
An Is_Valid() circle has positive radius and an Is_ Valid() plane defining the frame.
28
29
The circle is parameterized by radians from 0 to 2 Pi given by
30
t -> center + cos(t)*radius*xaxis + sin(t)*radius*yaxis
31
where center, xaxis and yaxis define the orthonormal frame of the circle's plane.
32
*/
33
class
ON_CLASS
ON_Circle
34
{
35
public
:
36
// Creates a radius one circle with center (0,0,0)
37
// in the world XY plane
38
ON_Circle
();
39
40
// Creates a circle in the plane with center at
41
// plane.origin.
42
ON_Circle
(
43
const
ON_Plane
& plane,
44
double
radius
45
);
46
47
// Creates a circle parallel to the world XY plane
48
// with given center and radius
49
ON_Circle
(
50
const
ON_3dPoint
& center,
51
double
radius
52
);
53
54
// Creates a circle parallel to the plane
55
// with given center and radius.
56
ON_Circle
(
57
const
ON_Plane
& plane,
58
const
ON_3dPoint
& center,
59
double
radius
60
);
61
62
// Create a circle through three 2d points.
63
// The start/end of the circle is at point P.
64
ON_Circle
(
// circle through 3 2d points
65
const
ON_2dPoint
& P,
66
const
ON_2dPoint
& Q,
67
const
ON_2dPoint
& R
68
);
69
70
// Create a circle through three 3d points.
71
// The start/end of the circle is at point P.
72
ON_Circle
(
73
const
ON_3dPoint
& P,
74
const
ON_3dPoint
& Q,
75
const
ON_3dPoint
& R
76
);
77
78
~
ON_Circle
();
79
80
// Creates a circle in the plane with center at
81
// plane.origin.
82
bool
Create(
83
const
ON_Plane
& plane,
84
double
radius
85
);
86
87
// Creates a circle parallel to the world XY plane
88
// with given center and radius
89
bool
Create(
90
const
ON_3dPoint
& center,
91
double
radius
92
);
93
94
// Creates a circle parallel to the plane
95
// with given centr and radius.
96
bool
Create(
97
const
ON_Plane
& plane,
98
const
ON_3dPoint
& center,
99
double
radius
100
);
101
102
// Create a circle through three 2d points.
103
// The start/end of the circle is at point P.
104
bool
Create(
// circle through 3 2d points
105
const
ON_2dPoint
& P,
106
const
ON_2dPoint
& Q,
107
const
ON_2dPoint
& R
108
);
109
110
// Create a circle through three 3d points.
111
// The start/end of the circle is at point P.
112
bool
Create(
113
const
ON_3dPoint
& P,
114
const
ON_3dPoint
& Q,
115
const
ON_3dPoint
& R
116
);
117
118
// Create a circle from two 2d points and a
119
// tangent at the first point.
120
// The start/end of the circle is at point P.
121
bool
Create(
122
const
ON_2dPoint
& P,
123
const
ON_2dVector
& tangent_at_P,
124
const
ON_2dPoint
& Q
125
);
126
127
// Create a circle from two 3d points and a
128
// tangent at the first point.
129
// The start/end of the circle is at point P.
130
bool
Create(
131
const
ON_3dPoint
& P,
132
const
ON_3dVector
& tangent_at_P,
133
const
ON_3dPoint
& Q
134
);
135
136
// A Valid circle has m_radius>0 and m_plane.IsValid().
137
bool
IsValid()
const
;
138
139
//bool UpdatePoints(); // sets m_point[] to have valid points
140
141
bool
IsInPlane(
const
ON_Plane
&,
double
= ON_ZERO_TOLERANCE )
const
;
142
143
double
Radius()
const
;
144
double
Diameter()
const
;
145
double
Circumference()
const
;
146
const
ON_3dPoint
& Center()
const
;
147
const
ON_3dVector
& Normal()
const
;
148
const
ON_Plane
& Plane()
const
;
// plane containing circle
149
150
ON_BoundingBox
BoundingBox()
const
;
151
152
/*
153
Description:
154
Get tight bounding box.
155
Parameters:
156
tight_bbox - [in/out] tight bounding box
157
bGrowBox -[in] (default=false)
158
If true and the input tight_bbox is valid, then returned
159
tight_bbox is the union of the input tight_bbox and the
160
arc's tight bounding box.
161
xform -[in] (default=NULL)
162
If not NULL, the tight bounding box of the transformed
163
arc is calculated. The arc is not modified.
164
Returns:
165
True if a valid tight_bbox is returned.
166
*/
167
bool
GetTightBoundingBox(
168
ON_BoundingBox
& tight_bbox,
169
int
bGrowBox =
false
,
170
const
ON_Xform
* xform = 0
171
)
const
;
172
173
bool
Transform(
const
ON_Xform
& );
174
175
// Circles use trigonometric parameterization
176
// t -> center + cos(t)*radius*xaxis + sin(t)*radius*yaxis
177
ON_3dPoint
PointAt(
178
double
// evaluation parameter
179
)
const
;
180
ON_3dVector
DerivativeAt(
181
int
,
// derivative (>=0)
182
double
// evaluation parameter
183
)
const
;
184
185
ON_3dVector
TangentAt(
double
)
const
;
186
187
// returns parameters of point on circle that is closest to given point
188
bool
ClosestPointTo(
189
const
ON_3dPoint
& point,
190
double
* t
191
)
const
;
192
193
// returns point on circle that is closest to given point
194
ON_3dPoint
ClosestPointTo(
195
const
ON_3dPoint
& point
196
)
const
;
197
198
// evaluate circle's implicit equation in plane
199
double
EquationAt(
const
ON_2dPoint
& plane_point )
const
;
200
201
ON_2dVector
GradientAt(
const
ON_2dPoint
& plane_point )
const
;
202
203
// rotate circle about its center
204
bool
Rotate(
205
double
sin_angle,
206
double
cos_angle,
207
const
ON_3dVector
& axis_of_rotation
208
);
209
210
bool
Rotate(
211
double
angle_in_radians,
212
const
ON_3dVector
& axis_of_rotation
213
);
214
215
// rotate circle about a point and axis
216
bool
Rotate(
217
double
sin_angle,
218
double
cos_angle,
219
const
ON_3dVector
& axis_of_rotation,
220
const
ON_3dPoint
& center_of_rotation
221
);
222
223
bool
Rotate(
224
double
angle_in_radians,
225
const
ON_3dVector
& axis_of_rotation,
226
const
ON_3dPoint
& center_of_rotation
227
);
228
229
bool
Translate(
230
const
ON_3dVector
& delta
231
);
232
233
bool
Reverse();
234
235
// Description:
236
// Get a four span rational degree 2 NURBS circle representation
237
// of the circle.
238
// Returns:
239
// 2 for success, 0 for failure
240
// Remarks:
241
// Note that the parameterization of NURBS curve
242
// does not match circle's transcendental paramaterization.
243
// Use ON_Circle::GetRadianFromNurbFormParameter() and
244
// ON_Circle::GetParameterFromRadian() to convert between
245
// the NURBS curve parameter and the transcendental parameter.
246
int
GetNurbForm(
247
ON_NurbsCurve
& nurbs_curve
248
)
const
;
249
250
/*
251
Description:
252
Convert a NURBS curve circle parameter to a circle radians parameter.
253
Parameters:
254
nurbs_parameter - [in]
255
circle_radians_parameter - [out]
256
Example:
257
258
ON_Circle circle = ...;
259
double nurbs_t = 1.2345; // some number in interval (0,2.0*ON_PI).
260
double circle_t;
261
circle.GetRadianFromNurbFormParameter( nurbs_t, &circle_t );
262
263
ON_NurbsCurve nurbs_curve;
264
circle.GetNurbsForm( nurbs_curve );
265
circle_pt = circle.PointAt(circle_t);
266
nurbs_pt = nurbs_curve.PointAt(nurbs_t);
267
// circle_pt and nurbs_pt will be the same
268
269
Remarks:
270
The NURBS curve parameter is with respect to the NURBS curve
271
created by ON_Circle::GetNurbForm. At nurbs parameter values of
272
0.0, 0.5*ON_PI, ON_PI, 1.5*ON_PI, and 2.0*ON_PI, the nurbs
273
parameter and radian parameter are the same. At all other
274
values the nurbs and radian parameter values are different.
275
See Also:
276
ON_Circle::GetNurbFormParameterFromRadian
277
*/
278
bool
GetRadianFromNurbFormParameter(
279
double
nurbs_parameter,
280
double
* circle_radians_parameter
281
)
const
;
282
283
/*
284
Description:
285
Convert a circle radians parameter to a NURBS curve circle parameter.
286
Parameters:
287
circle_radians_parameter - [in] 0.0 to 2.0*ON_PI
288
nurbs_parameter - [out]
289
Example:
290
291
ON_Circle circle = ...;
292
double circle_t = 1.2345; // some number in interval (0,2.0*ON_PI).
293
double nurbs_t;
294
circle.GetNurbFormParameterFromRadian( circle_t, &nurbs_t );
295
296
ON_NurbsCurve nurbs_curve;
297
circle.GetNurbsForm( nurbs_curve );
298
circle_pt = circle.PointAt(circle_t);
299
nurbs_pt = nurbs_curve.PointAt(nurbs_t);
300
// circle_pt and nurbs_pt will be the same
301
302
Remarks:
303
The NURBS curve parameter is with respect to the NURBS curve
304
created by ON_Circle::GetNurbForm. At radian values of
305
0.0, 0.5*ON_PI, ON_PI, 1.5*ON_PI, and 2.0*ON_PI, the nurbs
306
parameter and radian parameter are the same. At all other
307
values the nurbs and radian parameter values are different.
308
See Also:
309
ON_Circle::GetNurbFormParameterFromRadian
310
*/
311
bool
GetNurbFormParameterFromRadian(
312
double
circle_radians_parameter,
313
double
* nurbs_parameter
314
)
const
;
315
316
public
:
317
// circle is in the plane with center at plane.m_origin.
318
ON_Plane
plane
;
319
double
radius
;
// radius
320
//ON_3dPoint m_point[3]; // 3 points on the circle
321
};
322
323
324
#endif
325
ON_Circle
Definition:
opennurbs_circle.h:33
ON_2dPoint
Definition:
opennurbs_point.h:266
ON_Circle::plane
ON_Plane plane
Definition:
opennurbs_circle.h:318
ON_BoundingBox
Definition:
opennurbs_bounding_box.h:25
ON_Circle::radius
double radius
Definition:
opennurbs_circle.h:319
ON_Xform
Definition:
opennurbs_xform.h:28
ON_NurbsCurve
Definition:
opennurbs_nurbscurve.h:29
ON_3dPoint
Definition:
opennurbs_point.h:418
ON_Plane
Definition:
opennurbs_plane.h:20
ON_2dVector
Definition:
opennurbs_point.h:674
ON_3dVector
Definition:
opennurbs_point.h:952