Point Cloud Library (PCL) 1.13.0
opennurbs_linecurve.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_GEOMETRY_CURVE_LINE_INC_)
18#define ON_GEOMETRY_CURVE_LINE_INC_
19
20class ON_LineCurve;
21class ON_CLASS ON_LineCurve : public ON_Curve
22{
23 ON_OBJECT_DECLARE(ON_LineCurve);
24
25public:
27 ON_LineCurve(const ON_2dPoint&,const ON_2dPoint&); // creates a 2d line curve
28 ON_LineCurve(const ON_3dPoint&,const ON_3dPoint&); // creates a 3d line curve
31 double,double // domain
32 );
34
35 virtual ~ON_LineCurve();
36
39
40 /////////////////////////////////////////////////////////////////
41 // ON_Object overrides
42
43 // virtual ON_Object::SizeOf override
44 unsigned int SizeOf() const;
45
46 // virtual ON_Object::DataCRC override
47 ON__UINT32 DataCRC(ON__UINT32 current_remainder) const;
48
49 /*
50 Description:
51 Tests an object to see if its data members are correctly
52 initialized.
53 Parameters:
54 text_log - [in] if the object is not valid and text_log
55 is not NULL, then a brief englis description of the
56 reason the object is not valid is appened to the log.
57 The information appended to text_log is suitable for
58 low-level debugging purposes by programmers and is
59 not intended to be useful as a high level user
60 interface tool.
61 Returns:
62 @untitled table
63 true object is valid
64 false object is invalid, uninitialized, etc.
65 Remarks:
66 Overrides virtual ON_Object::IsValid
67 */
68 ON_BOOL32 IsValid( ON_TextLog* text_log = NULL ) const;
69
70 void Dump( ON_TextLog& ) const; // for debugging
71
72 ON_BOOL32 Write(
73 ON_BinaryArchive& // open binary file
74 ) const;
75
76 ON_BOOL32 Read(
77 ON_BinaryArchive& // open binary file
78 );
79
80 /////////////////////////////////////////////////////////////////
81 // ON_Geometry overrides
82
83 int Dimension() const;
84
85 ON_BOOL32 GetBBox( // returns true if successful
86 double*, // minimum
87 double*, // maximum
88 ON_BOOL32 = false // true means grow box
89 ) const;
90
91 /*
92 Description:
93 Get tight bounding box of the line.
94 Parameters:
95 tight_bbox - [in/out] tight bounding box
96 bGrowBox -[in] (default=false)
97 If true and the input tight_bbox is valid, then returned
98 tight_bbox is the union of the input tight_bbox and the
99 line's tight bounding box.
100 xform -[in] (default=NULL)
101 If not NULL, the tight bounding box of the transformed
102 line is calculated. The line is not modified.
103 Returns:
104 True if the returned tight_bbox is set to a valid
105 bounding box.
106 */
108 ON_BoundingBox& tight_bbox,
109 int bGrowBox = false,
110 const ON_Xform* xform = 0
111 ) const;
112
113 ON_BOOL32 Transform(
114 const ON_Xform&
115 );
116
117 // virtual ON_Geometry::IsDeformable() override
118 bool IsDeformable() const;
119
120 // virtual ON_Geometry::MakeDeformable() override
122
124 int, int // indices of coords to swap
125 );
126
127 /////////////////////////////////////////////////////////////////
128 // ON_Curve overrides
129
131
132 // Description:
133 // Set the domain of the curve
134 // Parameters:
135 // t0 - [in]
136 // t1 - [in] new domain will be [t0,t1]
137 // Returns:
138 // true if successful.
139 ON_BOOL32 SetDomain(
140 double t0,
141 double t1
142 );
143
145 int desired_dimension
146 );
147
148 int SpanCount() const; // number of smooth spans in curve
149
150 ON_BOOL32 GetSpanVector( // span "knots"
151 double* // array of length SpanCount() + 1
152 ) const; //
153
154 int Degree( // returns maximum algebraic degree of any span
155 // ( or a good estimate if curve spans are not algebraic )
156 ) const;
157
158 ON_BOOL32 IsLinear( // true if curve locus is a line segment between
159 // between specified points
160 double = ON_ZERO_TOLERANCE // tolerance to use when checking linearity
161 ) const;
162
163 /*
164 Description:
165 Several types of ON_Curve can have the form of a polyline including
166 a degree 1 ON_NurbsCurve, an ON_PolylineCurve, and an ON_PolyCurve
167 all of whose segments are some form of polyline. IsPolyline tests
168 a curve to see if it can be represented as a polyline.
169 Parameters:
170 pline_points - [out] if not NULL and true is returned, then the
171 points of the polyline form are returned here.
172 t - [out] if not NULL and true is returned, then the parameters of
173 the polyline points are returned here.
174 Returns:
175 @untitled table
176 0 curve is not some form of a polyline
177 >=2 number of points in polyline form
178 */
179 virtual
181 ON_SimpleArray<ON_3dPoint>* pline_points = NULL,
182 ON_SimpleArray<double>* pline_t = NULL
183 ) const;
184
185 ON_BOOL32 IsArc( // ON_Arc.m_angle > 0 if curve locus is an arc between
186 // specified points
187 const ON_Plane* = NULL, // if not NULL, test is performed in this plane
188 ON_Arc* = NULL, // if not NULL and true is returned, then arc parameters
189 // are filled in
190 double = ON_ZERO_TOLERANCE // tolerance to use when checking
191 ) const;
192
193 ON_BOOL32 IsPlanar(
194 ON_Plane* = NULL, // if not NULL and true is returned, then plane parameters
195 // are filled in
196 double = ON_ZERO_TOLERANCE // tolerance to use when checking
197 ) const;
198
199 ON_BOOL32 IsInPlane(
200 const ON_Plane&, // plane to test
201 double = ON_ZERO_TOLERANCE // tolerance to use when checking
202 ) const;
203
204 ON_BOOL32 IsClosed( // true if curve is closed (either curve has
205 void // clamped end knots and euclidean location of start
206 ) const; // CV = euclidean location of end CV, or curve is
207 // periodic.)
208
209 ON_BOOL32 IsPeriodic( // true if curve is a single periodic segment
210 void
211 ) const;
212
213 /*
214 Description:
215 Force the curve to start at a specified point.
216 Parameters:
217 start_point - [in]
218 Returns:
219 true if successful.
220 Remarks:
221 Some end points cannot be moved. Be sure to check return
222 code.
223 See Also:
224 ON_Curve::SetEndPoint
225 ON_Curve::PointAtStart
226 ON_Curve::PointAtEnd
227 */
228 ON_BOOL32 SetStartPoint(
229 ON_3dPoint start_point
230 );
231
232 /*
233 Description:
234 Force the curve to end at a specified point.
235 Parameters:
236 end_point - [in]
237 Returns:
238 true if successful.
239 Remarks:
240 Some end points cannot be moved. Be sure to check return
241 code.
242 See Also:
243 ON_Curve::SetStartPoint
244 ON_Curve::PointAtStart
245 ON_Curve::PointAtEnd
246 */
247 ON_BOOL32 SetEndPoint(
248 ON_3dPoint end_point
249 );
250
251 ON_BOOL32 Reverse(); // reverse parameterizatrion
252 // Domain changes from [a,b] to [-b,-a]
253
254 ON_BOOL32 Evaluate( // returns false if unable to evaluate
255 double, // evaluation parameter
256 int, // number of derivatives (>=0)
257 int, // array stride (>=Dimension())
258 double*, // array of length stride*(ndir+1)
259 int = 0, // optional - determines which side to evaluate from
260 // 0 = default
261 // < 0 to evaluate from below,
262 // > 0 to evaluate from above
263 int* = 0 // optional - evaluation hint (int) used to speed
264 // repeated evaluations
265 ) const;
266
267 // Description:
268 // virtual ON_Curve::Trim override.
269 // Removes portions of the curve outside the specified interval.
270 // Parameters:
271 // domain - [in] interval of the curve to keep. Portions of the
272 // curve before curve(domain[0]) and after curve(domain[1]) are
273 // removed.
274 // Returns:
275 // true if successful.
276 ON_BOOL32 Trim(
277 const ON_Interval& domain
278 );
279
280 // Description:
281 // Where possible, analytically extends curve to include domain.
282 // Parameters:
283 // domain - [in] if domain is not included in curve domain,
284 // curve will be extended so that its domain includes domain.
285 // Original curve is identical
286 // to the restriction of the resulting curve to the original curve domain,
287 // Returns:
288 // true if successful.
289 bool Extend(
290 const ON_Interval& domain
291 );
292
293 // Description:
294 // virtual ON_Curve::Split override.
295 // Divide the curve at the specified parameter. The parameter
296 // must be in the interior of the curve's domain. The pointers
297 // passed to Split must either be NULL or point to an ON_Curve
298 // object of the same of the same type. If the pointer is NULL,
299 // then a curve will be created in Split(). You may pass "this"
300 // as one of the pointers to Split().
301 // Parameters:
302 // t - [in] parameter in interval Domain().
303 // left_side - [out] left portion of curve
304 // right_side - [out] right portion of curve
305 // Example:
306 // For example, if crv were an ON_NurbsCurve, then
307 //
308 // ON_NurbsCurve right_side;
309 // crv.Split( crv.Domain().Mid() &crv, &right_side );
310 //
311 // would split crv at the parametric midpoint, put the left side
312 // in crv, and return the right side in right_side.
313 ON_BOOL32 Split(
314 double t, // t = curve parameter to split curve at
315 ON_Curve*& left_side, // left portion returned here
316 ON_Curve*& right_side // right portion returned here
317 ) const;
318
319 // Description:
320 // virtual ON_Curve::GetNurbForm override.
321 // Get a NURBS curve representation of this curve.
322 // Parameters:
323 // nurbs_curve - [out] NURBS representation returned here
324 // tolerance - [in] tolerance to use when creating NURBS
325 // representation.
326 // subdomain - [in] if not NULL, then the NURBS representation
327 // for this portion of the curve is returned.
328 // Returns:
329 // 0 unable to create NURBS representation
330 // with desired accuracy.
331 // 1 success - returned NURBS parameterization
332 // matches the curve's to wthe desired accuracy
333 // 2 success - returned NURBS point locus matches
334 // the curve's to the desired accuracy but, on
335 // the interior of the curve's domain, the
336 // curve's parameterization and the NURBS
337 // parameterization may not match to the
338 // desired accuracy.
341 double = 0.0,
342 const ON_Interval* = NULL
343 ) const;
344
345 // Description:
346 // virtual ON_Curve::HasNurbForm override.
347 // Does a NURBS curve representation of this curve exist.
348 // Parameters:
349 // Returns:
350 // 0 unable to create NURBS representation
351 // with desired accuracy.
352 // 1 success - returned NURBS parameterization
353 // matches the curve's to wthe desired accuracy
354 // 2 success - returned NURBS point locus matches
355 // the curve's to the desired accuracy but, on
356 // the interior of the curve's domain, the
357 // curve's parameterization and the NURBS
358 // parameterization may not match to the
359 // desired accuracy.
361 ) const;
362
363 // Description:
364 // virtual ON_Curve::GetCurveParameterFromNurbFormParameter override.
365 // Convert a NURBS curve parameter to a curve parameter
366 //
367 // Parameters:
368 // nurbs_t - [in] nurbs form parameter
369 // curve_t - [out] curve parameter
370 //
371 // Remarks:
372 // If GetNurbForm returns 2, this function converts the curve
373 // parameter to the NURBS curve parameter.
374 //
375 // See Also:
376 // ON_Curve::GetNurbForm, ON_Curve::GetNurbFormParameterFromCurveParameter
377 virtual
379 double nurbs_t,
380 double* curve_t
381 ) const;
382
383 // Description:
384 // virtual ON_Curve::GetNurbFormParameterFromCurveParameter override.
385 // Convert a curve parameter to a NURBS curve parameter.
386 //
387 // Parameters:
388 // curve_t - [in] curve parameter
389 // nurbs_t - [out] nurbs form parameter
390 //
391 // Remarks:
392 // If GetNurbForm returns 2, this function converts the curve
393 // parameter to the NURBS curve parameter.
394 //
395 // See Also:
396 // ON_Curve::GetNurbForm, ON_Curve::GetCurveParameterFromNurbFormParameter
397 virtual
399 double curve_t,
400 double* nurbs_t
401 ) const;
402
403 /////////////////////////////////////////////////////////////////
404 // Interface
405
407 ON_Interval m_t; // domain
408 int m_dim; // 2 or 3 (2 so ON_LineCurve can be uses as a trimming curve)
409};
410
411
412#endif
bool MakeDeformable()
ON_LineCurve(const ON_Line &)
ON_BOOL32 GetBBox(double *, double *, ON_BOOL32=false) const
ON_BOOL32 Read(ON_BinaryArchive &)
ON_BOOL32 GetSpanVector(double *) const
bool IsDeformable() const
ON__UINT32 DataCRC(ON__UINT32 current_remainder) const
int Degree() const
ON_BOOL32 SwapCoordinates(int, int)
ON_BOOL32 IsLinear(double=ON_ZERO_TOLERANCE) const
ON_BOOL32 IsInPlane(const ON_Plane &, double=ON_ZERO_TOLERANCE) const
virtual int IsPolyline(ON_SimpleArray< ON_3dPoint > *pline_points=NULL, ON_SimpleArray< double > *pline_t=NULL) const
unsigned int SizeOf() const
ON_LineCurve(const ON_LineCurve &)
bool ChangeDimension(int desired_dimension)
void Dump(ON_TextLog &) const
ON_LineCurve & operator=(const ON_Line &)
ON_LineCurve & operator=(const ON_LineCurve &)
ON_Interval Domain() const
ON_BOOL32 IsClosed(void) const
ON_LineCurve(const ON_2dPoint &, const ON_2dPoint &)
ON_BOOL32 Evaluate(double, int, int, double *, int=0, int *=0) const
ON_BOOL32 SetDomain(double t0, double t1)
ON_BOOL32 SetEndPoint(ON_3dPoint end_point)
ON_BOOL32 Transform(const ON_Xform &)
int HasNurbForm() const
ON_LineCurve(const ON_3dPoint &, const ON_3dPoint &)
ON_BOOL32 IsArc(const ON_Plane *=NULL, ON_Arc *=NULL, double=ON_ZERO_TOLERANCE) const
ON_BOOL32 IsValid(ON_TextLog *text_log=NULL) const
ON_BOOL32 Split(double t, ON_Curve *&left_side, ON_Curve *&right_side) const
ON_BOOL32 IsPlanar(ON_Plane *=NULL, double=ON_ZERO_TOLERANCE) const
int GetNurbForm(ON_NurbsCurve &, double=0.0, const ON_Interval *=NULL) const
bool Extend(const ON_Interval &domain)
virtual ON_BOOL32 GetCurveParameterFromNurbFormParameter(double nurbs_t, double *curve_t) const
ON_BOOL32 Reverse()
ON_LineCurve(const ON_Line &, double, double)
bool GetTightBoundingBox(ON_BoundingBox &tight_bbox, int bGrowBox=false, const ON_Xform *xform=0) const
virtual ON_BOOL32 GetNurbFormParameterFromCurveParameter(double curve_t, double *nurbs_t) const
int Dimension() const
ON_BOOL32 SetStartPoint(ON_3dPoint start_point)
virtual ~ON_LineCurve()
ON_BOOL32 IsPeriodic(void) const
ON_BOOL32 Write(ON_BinaryArchive &) const
int SpanCount() const
ON_BOOL32 Trim(const ON_Interval &domain)