opennurbs_linecurve.h
/* $NoKeywords: $ */
/*
//
// Copyright (c) 1993-2012 Robert McNeel & Associates. All rights reserved.
// OpenNURBS, Rhinoceros, and Rhino3D are registered trademarks of Robert
// McNeel & Associates.
//
// THIS SOFTWARE IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY.
// ALL IMPLIED WARRANTIES OF FITNESS FOR ANY PARTICULAR PURPOSE AND OF
// MERCHANTABILITY ARE HEREBY DISCLAIMED.
//
// For complete openNURBS copyright information see <http://www.opennurbs.org>.
//
////////////////////////////////////////////////////////////////
*/
#if !defined(ON_GEOMETRY_CURVE_LINE_INC_)
#define ON_GEOMETRY_CURVE_LINE_INC_
class ON_LineCurve;
class ON_CLASS ON_LineCurve : public ON_Curve
{
ON_OBJECT_DECLARE(ON_LineCurve);
public:
ON_LineCurve();
ON_LineCurve(const ON_2dPoint&,const ON_2dPoint&); // creates a 2d line curve
ON_LineCurve(const ON_3dPoint&,const ON_3dPoint&); // creates a 3d line curve
ON_LineCurve(const ON_Line&);
ON_LineCurve(const ON_Line&,
double,double // domain
);
ON_LineCurve(const ON_LineCurve&);
virtual ~ON_LineCurve();
ON_LineCurve& operator=(const ON_LineCurve&);
ON_LineCurve& operator=(const ON_Line&);
/////////////////////////////////////////////////////////////////
// ON_Object overrides
// virtual ON_Object::SizeOf override
unsigned int SizeOf() const;
// virtual ON_Object::DataCRC override
ON__UINT32 DataCRC(ON__UINT32 current_remainder) const;
/*
Description:
Tests an object to see if its data members are correctly
initialized.
Parameters:
text_log - [in] if the object is not valid and text_log
is not NULL, then a brief englis description of the
reason the object is not valid is appened to the log.
The information appended to text_log is suitable for
low-level debugging purposes by programmers and is
not intended to be useful as a high level user
interface tool.
Returns:
@untitled table
true object is valid
false object is invalid, uninitialized, etc.
Remarks:
Overrides virtual ON_Object::IsValid
*/
ON_BOOL32 IsValid( ON_TextLog* text_log = NULL ) const;
void Dump( ON_TextLog& ) const; // for debugging
ON_BOOL32 Write(
ON_BinaryArchive& // open binary file
) const;
ON_BOOL32 Read(
ON_BinaryArchive& // open binary file
);
/////////////////////////////////////////////////////////////////
// ON_Geometry overrides
int Dimension() const;
ON_BOOL32 GetBBox( // returns true if successful
double*, // minimum
double*, // maximum
ON_BOOL32 = false // true means grow box
) const;
/*
Description:
Get tight bounding box of the line.
Parameters:
tight_bbox - [in/out] tight bounding box
bGrowBox -[in] (default=false)
If true and the input tight_bbox is valid, then returned
tight_bbox is the union of the input tight_bbox and the
line's tight bounding box.
xform -[in] (default=NULL)
If not NULL, the tight bounding box of the transformed
line is calculated. The line is not modified.
Returns:
True if the returned tight_bbox is set to a valid
bounding box.
*/
bool GetTightBoundingBox(
ON_BoundingBox& tight_bbox,
int bGrowBox = false,
const ON_Xform* xform = 0
) const;
ON_BOOL32 Transform(
const ON_Xform&
);
// virtual ON_Geometry::IsDeformable() override
bool IsDeformable() const;
// virtual ON_Geometry::MakeDeformable() override
bool MakeDeformable();
ON_BOOL32 SwapCoordinates(
int, int // indices of coords to swap
);
/////////////////////////////////////////////////////////////////
// ON_Curve overrides
ON_Interval Domain() const;
// Description:
// Set the domain of the curve
// Parameters:
// t0 - [in]
// t1 - [in] new domain will be [t0,t1]
// Returns:
// true if successful.
ON_BOOL32 SetDomain(
double t0,
double t1
);
bool ChangeDimension(
int desired_dimension
);
int SpanCount() const; // number of smooth spans in curve
ON_BOOL32 GetSpanVector( // span "knots"
double* // array of length SpanCount() + 1
) const; //
int Degree( // returns maximum algebraic degree of any span
// ( or a good estimate if curve spans are not algebraic )
) const;
ON_BOOL32 IsLinear( // true if curve locus is a line segment between
// between specified points
double = ON_ZERO_TOLERANCE // tolerance to use when checking linearity
) const;
/*
Description:
Several types of ON_Curve can have the form of a polyline including
a degree 1 ON_NurbsCurve, an ON_PolylineCurve, and an ON_PolyCurve
all of whose segments are some form of polyline. IsPolyline tests
a curve to see if it can be represented as a polyline.
Parameters:
pline_points - [out] if not NULL and true is returned, then the
points of the polyline form are returned here.
t - [out] if not NULL and true is returned, then the parameters of
the polyline points are returned here.
Returns:
@untitled table
0 curve is not some form of a polyline
>=2 number of points in polyline form
*/
virtual
int IsPolyline(
ON_SimpleArray<ON_3dPoint>* pline_points = NULL,
ON_SimpleArray<double>* pline_t = NULL
) const;
ON_BOOL32 IsArc( // ON_Arc.m_angle > 0 if curve locus is an arc between
// specified points
const ON_Plane* = NULL, // if not NULL, test is performed in this plane
ON_Arc* = NULL, // if not NULL and true is returned, then arc parameters
// are filled in
double = ON_ZERO_TOLERANCE // tolerance to use when checking
) const;
ON_BOOL32 IsPlanar(
ON_Plane* = NULL, // if not NULL and true is returned, then plane parameters
// are filled in
double = ON_ZERO_TOLERANCE // tolerance to use when checking
) const;
ON_BOOL32 IsInPlane(
const ON_Plane&, // plane to test
double = ON_ZERO_TOLERANCE // tolerance to use when checking
) const;
ON_BOOL32 IsClosed( // true if curve is closed (either curve has
void // clamped end knots and euclidean location of start
) const; // CV = euclidean location of end CV, or curve is
// periodic.)
ON_BOOL32 IsPeriodic( // true if curve is a single periodic segment
void
) const;
/*
Description:
Force the curve to start at a specified point.
Parameters:
start_point - [in]
Returns:
true if successful.
Remarks:
Some end points cannot be moved. Be sure to check return
code.
See Also:
ON_Curve::SetEndPoint
ON_Curve::PointAtStart
ON_Curve::PointAtEnd
*/
ON_BOOL32 SetStartPoint(
ON_3dPoint start_point
);
/*
Description:
Force the curve to end at a specified point.
Parameters:
end_point - [in]
Returns:
true if successful.
Remarks:
Some end points cannot be moved. Be sure to check return
code.
See Also:
ON_Curve::SetStartPoint
ON_Curve::PointAtStart
ON_Curve::PointAtEnd
*/
ON_BOOL32 SetEndPoint(
ON_3dPoint end_point
);
ON_BOOL32 Reverse(); // reverse parameterizatrion
// Domain changes from [a,b] to [-b,-a]
ON_BOOL32 Evaluate( // returns false if unable to evaluate
double, // evaluation parameter
int, // number of derivatives (>=0)
int, // array stride (>=Dimension())
double*, // array of length stride*(ndir+1)
int = 0, // optional - determines which side to evaluate from
// 0 = default
// < 0 to evaluate from below,
// > 0 to evaluate from above
int* = 0 // optional - evaluation hint (int) used to speed
// repeated evaluations
) const;
// Description:
// virtual ON_Curve::Trim override.
// Removes portions of the curve outside the specified interval.
// Parameters:
// domain - [in] interval of the curve to keep. Portions of the
// curve before curve(domain[0]) and after curve(domain[1]) are
// removed.
// Returns:
// true if successful.
ON_BOOL32 Trim(
const ON_Interval& domain
);
// Description:
// Where possible, analytically extends curve to include domain.
// Parameters:
// domain - [in] if domain is not included in curve domain,
// curve will be extended so that its domain includes domain.
// Original curve is identical
// to the restriction of the resulting curve to the original curve domain,
// Returns:
// true if successful.
bool Extend(
const ON_Interval& domain
);
// Description:
// virtual ON_Curve::Split override.
// Divide the curve at the specified parameter. The parameter
// must be in the interior of the curve's domain. The pointers
// passed to Split must either be NULL or point to an ON_Curve
// object of the same of the same type. If the pointer is NULL,
// then a curve will be created in Split(). You may pass "this"
// as one of the pointers to Split().
// Parameters:
// t - [in] parameter in interval Domain().
// left_side - [out] left portion of curve
// right_side - [out] right portion of curve
// Example:
// For example, if crv were an ON_NurbsCurve, then
//
// ON_NurbsCurve right_side;
// crv.Split( crv.Domain().Mid() &crv, &right_side );
//
// would split crv at the parametric midpoint, put the left side
// in crv, and return the right side in right_side.
ON_BOOL32 Split(
double t, // t = curve parameter to split curve at
ON_Curve*& left_side, // left portion returned here
ON_Curve*& right_side // right portion returned here
) const;
// Description:
// virtual ON_Curve::GetNurbForm override.
// Get a NURBS curve representation of this curve.
// Parameters:
// nurbs_curve - [out] NURBS representation returned here
// tolerance - [in] tolerance to use when creating NURBS
// representation.
// subdomain - [in] if not NULL, then the NURBS representation
// for this portion of the curve is returned.
// Returns:
// 0 unable to create NURBS representation
// with desired accuracy.
// 1 success - returned NURBS parameterization
// matches the curve's to wthe desired accuracy
// 2 success - returned NURBS point locus matches
// the curve's to the desired accuracy but, on
// the interior of the curve's domain, the
// curve's parameterization and the NURBS
// parameterization may not match to the
// desired accuracy.
int GetNurbForm(
ON_NurbsCurve&,
double = 0.0,
const ON_Interval* = NULL
) const;
// Description:
// virtual ON_Curve::HasNurbForm override.
// Does a NURBS curve representation of this curve exist.
// Parameters:
// Returns:
// 0 unable to create NURBS representation
// with desired accuracy.
// 1 success - returned NURBS parameterization
// matches the curve's to wthe desired accuracy
// 2 success - returned NURBS point locus matches
// the curve's to the desired accuracy but, on
// the interior of the curve's domain, the
// curve's parameterization and the NURBS
// parameterization may not match to the
// desired accuracy.
int HasNurbForm(
) const;
// Description:
// virtual ON_Curve::GetCurveParameterFromNurbFormParameter override.
// Convert a NURBS curve parameter to a curve parameter
//
// Parameters:
// nurbs_t - [in] nurbs form parameter
// curve_t - [out] curve parameter
//
// Remarks:
// If GetNurbForm returns 2, this function converts the curve
// parameter to the NURBS curve parameter.
//
// See Also:
// ON_Curve::GetNurbForm, ON_Curve::GetNurbFormParameterFromCurveParameter
virtual
ON_BOOL32 GetCurveParameterFromNurbFormParameter(
double nurbs_t,
double* curve_t
) const;
// Description:
// virtual ON_Curve::GetNurbFormParameterFromCurveParameter override.
// Convert a curve parameter to a NURBS curve parameter.
//
// Parameters:
// curve_t - [in] curve parameter
// nurbs_t - [out] nurbs form parameter
//
// Remarks:
// If GetNurbForm returns 2, this function converts the curve
// parameter to the NURBS curve parameter.
//
// See Also:
// ON_Curve::GetNurbForm, ON_Curve::GetCurveParameterFromNurbFormParameter
virtual
ON_BOOL32 GetNurbFormParameterFromCurveParameter(
double curve_t,
double* nurbs_t
) const;
/////////////////////////////////////////////////////////////////
// Interface
ON_Line m_line;
ON_Interval m_t; // domain
int m_dim; // 2 or 3 (2 so ON_LineCurve can be uses as a trimming curve)
};
#endif
ON_Curve::Degree
virtual int Degree() const =0
ON_Curve::IsPeriodic
virtual ON_BOOL32 IsPeriodic() const
ON_Interval
Definition: opennurbs_point.h:48
ON_Curve::GetNurbForm
virtual int GetNurbForm(ON_NurbsCurve &nurbs_curve, double tolerance=0.0, const ON_Interval *subdomain=NULL) const
ON_Curve::GetTightBoundingBox
bool GetTightBoundingBox(ON_BoundingBox &tight_bbox, int bGrowBox=false, const ON_Xform *xform=0) const
ON_LineCurve
Definition: opennurbs_linecurve.h:21
ON_Curve::ChangeDimension
virtual bool ChangeDimension(int desired_dimension)
ON_NurbsCurve
Definition: opennurbs_nurbscurve.h:29
ON_Curve::Evaluate
virtual ON_BOOL32 Evaluate(double t, int der_count, int v_stride, double *v, int side=0, int *hint=0) const =0
ON_Curve::GetCurveParameterFromNurbFormParameter
virtual ON_BOOL32 GetCurveParameterFromNurbFormParameter(double nurbs_t, double *curve_t) const
ON_2dPoint
Definition: opennurbs_point.h:266
ON_Geometry::Transform
virtual ON_BOOL32 Transform(const ON_Xform &xform)
ON_Curve::Extend
virtual bool Extend(const ON_Interval &domain)
ON_Curve::IsPolyline
virtual int IsPolyline(ON_SimpleArray< ON_3dPoint > *pline_points=NULL, ON_SimpleArray< double > *pline_t=NULL) const
ON_Curve::IsArc
virtual ON_BOOL32 IsArc(const ON_Plane *plane=NULL, ON_Arc *arc=NULL, double tolerance=ON_ZERO_TOLERANCE) const
ON_LineCurve::m_dim
int m_dim
Definition: opennurbs_linecurve.h:408
ON_Curve
Definition: opennurbs_curve.h:88
ON_Curve::SizeOf
unsigned int SizeOf() const
ON_Xform
Definition: opennurbs_xform.h:28
ON_SimpleArray< ON_3dPoint >
ON_BoundingBox
Definition: opennurbs_bounding_box.h:25
ON_Object::DataCRC
virtual ON__UINT32 DataCRC(ON__UINT32 current_remainder) const
ON_Geometry::Dimension
virtual int Dimension() const =0
ON_Geometry::MakeDeformable
virtual bool MakeDeformable()
ON_Object::Read
virtual ON_BOOL32 Read(ON_BinaryArchive &binary_archive)
ON_Curve::Trim
virtual ON_BOOL32 Trim(const ON_Interval &domain)
ON_Object::Write
virtual ON_BOOL32 Write(ON_BinaryArchive &binary_archive) const
ON_Geometry::IsDeformable
virtual bool IsDeformable() const
ON_Curve::SetDomain
bool SetDomain(ON_Interval domain)
ON_Curve::GetNurbFormParameterFromCurveParameter
virtual ON_BOOL32 GetNurbFormParameterFromCurveParameter(double curve_t, double *nurbs_t) const
ON_Line
Definition: opennurbs_line.h:20
ON_Curve::operator=
ON_Curve & operator=(const ON_Curve &)
ON_Curve::HasNurbForm
virtual int HasNurbForm() const
ON_Curve::SetStartPoint
virtual ON_BOOL32 SetStartPoint(ON_3dPoint start_point)
ON_LineCurve::m_line
ON_Line m_line
Definition: opennurbs_linecurve.h:406
ON_Plane
Definition: opennurbs_plane.h:20
ON_BinaryArchive
Definition: opennurbs_archive.h:731
ON_TextLog
Definition: opennurbs_textlog.h:22
ON_3dPoint
Definition: opennurbs_point.h:418
ON_LineCurve::m_t
ON_Interval m_t
Definition: opennurbs_linecurve.h:407
ON_Curve::GetSpanVector
virtual ON_BOOL32 GetSpanVector(double *knots) const =0
ON_Curve::Reverse
virtual ON_BOOL32 Reverse()=0
ON_Curve::SpanCount
virtual int SpanCount() const =0
ON_Curve::Domain
virtual ON_Interval Domain() const =0
ON_Curve::IsInPlane
virtual ON_BOOL32 IsInPlane(const ON_Plane &test_plane, double tolerance=ON_ZERO_TOLERANCE) const =0
ON_Geometry::SwapCoordinates
virtual ON_BOOL32 SwapCoordinates(int i, int j)
ON_Curve::IsClosed
virtual ON_BOOL32 IsClosed() const
ON_Object::Dump
virtual void Dump(ON_TextLog &) const
ON_Curve::Split
virtual ON_BOOL32 Split(double t, ON_Curve *&left_side, ON_Curve *&right_side) const
ON_Geometry::GetBBox
virtual ON_BOOL32 GetBBox(double *boxmin, double *boxmax, int bGrowBox=false) const =0
ON_Object::IsValid
virtual ON_BOOL32 IsValid(ON_TextLog *text_log=NULL) const =0
ON_Curve::IsLinear
virtual ON_BOOL32 IsLinear(double tolerance=ON_ZERO_TOLERANCE) const
ON_Curve::SetEndPoint
virtual ON_BOOL32 SetEndPoint(ON_3dPoint end_point)
ON_Arc
Definition: opennurbs_arc.h:34
ON_Curve::IsPlanar
virtual ON_BOOL32 IsPlanar(ON_Plane *plane=NULL, double tolerance=ON_ZERO_TOLERANCE) const