Point Cloud Library (PCL)  1.10.0-dev
opennurbs_circle.h
1 /* \$NoKeywords: \$ */
2 /*
3 //
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
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,
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,
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,
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,
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,
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,
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
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
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(
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(
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.
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]
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;
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.
277  */
279  double nurbs_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;
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.
310  */