Rhino C++ API  8.13
Public Member Functions | Static Public Member Functions | Public Attributes | List of all members
ON_NurbsCurve Class Reference

#include <opennurbs_nurbscurve.h>

Inheritance diagram for ON_NurbsCurve:
ON_Curve ON_Geometry ON_Object

Public Member Functions

 ON_NurbsCurve () ON_NOEXCEPT
 
 ON_NurbsCurve (const ON_BezierCurve &bezier_curve)
 
 ON_NurbsCurve (const ON_NurbsCurve &)
 
 ON_NurbsCurve (int dimension, bool bIsRational, int order, int cv_count)
 
virtual ~ON_NurbsCurve ()
 
bool Append (const ON_NurbsCurve &)
 
bool ChangeClosedCurveSeam (double t) override
 
bool ChangeDimension (int desired_dimension) override
 
bool ChangeEndWeights (double w0, double w1)
 
bool ClampEnd (int end)
 
const ON_4dPoint ControlPoint (int cv_index) const
 
const ON_2dex ControlPointSpans (int control_point_index) const
 Get the indices of the spans where the specified control point is active. Note that a NURBS curve with n control points has (n-degree) many spans. If 0 &lt= span_index < (n-degree), then CV(span_index), ..., CV(span_index+degree) and {knot[span_index], ..., knot[span_index+2*degree-1]} are the control points and knots that are active in that span. The domain of the span is [knot[span_index+degree-1], knot[span_index+degree]]. More...
 
const ON_Interval ControlPointSupport (int control_point_index) const
 Get the interval in the curve's domain where the specified control point is active (helps determine the value of the curve). The returned inteval will be contained in the curve's domain. Put another way, if ControlPointSupport(i).Contains(t) is false, then curve->PointAt(t) does not depend on the location of CV(i). More...
 
double ControlPolygonLength () const
 returns the length of the control polygon More...
 
bool ConvertSpanToBezier (int, ON_BezierCurve &) const
 
bool Create (int dimension, bool bIsRational, int order, int cv_count)
 
bool CreateClampedUniformNurbs (int dimension, int order, int point_count, const ON_3dPoint *point, double knot_delta=1.0)
 
bool CreatePeriodicUniformNurbs (int dimension, int order, int point_count, const ON_3dPoint *point, double knot_delta=1.0)
 
double * CV (int cv_index) const
 
int CVCapacity () const
 
int CVCount (void) const
 
int CVSize (void) const
 
ON::point_style CVStyle () const
 
ON__UINT32 DataCRC (ON__UINT32 current_remainder) const override
 virtual ON_Object::DataCRC override More...
 
int Degree () const override
 
void Destroy ()
 
int Dimension () const override
 ON_Geometry overrides. More...
 
ON_Interval Domain () const override
 ON_Curve overrides. More...
 
void Dump (ON_TextLog &dump) const override
 
void EmergencyDestroy ()
 
bool Evaluate (double, int, int, double *, int=0, int *=0) const override
 
bool Extend (const ON_Interval &domain) override
 
bool GetBBox (double *boxmin, double *boxmax, bool bGrowBox=false) const override
 virtual ON_Geometry GetBBox override
More...
 
bool GetClosestPoint (const ON_3dPoint &, double *t, double maximum_distance=0.0, const ON_Interval *sub_domain=nullptr) const override
 
double GetCubicBezierApproximation (double max_deviation, class ON_BezierCurve &bezierCurve) const
 
double GetCubicBezierApproximation (double max_deviation, ON_3dPoint bezCV[4]) const
 
bool GetCurveParameterFromNurbFormParameter (double nurbs_t, double *curve_t) const override
 
bool GetCV (int, ON::point_style, double *) const
 
bool GetCV (int, ON_3dPoint &) const
 
bool GetCV (int, ON_4dPoint &) const
 
bool GetGrevilleAbcissae (double *) const
 
bool GetNextDiscontinuity (ON::continuity c, double t0, double t1, double *t, int *hint=nullptr, int *dtype=nullptr, double cos_angle_tolerance=ON_DEFAULT_ANGLE_TOLERANCE_COSINE, double curvature_tolerance=ON_SQRT_EPSILON) const override
 
int GetNurbForm (ON_NurbsCurve &nurbsform, double tolerance=0.0, const ON_Interval *subdomain=nullptr) const override
 
bool GetNurbFormParameterFromCurveParameter (double curve_t, double *nurbs_t) const override
 
bool GetParameterTolerance (double t, double *tminus, double *tplus) const override
 
bool GetSpanVector (double *knot_values) const override
 
double GrevilleAbcissa (int) const
 
bool GrevilleInterpolate (const double *points, size_t point_count, size_t point_stride, bool bPeriodic)
 Modify the control points so the curve interpolates points[] at the Greville abcissa of the current knot vector. The curve's dimension, rational, order, control point count, properties must be set. If this curve is rational, the control point weights must be set. More...
 
bool GrevilleInterpolate (const double *points, size_t point_count, size_t point_stride, bool bPeriodic, int cv0, int cv1)
 Modify the control points so the curve interpolates points[] at the Greville abcissa of the current knot vector. The curve's dimension, rational, order, control point count, properties must be set. If this curve is rational, the control point weights must be set. More...
 
bool GrevilleInterpolate (const ON_SimpleArray< ON_3dPoint > &points, bool bPeriodic)
 Modify the control points so the curve interpolates points[] at the Greville abcissa of the current knot vector. The curve's dimension rational, order, control point count, properties must be set. The curve must have dimension <= 3. If this curve is rational, the control point weights must be set. More...
 
bool GrevilleInterpolate (const ON_SimpleArray< ON_3dPoint > &points, bool bPeriodic, int cv0, int cv1)
 Modify the control points so the curve interpolates points[] at the Greville abcissa of the current knot vector. The curve's dimension rational, order, control point count, properties must be set. The curve must have dimension <= 3. If this curve is rational, the control point weights must be set. More...
 
bool HasBezierSpans () const
 
int HasNurbForm () const override
 
bool IncreaseDegree (int desired_degree)
 
void Initialize (void)
 
bool InsertKnot (double knot_value, int knot_multiplicity)
 
bool IsArc (const ON_Plane *plane=nullptr, ON_Arc *arc=nullptr, double tolerance=ON_ZERO_TOLERANCE) const override
 
bool IsClamped (int end=2) const
 
bool IsClosed () const override
 
bool IsContinuous (ON::continuity c, double t, int *hint=nullptr, double point_tolerance=ON_ZERO_TOLERANCE, double d1_tolerance=ON_ZERO_TOLERANCE, double d2_tolerance=ON_ZERO_TOLERANCE, double cos_angle_tolerance=ON_DEFAULT_ANGLE_TOLERANCE_COSINE, double curvature_tolerance=ON_SQRT_EPSILON) const override
 
bool IsDeformable () const override
 virtual ON_Geometry::IsDeformable() override More...
 
bool IsDuplicate (const ON_NurbsCurve &other, bool bIgnoreParameterization, double tolerance=ON_ZERO_TOLERANCE) const
 
bool IsInPlane (const ON_Plane &test_plane, double tolerance=ON_ZERO_TOLERANCE) const override
 
bool IsLinear (double tolerance=ON_ZERO_TOLERANCE) const override
 
bool IsMorphable () const override
 virtual ON_Geometry override More...
 
bool IsNatural (int end=2) const
 
bool IsPeriodic () const override
 
bool IsPlanar (ON_Plane *plane=nullptr, double tolerance=ON_ZERO_TOLERANCE) const override
 
int IsPolyline (ON_SimpleArray< ON_3dPoint > *pline_points=nullptr, ON_SimpleArray< double > *pline_t=nullptr) const override
 
bool IsRational (void) const
 Interface. More...
 
bool IsShort (double tolerance, const ON_Interval *sub_domain=0, double *length_estimate=0) const override
 
bool IsSingular () const
 
bool IsSubDFriendly (bool bPermitCreases) const
 
bool IsValid (class ON_TextLog *text_log=nullptr) const override
 ON_Object overrides. More...
 
const double * Knot () const
 
double Knot (int knot_index) const
 
int KnotCapacity () const
 
int KnotCount (void) const
 
int KnotMultiplicity (int knot_index) const
 
bool MakeClampedUniformKnotVector (double delta=1.0)
 
bool MakeDeformable () override
 virtual ON_Geometry::MakeDeformable() override More...
 
bool MakeNonRational ()
 
bool MakePeriodicUniformKnotVector (double delta=1.0)
 
bool MakePiecewiseBezier (bool bSetEndWeightsToOne=false)
 
bool MakeRational ()
 
void ManageKnotForExperts (int knot_capacity, double *knot)
 
bool Morph (const ON_SpaceMorph &morph) override
 virtual ON_Geometry override More...
 
ON_NurbsCurveoperator= (const ON_BezierCurve &bezier_curve)
 
ON_NurbsCurveoperator= (const ON_NurbsCurve &src)
 
int Order (void) const
 
bool Read (ON_BinaryArchive &binary_archive) override
 
bool RemoveKnots (int i0, int i1, double tolerance=0.0)
 
bool RemoveShortSegments (double tolerance, bool bRemoveShortSegments=true) override
 
int RemoveSingularSpans ()
 
bool RemoveSpan (int span_index)
 
bool RepairBadKnots (double knot_tolerance=0.0, bool bRepair=true)
 
bool Reparameterize (double c)
 
bool ReserveCVCapacity (int)
 Tools for managing CV and knot memory. More...
 
bool ReserveKnotCapacity (int)
 
bool Reverse () override
 
bool SetCV (int, const ON_3dPoint &)
 
bool SetCV (int, const ON_4dPoint &)
 
bool SetCV (int, ON::point_style, const double *)
 
bool SetDomain (double t0, double t1) override
 
bool SetEndPoint (ON_3dPoint end_point) override
 virtual More...
 
bool SetKnot (int knot_index, double knot_value)
 
bool SetStartPoint (ON_3dPoint start_point) override
 virtual More...
 
void SetSubDFriendlyTag (bool bSubDFriendlyTag)
 
void SetUnclampedTagForExperts (bool bUnclampedTag)
 
bool SetWeight (int, double)
 
unsigned int SizeOf () const override
 virtual ON_Object::SizeOf override More...
 
int SpanCount () const override
 
bool SpanIsLinear (int span_index, double min_length, double tolerance) const
 
bool SpanIsLinear (int span_index, double min_length, double tolerance, ON_Line *line) const
 
bool SpanIsSingular (int span_index) const
 
bool Split (double split_param, ON_Curve *&left_result, ON_Curve *&right_result) const override
 
bool SubDFriendlyTag () const
 
double SuperfluousKnot (int) const
 
bool SwapCoordinates (int i, int j) override
 
bool Transform (const ON_Xform &xform) override
 
bool Trim (const ON_Interval &) override
 
bool TrimClosedCurve (const ON_Interval &in)
 
bool UnclampedTagForExperts () const
 
bool UnclampEndForExperts (int end)
 
void UnmanageKnotForExperts (int &knot_capacity, double *&knot)
 
double Weight (int) const
 
bool Write (ON_BinaryArchive &binary_archive) const override
 
bool ZeroCVs ()
 zeros control vertices and, if rational, sets weights to 1 More...
 
- Public Member Functions inherited from ON_Curve
 ON_Curve () ON_NOEXCEPT
 
 ON_Curve (const ON_Curve &)
 
virtual ~ON_Curve ()
 
bool AreaMassProperties (ON_3dPoint base_point, ON_3dVector plane_normal, ON_MassProperties &mp, bool bArea=true, bool bFirstMoments=true, bool bSecondMoments=true, bool bProductMoments=true, double rel_tol=1.0e-6, double abs_tol=1.0e-6) const
 
bool ChangeClosedCurveSeam (double t, double min_dist)
 
virtual class ON_CurveTreeCreateCurveTree () const
 
ON_3dVector CurvatureAt (double t) const
 
const class ON_CurveTreeCurveTree () const
 
ON_3dVector DerivativeAt (double t) const
 
void DestroyCurveTree ()
 
void DestroyRuntimeCache (bool bDelete=true) override
 virtual ON_Object::DestroyRuntimeCache override More...
 
virtual ON_CurveDuplicateCurve () const
 
bool Ev1Der (double t, ON_3dPoint &point, ON_3dVector &first_derivative, int side=0, int *hint=0) const
 
bool Ev2Der (double t, ON_3dPoint &point, ON_3dVector &first_derivative, ON_3dVector &second_derivative, int side=0, int *hint=0) const
 
bool EvaluatePoint (const class ON_ObjRef &objref, ON_3dPoint &P) const override
 virtual ON_Geometry override More...
 
bool EvCurvature (double t, ON_3dPoint &point, ON_3dVector &tangent, ON_3dVector &kappa, int side=0, int *hint=0) const
 
bool EvPoint (double t, ON_3dPoint &point, int side=0, int *hint=0) const
 
bool EvSignedCurvature (double t, ON_3dPoint &point, ON_3dVector &tangent, double &kappa, const ON_3dVector *normal=nullptr, int side=0, int *hint=0) const
 
bool EvTangent (double t, ON_3dPoint &point, ON_3dVector &tangent, int side=0, int *hint=0) const
 
bool FirstSpanIsLinear (double min_length, double tolerance) const
 
bool FirstSpanIsLinear (double min_length, double tolerance, ON_Line *span_line) const
 
bool FrameAt (double t, ON_Plane &plane) const
 
bool GetDomain (double *t0, double *t1) const
 curve interface More...
 
virtual bool GetLength (double *length, double fractional_tolerance=1.0e-8, const ON_Interval *sub_domain=nullptr) const
 
virtual bool GetLocalClosestPoint (const ON_3dPoint &test_point, double seed_parameter, double *t, const ON_Interval *sub_domain=0) const
 
virtual bool GetNormalizedArcLengthPoint (double s, double *t, double fractional_tolerance=1.0e-8, const ON_Interval *sub_domain=nullptr) const
 
virtual bool GetNormalizedArcLengthPoints (int count, const double *s, double *t, double absolute_tolerance=0.0, double fractional_tolerance=1.0e-8, const ON_Interval *sub_domain=nullptr) const
 
virtual bool GetSpanVectorIndex (double t, int side, int *span_vector_index, ON_Interval *span_domain) const
 
bool GetTightBoundingBox (class ON_BoundingBox &tight_bbox, bool bGrowBox=false, const class ON_Xform *xform=nullptr) const override
 virtual ON_Geometry GetTightBoundingBox override
More...
 
int IntersectCurve (const ON_Curve *curveB, ON_SimpleArray< ON_X_EVENT > &x, double intersection_tolerance=0.0, double overlap_tolerance=0.0, const ON_Interval *curveA_domain=0, const ON_Interval *curveB_domain=0) const
 
int IntersectPlane (ON_PlaneEquation plane_equation, ON_SimpleArray< ON_X_EVENT > &x, double intersection_tolerance=0.0, double overlap_tolerance=0.0, const ON_Interval *curve_domain=0) const
 
virtual int IntersectSelf (ON_SimpleArray< ON_X_EVENT > &x, double intersection_tolerance=0.0, const ON_Interval *curve_domain=0) const
 
int IntersectSurface (const ON_Surface *surfaceB, ON_SimpleArray< ON_X_EVENT > &x, double intersection_tolerance=0.0, double overlap_tolerance=0.0, const ON_Interval *curveA_domain=0, const ON_Interval *surfaceB_udomain=0, const ON_Interval *surfaceB_vdomain=0) const
 
bool IsArcAt (double t, const ON_Plane *plane=0, ON_Arc *arc=0, double tolerance=ON_ZERO_TOLERANCE, double *t0=0, double *t1=0) const
 
bool IsClosable (double tolerance, double min_abs_size=0.0, double min_rel_size=10.0) const
 
virtual bool IsEllipse (const ON_Plane *plane=nullptr, ON_Ellipse *ellipse=nullptr, double tolerance=ON_ZERO_TOLERANCE) const
 
bool LastSpanIsLinear (double min_length, double tolerance) const
 
bool LastSpanIsLinear (double min_length, double tolerance, ON_Line *span_line) const
 
bool LengthMassProperties (class ON_MassProperties &mp, bool bLength=true, bool bFirstMoments=true, bool bSecondMoments=true, bool bProductMoments=true, double rel_tol=1.0e-6, double abs_tol=1.0e-6) const
 
class ON_PolylineCurveMeshCurve (ON_MeshCurveParameters &mp, ON_PolylineCurve *polyline, bool bSkipFirstPoint, const ON_Interval *domain) const
 
ON_NurbsCurveNurbsCurve (ON_NurbsCurve *pNurbsCurve=nullptr, double tolerance=0.0, const ON_Interval *subdomain=nullptr) const
 
ON::object_type ObjectType () const override
 
ON_Curveoperator= (const ON_Curve &)
 
ON_3dPoint PointAt (double t) const
 
ON_3dPoint PointAtEnd () const
 
ON_3dPoint PointAtStart () const
 
bool SetDomain (ON_Interval domain)
 
double SignedCurvatureAt (double t, const ON_3dVector *plane_normal=nullptr) const
 
const ON_SimpleArray< double > SpanVector () const
 The curve's span vector is a stricltly monotone increasing list of doubles that are the intervals on which the curve is C-infinity. More...
 
ON_3dVector TangentAt (double t) const
 
- Public Member Functions inherited from ON_Geometry
 ON_Geometry ()=default
 
 ON_Geometry (const ON_Geometry &)=default
 
 ~ON_Geometry ()=default
 
ON_BoundingBox BoundingBox () const
 
virtual class ON_BrepBrepForm (class ON_Brep *brep=nullptr) const
 
virtual void ClearBoundingBox ()
 
virtual ON_COMPONENT_INDEX ComponentIndex () const
 
bool GetBoundingBox (ON_3dPoint &bbox_min, ON_3dPoint &bbox_max, bool bGrowBox=false) const
 
bool GetBoundingBox (ON_BoundingBox &bbox, bool bGrowBox=false) const
 
virtual bool HasBrepForm () const
 
virtual bool Morph (const class ON_SpaceMorph &morph)
 
ON_Geometryoperator= (const ON_Geometry &)=default
 
bool Rotate (double rotation_angle, const ON_3dVector &rotation_axis, const ON_3dPoint &rotation_center)
 
bool Rotate (double sin_angle, double cos_angle, const ON_3dVector &rotation_axis, const ON_3dPoint &rotation_center)
 
bool Scale (double scale_factor)
 
const ON_BoundingBox TightBoundingBox () const
 
bool Translate (const ON_3dVector &translation_vector)
 
- Public Member Functions inherited from ON_Object
 ON_Object () ON_NOEXCEPT
 
 ON_Object (const ON_Object &)
 
virtual ~ON_Object ()
 
virtual ON_AggregateComponentStatus AggregateComponentStatus () const
 
bool AttachUserData (class ON_UserData *pUserData)
 
unsigned int ClearAllComponentStates () const
 
virtual unsigned int ClearComponentStates (ON_COMPONENT_INDEX component_index, ON_ComponentStatus states_to_clear) const
 
virtual unsigned int ClearComponentStates (ON_ComponentStatus states_to_clear) const
 
void CopyUserData (const ON_Object &source_object)
 
unsigned int CopyUserData (const ON_Object &source_object, ON_UUID source_userdata_item_id, ON_Object::UserDataConflictResolution userdata_conflict_resolution)
 
virtual bool DeleteComponents (const ON_COMPONENT_INDEX *ci_list, size_t ci_count)
 
bool DetachUserData (class ON_UserData *pUserData)
 
void EmergencyDestroy ()
 
class ON_UserDataFirstUserData () const
 
virtual unsigned int GetComponentsWithSetStates (ON_ComponentStatus states_filter, bool bAllEqualStates, ON_SimpleArray< ON_COMPONENT_INDEX > &components) const
 
class ON_UserDataGetUserData (const ON_UUID &userdata_uuid) const
 
bool GetUserString (const wchar_t *key, ON_wString &string_value) const
 
int GetUserStringKeys (ON_ClassArray< ON_wString > &user_string_keys) const
 
int GetUserStrings (ON_ClassArray< ON_UserString > &user_strings) const
 
bool IsCorrupt (bool bRepair, bool bSilentError, class ON_TextLog *text_log) const
 
bool IsKindOf (const ON_ClassId *pClassId) const
 
virtual void MarkAggregateComponentStatusAsNotCurrent () const
 
virtual void MemoryRelocate ()
 
virtual ON_UUID ModelObjectId () const
 
void MoveUserData (ON_Object &source_object)
 
unsigned int MoveUserData (ON_Object &source_object, ON_UUID source_userdata_item_id, ON_Object::UserDataConflictResolution userdata_conflict_resolution, bool bDeleteAllSourceItems)
 
ON_Objectoperator= (const ON_Object &)
 
void PurgeUserData ()
 
virtual unsigned int SetComponentStates (ON_COMPONENT_INDEX component_index, ON_ComponentStatus states_to_set) const
 
virtual unsigned int SetComponentStatus (ON_COMPONENT_INDEX component_index, ON_ComponentStatus status_to_copy) const
 
bool SetUserString (const wchar_t *key, const wchar_t *string_value)
 
int SetUserStrings (int count, const ON_UserString *user_strings, bool bReplace)
 
bool ThisIsNullptr (bool bSilentError) const
 
void TransformUserData (const class ON_Xform &xform)
 
virtual bool UpdateReferencedComponents (const class ON_ComponentManifest &source_manifest, const class ON_ComponentManifest &destination_manifest, const class ON_ManifestMap &manifest_map)
 
int UserStringCount () const
 

Static Public Member Functions

static ON_NurbsCurveNew ()
 
static ON_NurbsCurveNew (const ON_BezierCurve &bezier_curve)
 
static ON_NurbsCurveNew (const ON_NurbsCurve &nurbs_curve)
 
static ON_NurbsCurveNew (int dimension, bool bIsRational, int order, int cv_count)
 
- Static Public Member Functions inherited from ON_Curve
static class ON_NurbsCurveCreateCubicLoft (int point_count, int point_dim, int point_stride, const double *point_list, double k, int is_closed=0, ON::cubic_loft_end_condition start_shape=ON::cubic_loft_ec_quadratic, ON::cubic_loft_end_condition end_shape=ON::cubic_loft_ec_quadratic, class ON_NurbsCurve *nurbs_curve=0)
 

Public Attributes

double * m_cv
 
int m_cv_capacity
 
int m_cv_count
 number of control vertices ( >= order ) More...
 
int m_cv_stride
 control vertex net memory More...
 
int m_dim
 Implementation. More...
 
int m_is_rat
 
double * m_knot
 
int m_order
 order = degree+1 ( order >=2 ) More...
 

Additional Inherited Members

- Public Types inherited from ON_Object
enum  UserDataConflictResolution : unsigned char {
  UserDataConflictResolution::destination_object = 0, UserDataConflictResolution::source_object = 1, UserDataConflictResolution::source_copycount_gt = 2, UserDataConflictResolution::source_copycount_ge = 3,
  UserDataConflictResolution::destination_copycount_gt = 4, UserDataConflictResolution::destination_copycount_ge = 5, UserDataConflictResolution::delete_item = 6
}
 
- Static Public Attributes inherited from ON_Geometry
const static ON_Geometry Unset
 
- Protected Member Functions inherited from ON_Curve
bool ParameterSearch (double t, int &index, bool bEnableSnap, const ON_SimpleArray< double > &m_t, double RelTol=ON_SQRT_EPSILON) const
 

Detailed Description

Copyright (c) 1993-2022 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. Definition of NURBS curve

Constructor & Destructor Documentation

◆ ON_NurbsCurve() [1/4]

ON_NurbsCurve::ON_NurbsCurve ( )

◆ ~ON_NurbsCurve()

virtual ON_NurbsCurve::~ON_NurbsCurve ( )
virtual

◆ ON_NurbsCurve() [2/4]

ON_NurbsCurve::ON_NurbsCurve ( const ON_NurbsCurve )

◆ ON_NurbsCurve() [3/4]

ON_NurbsCurve::ON_NurbsCurve ( const ON_BezierCurve bezier_curve)

Description: Create a NURBS curve equal to bezier with domain [0,1]. Parameters: bezier_curve - [in]

◆ ON_NurbsCurve() [4/4]

ON_NurbsCurve::ON_NurbsCurve ( int  dimension,
bool  bIsRational,
int  order,
int  cv_count 
)

Description: Create a NURBS curve with knot a cv memory allocated. Parameters: dimension - [in] (>= 1) bIsRational - [in] true to make a rational NURBS order - [in] (>= 2) The order=degree+1 cv_count - [in] (>= order) number of control vertices

Member Function Documentation

◆ Append()

bool ON_NurbsCurve::Append ( const ON_NurbsCurve )

◆ ChangeClosedCurveSeam()

bool ON_NurbsCurve::ChangeClosedCurveSeam ( double  t)
overridevirtual

Description: If this curve is closed, then modify it so that the start/end point is at curve parameter t. Parameters: t - [in] curve parameter of new start/end point. The returned curves domain will start at t. Returns: true if successful. Remarks: Overrides virtual ON_Curve::ChangeClosedCurveSeam

Reimplemented from ON_Curve.

◆ ChangeDimension()

bool ON_NurbsCurve::ChangeDimension ( int  desired_dimension)
overridevirtual

Description: Change the dimension of a curve. Parameters: desired_dimension - [in] Returns: true if the curve's dimension was already desired_dimension or if the curve's dimension was successfully changed to desired_dimension.

Reimplemented from ON_Curve.

◆ ChangeEndWeights()

bool ON_NurbsCurve::ChangeEndWeights ( double  w0,
double  w1 
)

Description: Use a combination of scaling and reparameterization to change the end weights to the specified values. Parameters: w0 - [in] weight for first cv w1 - [in] weight for last cv Returns: true if successful. See Also: ON_ChangeRationalNurbsCurveEndWeights Remarks: The domain, eucleanean locations of the control points, and locus of the curve do not change, but the weights, homogeneous cv values and internal knot values may change. If w0 and w1 are 1 and the curve is not rational, the curve is not changed.

◆ ClampEnd()

bool ON_NurbsCurve::ClampEnd ( int  end)

Description: Clamp end knots. Does not modify the curve location, but can modify knots and control vertices near the ends. Parameters: end - [in] 0 = clamp start, 1 = clamp end, 2 = clamp start and end Returns: true if successful

◆ ControlPoint()

const ON_4dPoint ON_NurbsCurve::ControlPoint ( int  cv_index) const

Parameters: cv_index - [in] zero based control point index Returns: Control point as an ON_4dPoint. Remarks: If cv_index or the nurbs curve is not valid, then ON_4dPoint::Nan is returned. If dim < 3, unused coordinates are zero. If dim >= 4, the first three coordinates are returned. If is_rat is false, the weight is 1.

◆ ControlPointSpans()

const ON_2dex ON_NurbsCurve::ControlPointSpans ( int  control_point_index) const

Get the indices of the spans where the specified control point is active. Note that a NURBS curve with n control points has (n-degree) many spans. If 0 &lt= span_index < (n-degree), then CV(span_index), ..., CV(span_index+degree) and {knot[span_index], ..., knot[span_index+2*degree-1]} are the control points and knots that are active in that span. The domain of the span is [knot[span_index+degree-1], knot[span_index+degree]].

Parameters
control_point_index0 <= control_point_index < control_point_count
Returns
If the input is valid, then the spans whose index satisfies ON_2dex.i <= span_index < ON_2dex.j use the specified control point. If the iput is not valid, then ON_2dex(0,0) is returned.

◆ ControlPointSupport()

const ON_Interval ON_NurbsCurve::ControlPointSupport ( int  control_point_index) const

Get the interval in the curve's domain where the specified control point is active (helps determine the value of the curve). The returned inteval will be contained in the curve's domain. Put another way, if ControlPointSupport(i).Contains(t) is false, then curve->PointAt(t) does not depend on the location of CV(i).

Parameters
control_point_indexIndex of the control point. 0 < = control_point_index < CVCount().
Returns
The parameter interval where the specified control point is active.

◆ ControlPolygonLength()

double ON_NurbsCurve::ControlPolygonLength ( ) const

returns the length of the control polygon

◆ ConvertSpanToBezier()

bool ON_NurbsCurve::ConvertSpanToBezier ( int  ,
ON_BezierCurve  
) const

Converts a span of the NURBS curve into a bezier. If the span is empty (m_knot[span_index+m_order-2] == m_knot[span_index+m_order-1]), then false is returned.

◆ Create()

bool ON_NurbsCurve::Create ( int  dimension,
bool  bIsRational,
int  order,
int  cv_count 
)

Description: Create a NURBS curve with knot a cv memory allocated. Parameters: dimension - [in] (>= 1) bIsRational - [in] true to make a rational NURBS order - [in] (>= 2) The order=degree+1 cv_count - [in] (>= order) number of control vertices

◆ CreateClampedUniformNurbs()

bool ON_NurbsCurve::CreateClampedUniformNurbs ( int  dimension,
int  order,
int  point_count,
const ON_3dPoint point,
double  knot_delta = 1.0 
)

Description: Create a clamped uniform NURBS curve from a list of control points Parameters: dimension - [in] 1, 2 or 3 order - [in] (>=2) order=degree+1 point_count - [in] (>=order) number of control vertices point - [in] array of control vertex locations. knot_delta - in knot spacing Returns: true if successful

◆ CreatePeriodicUniformNurbs()

bool ON_NurbsCurve::CreatePeriodicUniformNurbs ( int  dimension,
int  order,
int  point_count,
const ON_3dPoint point,
double  knot_delta = 1.0 
)

Description: Create a periodic uniform NURBS curve from a list of control points Parameters: dimension - [in] 1, 2 or 3 order - [in] (>=2) order=degree+1 point_count - [in] (>=max(3,order-1)) number of distinct control vertices point - [in] array of distinct control vertex locations. knot_delta - in knot spacing Returns: true if successful

◆ CV()

double* ON_NurbsCurve::CV ( int  cv_index) const

Description: Expert user function to get a pointer to control vertex memory. If you are not an expert user, please use ON_NurbsCurve::GetCV( ON_3dPoint& ) or ON_NurbsCurve::GetCV( ON_4dPoint& ). Parameters: cv_index - [in] Returns: Pointer to control vertex. Remarks: If the NURBS curve is rational, the format of the returned array is a homogeneous rational point with length m_dim+1. If the NURBS curve is not rational, the format of the returned array is a nonrational euclidean point with length m_dim. See Also ON_NurbsCurve::CVStyle ON_NurbsCurve::GetCV ON_NurbsCurve::Weight

◆ CVCapacity()

int ON_NurbsCurve::CVCapacity ( ) const

Returns: If this class is managing m_cv, then CVCapacity() is the number of doubles m_cv[] can accommodate. Otherwise, CVCapacity() is 0.

◆ CVCount()

int ON_NurbsCurve::CVCount ( void  ) const

◆ CVSize()

int ON_NurbsCurve::CVSize ( void  ) const

◆ CVStyle()

ON::point_style ON_NurbsCurve::CVStyle ( ) const

Description: Returns the style of control vertices in the m_cv array. Returns: @untitled table ON::not_rational m_is_rat is false ON::homogeneous_rational m_is_rat is true

◆ DataCRC()

ON__UINT32 ON_NurbsCurve::DataCRC ( ON__UINT32  current_remainder) const
overridevirtual

virtual ON_Object::DataCRC override

Reimplemented from ON_Object.

◆ Degree()

int ON_NurbsCurve::Degree ( ) const
overridevirtual

Description: virtual ON_Curve::Degree override. Returns: m_order-1

Implements ON_Curve.

◆ Destroy()

void ON_NurbsCurve::Destroy ( )

Description: Deallocate knot and cv memory. Zeros all fields.

◆ Dimension()

int ON_NurbsCurve::Dimension ( ) const
overridevirtual

ON_Geometry overrides.

Description: virtual ON_Geometry::Dimension override Returns: value of m_dim

Reimplemented from ON_Geometry.

◆ Domain()

ON_Interval ON_NurbsCurve::Domain ( ) const
overridevirtual

ON_Curve overrides.

Description: virtual ON_Curve::Domain override. Returns: domain of the NURBS curve.

Implements ON_Curve.

◆ Dump()

void ON_NurbsCurve::Dump ( ON_TextLog dump) const
overridevirtual

Description: virtual ON_Object::Dump override

Reimplemented from ON_Object.

◆ EmergencyDestroy()

void ON_NurbsCurve::EmergencyDestroy ( )

Description: Call if memory used by ON_NurbsCurve becomes invalid.

◆ Evaluate()

bool ON_NurbsCurve::Evaluate ( double  ,
int  ,
int  ,
double *  ,
int  = 0,
int *  = 0 
) const
overridevirtual

Description: virtual ON_Curve::Evaluate override.

Implements ON_Curve.

◆ Extend()

bool ON_NurbsCurve::Extend ( const ON_Interval domain)
overridevirtual

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.
Will not work if curve is closed. Original curve is identical to the restriction of the resulting curve to the original curve domain, Returns: true if successful.

Reimplemented from ON_Curve.

◆ GetBBox()

bool ON_NurbsCurve::GetBBox ( double *  boxmin,
double *  boxmax,
bool  bGrowBox = false 
) const
overridevirtual

virtual ON_Geometry GetBBox override

Reimplemented from ON_Geometry.

◆ GetClosestPoint()

bool ON_NurbsCurve::GetClosestPoint ( const ON_3dPoint test_point,
double *  t,
double  maximum_distance = 0.0,
const ON_Interval sub_domain = nullptr 
) const
overridevirtual

Find parameter of the point on a curve that is closest to test_point. If the maximum_distance parameter is > 0, then only points whose distance to the given point is <= maximum_distance will be returned. Using a positive value of maximum_distance can substantially speed up the search. If the sub_domain parameter is not nullptr, then the search is restricted to the specified portion of the curve.

true if returned if the search is successful. false is returned if the search fails.

Parameters
tparameter of local closest point returned here
maximum_distancemaximum_distance
sub_domainsub_domain

Reimplemented from ON_Curve.

◆ GetCubicBezierApproximation() [1/2]

double ON_NurbsCurve::GetCubicBezierApproximation ( double  max_deviation,
class ON_BezierCurve bezierCurve 
) const

Description: Approximate the entire NURBS curve with a single nonrational cubic bezier curve. Typically, the NURBS curve has only a few bispans. Parameters: max_deviation - [in] If max_deviation >= 0.0, then the approximation is returned only if the deviation sample is <= max_deviation. bezierCurve - [out] Returns: ON_DBL_QNAN: no bezier curve is returned. If a bezier curve is returned, then the maximum deviation between the bezier curve this NURBS curve sampled at the Greville abcissa.

◆ GetCubicBezierApproximation() [2/2]

double ON_NurbsCurve::GetCubicBezierApproximation ( double  max_deviation,
ON_3dPoint  bezCV[4] 
) const

Description: Approximate the entire NURBS surface with a single nonrational cubic bezier surface. Typically, the NURBS surface has only a few bispans. Parameters: max_deviation - [in] If max_deviation >= 0.0, then the approximation is returned only if the deviation sample is <= max_deviation. bezierSurface - [out] Returns: ON_DBL_QNAN: no bezier surface is returned. If a bezier surface is returned, then the maximum deviation between the bezier surface this NURBS surface sampled at the Greville abcissa.

◆ GetCurveParameterFromNurbFormParameter()

bool ON_NurbsCurve::GetCurveParameterFromNurbFormParameter ( double  nurbs_t,
double *  curve_t 
) const
overridevirtual

Description: virtual ON_Curve::GetCurveParameterFromNurbFormParameter override

Reimplemented from ON_Curve.

◆ GetCV() [1/3]

bool ON_NurbsCurve::GetCV ( int  ,
ON::point_style  ,
double *   
) const

◆ GetCV() [2/3]

bool ON_NurbsCurve::GetCV ( int  ,
ON_3dPoint  
) const

◆ GetCV() [3/3]

bool ON_NurbsCurve::GetCV ( int  ,
ON_4dPoint  
) const

◆ GetGrevilleAbcissae()

bool ON_NurbsCurve::GetGrevilleAbcissae ( double *  ) const

◆ GetNextDiscontinuity()

bool ON_NurbsCurve::GetNextDiscontinuity ( ON::continuity  c,
double  t0,
double  t1,
double *  t,
int *  hint = nullptr,
int *  dtype = nullptr,
double  cos_angle_tolerance = ON_DEFAULT_ANGLE_TOLERANCE_COSINE,
double  curvature_tolerance = ON_SQRT_EPSILON 
) const
overridevirtual

Description: Search for a derivative, tangent, or curvature discontinuity. Parameters: c - [in] type of continuity to test for. If ON::continuity::C1_continuous t0 - [in] search begins at t0 t1 - [in] (t0 < t1) search ends at t1 t - [out] if a discontinuity is found, the *t reports the parameter at the discontinuity. hint - [in/out] if GetNextDiscontinuity will be called repeatedly, passing a "hint" with initial value *hint=0 will increase the speed of the search.
dtype - [out] if not nullptr, *dtype reports the kind of discontinuity found at *t. A value of 1 means the first derivative or unit tangent was discontinuous. A value of 2 means the second derivative or curvature was discontinuous. cos_angle_tolerance - [in] default = cos(1 degree) Used only when c is ON::continuity::G1_continuous or ON::continuity::G2_continuous. If the cosine of the angle between two tangent vectors is <= cos_angle_tolerance, then a G1 discontinuity is reported. curvature_tolerance - [in] (default = ON_SQRT_EPSILON) Used only when c is ON::continuity::G2_continuous or ON::continuity::Gsmooth_continuous.
ON::continuity::G2_continuous: If K0 and K1 are curvatures evaluated from above and below and |K0 - K1| > curvature_tolerance, then a curvature discontinuity is reported. ON::continuity::Gsmooth_continuous: If K0 and K1 are curvatures evaluated from above and below and the angle between K0 and K1 is at least twice angle tolerance or ||K0| - |K1|| > (max(|K0|,|K1|) > curvature_tolerance, then a curvature discontinuity is reported. Returns: true if a discontinuity was found on the interior of the interval (t0,t1). Remarks: Overrides ON_Curve::GetNextDiscontinuity.

Reimplemented from ON_Curve.

◆ GetNurbForm()

int ON_NurbsCurve::GetNurbForm ( ON_NurbsCurve nurbsform,
double  tolerance = 0.0,
const ON_Interval subdomain = nullptr 
) const
overridevirtual

Description: virtual ON_Curve::GetNurbForm override.

Parameters
nurbsformreturns 0: unable to create NURBS representation with desired accuracy. 1: success - returned NURBS parameterization matches the curve's to the 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.
subdomainOPTIONAL subdomain of curve

Reimplemented from ON_Curve.

◆ GetNurbFormParameterFromCurveParameter()

bool ON_NurbsCurve::GetNurbFormParameterFromCurveParameter ( double  curve_t,
double *  nurbs_t 
) const
overridevirtual

Description: virtual ON_Curve::GetNurbFormParameterFromCurveParameter override

Reimplemented from ON_Curve.

◆ GetParameterTolerance()

bool ON_NurbsCurve::GetParameterTolerance ( double  t,
double *  tminus,
double *  tplus 
) const
overridevirtual

Description: virtual ON_Curve::GetParameterTolerance override.

Parameters
treturns tminus < tplus: parameters tminus <= s <= tplus

Reimplemented from ON_Curve.

◆ GetSpanVector()

bool ON_NurbsCurve::GetSpanVector ( double *  knot_values) const
overridevirtual

Description: virtual ON_Curve::GetSpanVector override. Get number of parameters of distinct knots in NURBS curve's domain. Parameters: knot_values - [out] an array of length SpanCount()+1 is filled in with the distinct knot values in the list (m_knot[m_order-2],...,m_knot[m_cv_count-1) Returns: true if successful

Implements ON_Curve.

◆ GrevilleAbcissa()

double ON_NurbsCurve::GrevilleAbcissa ( int  ) const

◆ GrevilleInterpolate() [1/4]

bool ON_NurbsCurve::GrevilleInterpolate ( const double *  points,
size_t  point_count,
size_t  point_stride,
bool  bPeriodic 
)

Modify the control points so the curve interpolates points[] at the Greville abcissa of the current knot vector. The curve's dimension, rational, order, control point count, properties must be set. If this curve is rational, the control point weights must be set.

Parameters
pointspoints to interpolate. These have dimension >= Dimension().
point_countNUmber of points. If bPeriodic is false, point_count must have length CVCount(). If bPeriodic is true, point_count must have length CVCount() - Degree().
point_strideNumber of doubles to skip between points. (point_stride >= Dimension()).
bPeriodicTrue if the resulting curve should be periodic.
Returns
True if successful.

◆ GrevilleInterpolate() [2/4]

bool ON_NurbsCurve::GrevilleInterpolate ( const double *  points,
size_t  point_count,
size_t  point_stride,
bool  bPeriodic,
int  cv0,
int  cv1 
)

Modify the control points so the curve interpolates points[] at the Greville abcissa of the current knot vector. The curve's dimension, rational, order, control point count, properties must be set. If this curve is rational, the control point weights must be set.

Parameters
pointspoints to interpolate. These have dimension >= Dimension().
point_countNumber of points. This must be identical to cv1-cv0.
point_strideNumber of doubles to skip between points. (point_stride >= this Dimension()).
bPeriodicTrue if the resulting curve should be periodic.


Parameters
cv00 <= cv0 < cv1 <= CVCount(). The free control points have indices i satisfying cv0 <= i < cv1.
cv10 <= cv0 < cv1 <= CVCount(). The free control points have indices i satisfying cv0 <= i < cv1.
Returns
True if successful.

◆ GrevilleInterpolate() [3/4]

bool ON_NurbsCurve::GrevilleInterpolate ( const ON_SimpleArray< ON_3dPoint > &  points,
bool  bPeriodic 
)

Modify the control points so the curve interpolates points[] at the Greville abcissa of the current knot vector. The curve's dimension rational, order, control point count, properties must be set. The curve must have dimension <= 3. If this curve is rational, the control point weights must be set.

Parameters
pointsIf bPeriodic is false, points[] must have length CVCount(). If bPeriodic is true, points[] must have length CVCount() - Degree().
bPeriodicTrue if the resulting curve should be periodic.
Returns
True if successful.

◆ GrevilleInterpolate() [4/4]

bool ON_NurbsCurve::GrevilleInterpolate ( const ON_SimpleArray< ON_3dPoint > &  points,
bool  bPeriodic,
int  cv0,
int  cv1 
)

Modify the control points so the curve interpolates points[] at the Greville abcissa of the current knot vector. The curve's dimension rational, order, control point count, properties must be set. The curve must have dimension <= 3. If this curve is rational, the control point weights must be set.

Parameters
pointspoints to interpolate. points[] must have length (cv1-cv0).
bPeriodicTrue if the resulting curve should be periodic.


Parameters
cv00 <= cv0 < cv1 <= CVCount(). The free control points have indices i satisfying cv0 <= i < cv1.
cv10 <= cv0 < cv1 <= CVCount(). The free control points have indices i satisfying cv0 <= i < cv1.
Returns
True if successful.

◆ HasBezierSpans()

bool ON_NurbsCurve::HasBezierSpans ( ) const

Returns true if the NURBS curve has bezier spans (all distinct knots have multiplitity = degree)

◆ HasNurbForm()

int ON_NurbsCurve::HasNurbForm ( ) const
overridevirtual

Description: virtual ON_Curve::HasNurbForm override.

Reimplemented from ON_Curve.

◆ IncreaseDegree()

bool ON_NurbsCurve::IncreaseDegree ( int  desired_degree)

◆ Initialize()

void ON_NurbsCurve::Initialize ( void  )

Description: Zeros all fields.

◆ InsertKnot()

bool ON_NurbsCurve::InsertKnot ( double  knot_value,
int  knot_multiplicity 
)

Description: Insert a knot and update cv locations. Parameters: knot_value - [in] m_knot[order-2] < knot_value < m_knot[m_cv_count-1] knot_multiplicity - [in] 1 to degree - includes multiplicity of existing knots. Remarks: Does not change parameterization or locus of curve. Returns: true if successful

◆ IsArc()

bool ON_NurbsCurve::IsArc ( const ON_Plane plane = nullptr,
ON_Arc arc = nullptr,
double  tolerance = ON_ZERO_TOLERANCE 
) const
overridevirtual

Description: virtual ON_Curve::IsArc override.

Reimplemented from ON_Curve.

◆ IsClamped()

bool ON_NurbsCurve::IsClamped ( int  end = 2) const

Description: Test the knot vector to see if it is clamped. Parameters: end: 0: test start 1: test end 2: test start and end.

◆ IsClosed()

bool ON_NurbsCurve::IsClosed ( ) const
overridevirtual

Description: virtual ON_Curve::IsClosed override. Returns: true if NURBS curve is closed. (Either curve has clamped end knots and euclidean location of start CV = euclidean location of end CV, or curve is periodic.)

Reimplemented from ON_Curve.

◆ IsContinuous()

bool ON_NurbsCurve::IsContinuous ( ON::continuity  c,
double  t,
int *  hint = nullptr,
double  point_tolerance = ON_ZERO_TOLERANCE,
double  d1_tolerance = ON_ZERO_TOLERANCE,
double  d2_tolerance = ON_ZERO_TOLERANCE,
double  cos_angle_tolerance = ON_DEFAULT_ANGLE_TOLERANCE_COSINE,
double  curvature_tolerance = ON_SQRT_EPSILON 
) const
overridevirtual

Description: Test continuity at a curve parameter value. Parameters: c - [in] continuity to test for t - [in] parameter to test hint - [in] evaluation hint point_tolerance - [in] if the distance between two points is greater than point_tolerance, then the curve is not C0. d1_tolerance - [in] if the difference between two first derivatives is greater than d1_tolerance, then the curve is not C1. d2_tolerance - [in] if the difference between two second derivatives is greater than d2_tolerance, then the curve is not C2. cos_angle_tolerance - [in] default = cos(1 degree) Used only when c is ON::continuity::G1_continuous or ON::continuity::G2_continuous. If the cosine of the angle between two tangent vectors is <= cos_angle_tolerance, then a G1 discontinuity is reported. curvature_tolerance - [in] (default = ON_SQRT_EPSILON) Used only when c is ON::continuity::G2_continuous or ON::continuity::Gsmooth_continuous.
ON::continuity::G2_continuous: If K0 and K1 are curvatures evaluated from above and below and |K0 - K1| > curvature_tolerance, then a curvature discontinuity is reported. ON::continuity::Gsmooth_continuous: If K0 and K1 are curvatures evaluated from above and below and the angle between K0 and K1 is at least twice angle tolerance or ||K0| - |K1|| > (max(|K0|,|K1|) > curvature_tolerance, then a curvature discontinuity is reported. Returns: true if the curve has at least the c type continuity at the parameter t. Remarks: Overrides ON_Curve::IsContinuous.

Reimplemented from ON_Curve.

◆ IsDeformable()

bool ON_NurbsCurve::IsDeformable ( ) const
overridevirtual

virtual ON_Geometry::IsDeformable() override

Reimplemented from ON_Geometry.

◆ IsDuplicate()

bool ON_NurbsCurve::IsDuplicate ( const ON_NurbsCurve other,
bool  bIgnoreParameterization,
double  tolerance = ON_ZERO_TOLERANCE 
) const

Description: See if this and other are same NURBS geometry. Parameters: other - [in] other NURBS curve bIgnoreParameterization - [in] if true, parameterization and orientation are ignored. tolerance - [in] tolerance to use when comparing control points. Returns: true if curves are the same.

◆ IsInPlane()

bool ON_NurbsCurve::IsInPlane ( const ON_Plane test_plane,
double  tolerance = ON_ZERO_TOLERANCE 
) const
overridevirtual

Description: virtual ON_Curve::IsInPlane override.

Implements ON_Curve.

◆ IsLinear()

bool ON_NurbsCurve::IsLinear ( double  tolerance = ON_ZERO_TOLERANCE) const
overridevirtual

Description: virtual ON_Curve::IsLinear override.

Reimplemented from ON_Curve.

◆ IsMorphable()

bool ON_NurbsCurve::IsMorphable ( ) const
overridevirtual

virtual ON_Geometry override

Reimplemented from ON_Geometry.

◆ IsNatural()

bool ON_NurbsCurve::IsNatural ( int  end = 2) const

Description: Test the start or end of a curve to see if it's natural (Zero 2nd derivative). Parameters: end: 0: test start 1: test end 2: test start and end.

◆ IsPeriodic()

bool ON_NurbsCurve::IsPeriodic ( ) const
overridevirtual

Description: virtual ON_Curve::IsPeriodic override. Returns: true if NURBS curve is periodic (degree > 1, periodic knot vector, last degree many CVs are duplicates of first degree many CVs).

Reimplemented from ON_Curve.

◆ IsPlanar()

bool ON_NurbsCurve::IsPlanar ( ON_Plane plane = nullptr,
double  tolerance = ON_ZERO_TOLERANCE 
) const
overridevirtual

Description: virtual ON_Curve::IsPlanar override.

Reimplemented from ON_Curve.

◆ IsPolyline()

int ON_NurbsCurve::IsPolyline ( ON_SimpleArray< ON_3dPoint > *  pline_points = nullptr,
ON_SimpleArray< double > *  pline_t = nullptr 
) const
overridevirtual

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 nullptr and true is returned, then the points of the polyline form are returned here. t - [out] if not nullptr 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

Reimplemented from ON_Curve.

◆ IsRational()

bool ON_NurbsCurve::IsRational ( void  ) const

Interface.

◆ IsShort()

bool ON_NurbsCurve::IsShort ( double  tolerance,
const ON_Interval sub_domain = 0,
double *  length_estimate = 0 
) const
overridevirtual

Description: Used to quickly find short curves. Parameters: tolerance - [in] (>=0) sub_domain - [in] If not nullptr, the test is performed on the interval that is the intersection of sub_domain with Domain(). Returns: True if the length of the curve is <= tolerance. Remarks: Faster than calling Length() and testing the result.

Reimplemented from ON_Curve.

◆ IsSingular()

bool ON_NurbsCurve::IsSingular ( ) const

Returns: True if every span in the NURBS curve is singular. See Also: ON_NurbsCurve::RepairBadKnots() ON_NurbsCurve::RemoveShortSegments()

◆ IsSubDFriendly()

bool ON_NurbsCurve::IsSubDFriendly ( bool  bPermitCreases) const

Returns: True if this NURBS curve is cubic, non-rational, uniform, and is either periodic or has clamped end knots. Parameters: bPermitCreases - [in] If true, then a curve with clamped end knots may have interior triple knots. Remarks: The value of SubDFriendlyTag() is ignored. See Also: SubDFriendlyTag().

◆ IsValid()

bool ON_NurbsCurve::IsValid ( class ON_TextLog text_log = nullptr) const
overridevirtual

ON_Object overrides.

Reimplemented from ON_Geometry.

◆ Knot() [1/2]

const double* ON_NurbsCurve::Knot ( ) const

Description: Get pointer to knot vector array. Returns: pointer to knot vector array (m_knot). See Also: ON_NurbsCurve::SetKnot, ON_NurbsCurve::Knot, ON_NurbsCurve::InsertKnot

◆ Knot() [2/2]

double ON_NurbsCurve::Knot ( int  knot_index) const

Description: Get knot value. Parameters: knot_index - [in] 0 <= knot_index <= KnotCount()-1 Returns: knot value = m_knot[knot_index] See Also: ON_NurbsCurve::SetKnot, ON_NurbsCurve::KnotMultiplicity

◆ KnotCapacity()

int ON_NurbsCurve::KnotCapacity ( ) const

Returns: If this class is managing m_knot, then KnotCapacity() is the number of doubles m_knot[] can accommodate. Otherwise, KnotCapacity() is 0.

◆ KnotCount()

int ON_NurbsCurve::KnotCount ( void  ) const

◆ KnotMultiplicity()

int ON_NurbsCurve::KnotMultiplicity ( int  knot_index) const

Description: Get knot multiplicity. Parameters: knot_index - [in] 0 <= knot_index <= KnotCount()-1 Returns: knot multiplicity = m_knot[knot_index] See Also: ON_NurbsCurve::SetKnot, ON_NurbsCurve::Knot, ON_NurbsCurve::InsertKnot

◆ MakeClampedUniformKnotVector()

bool ON_NurbsCurve::MakeClampedUniformKnotVector ( double  delta = 1.0)

Description: Make knot vector a clamped uniform knot vector based on the current values of m_order and m_cv_count. Does not change values of control vertices. Parameters: delta - in knot spacing. Returns: true if successful. Remarks: Allocates m_knot[] if it is not big enough. See Also: ON_MakeClampedUniformKnotVector

◆ MakeDeformable()

bool ON_NurbsCurve::MakeDeformable ( )
overridevirtual

virtual ON_Geometry::MakeDeformable() override

Reimplemented from ON_Geometry.

◆ MakeNonRational()

bool ON_NurbsCurve::MakeNonRational ( )

◆ MakePeriodicUniformKnotVector()

bool ON_NurbsCurve::MakePeriodicUniformKnotVector ( double  delta = 1.0)

Description: Make knot vector a periodic uniform knot vector based on the current values of m_order and m_cv_count. Does not change values of control vertices. Parameters: delta - in knot spacing. Returns: true if successful. Remarks: Allocates m_knot[] if it is not big enough. See Also: ON_MakePeriodicUniformKnotVector

◆ MakePiecewiseBezier()

bool ON_NurbsCurve::MakePiecewiseBezier ( bool  bSetEndWeightsToOne = false)

Description: Clamps ends and adds knots so the NURBS curve has bezier spans (all distinct knots have multiplitity = degree). Parameters: bSetEndWeightsToOne - [in] If true and the first or last weight is not one, then the first and last spans are reparameterized so that the end weights are one. Returns: true if successful.

◆ MakeRational()

bool ON_NurbsCurve::MakeRational ( )

◆ ManageKnotForExperts()

void ON_NurbsCurve::ManageKnotForExperts ( int  knot_capacity,
double *  knot 
)

Description: Unconditionally transfer knot management to this NURBS curve. Sets KnotCapacity() to knot_capacity and m_knot to knot. If knot_capacity > 0, then knot must point to memory allocated by onmalloc()/onrealloc(). Parameters: knot_capacity - [in] KnotCapacity() is set to knot_capacity. knot - [in] m_knot is set to knot.

◆ Morph()

bool ON_NurbsCurve::Morph ( const ON_SpaceMorph morph)
override

virtual ON_Geometry override

◆ New() [1/4]

static ON_NurbsCurve* ON_NurbsCurve::New ( )
static

Description: Use ON_NurbsCurve::New(...) instead of new ON_NurbsCurve(...) Returns: Pointer to an ON_NurbsCurve. Destroy by calling delete. Remarks: See static ON_Brep* ON_Brep::New() for details.

◆ New() [2/4]

static ON_NurbsCurve* ON_NurbsCurve::New ( const ON_BezierCurve bezier_curve)
static

◆ New() [3/4]

static ON_NurbsCurve* ON_NurbsCurve::New ( const ON_NurbsCurve nurbs_curve)
static

◆ New() [4/4]

static ON_NurbsCurve* ON_NurbsCurve::New ( int  dimension,
bool  bIsRational,
int  order,
int  cv_count 
)
static

◆ operator=() [1/2]

ON_NurbsCurve& ON_NurbsCurve::operator= ( const ON_BezierCurve bezier_curve)

Description: Set NURBS curve equal to bezier with domain [0,1]. Parameters: bezier_curve - [in]

◆ operator=() [2/2]

ON_NurbsCurve& ON_NurbsCurve::operator= ( const ON_NurbsCurve src)

◆ Order()

int ON_NurbsCurve::Order ( void  ) const

◆ Read()

bool ON_NurbsCurve::Read ( ON_BinaryArchive binary_archive)
overridevirtual

Description: virtual ON_Object::Read override

Reimplemented from ON_Object.

◆ RemoveKnots()

bool ON_NurbsCurve::RemoveKnots ( int  i0,
int  i1,
double  tolerance = 0.0 
)

Description: Remove knots from a curve and adjust the remaining control points to maintain curve position as closely as possible. Parameters: i0, i1 - [in] ( Order()-2 < i0 < i1 <= CVCount()-1 The knots from Knot(i0) through Knot(i1-1) will be removed. tolerance -in If tolerance > 0, then the knots are removed only if the resulting TL_NurbsCurve will match the input TL_NurbsCurve within the specified tolerance. If tolerance == 0.0, the knots are removed and the geometry of the resulting NURBS matches that of the input NURBS as closely as possible. Returns: true if successful.

Parameters
i0Knot(i0), ..., Knot(i1-1) will be removed
tolerance>=0.0. use 0.0 for no tolerance checking

◆ RemoveShortSegments()

bool ON_NurbsCurve::RemoveShortSegments ( double  tolerance,
bool  bRemoveShortSegments = true 
)
overridevirtual

Description: Looks for segments that are shorter than tolerance that can be removed. If bRemoveShortSegments is true, then the short segments are removed. Does not change the domain, but it will change the relative parameterization. Parameters: tolerance - [in] bRemoveShortSegments - [in] If true, then short segments are removed. Returns: True if removable short segments can were found. False if no removable short segments can were found. See Also: ON_NurbsCurve::RepairBadKnots

Reimplemented from ON_Curve.

◆ RemoveSingularSpans()

int ON_NurbsCurve::RemoveSingularSpans ( )

Returns: Number of spans removed.

◆ RemoveSpan()

bool ON_NurbsCurve::RemoveSpan ( int  span_index)

Parameters: span_index - [in] The index of a non-empty span to remove. span_index >= 0 span_index <= m_cv_count-m_order m_knot[span_index+m_order-2] < m_knot[span_index+m_order-1] Returns: True if the span was successfully removed. Remarks: The NURBS curve must have 2 or more spans (m_cv_count > m_order). Set m0 = multiplicity of the knot at m_knot[span_index+m_order-2] and m1 = multiplicity of the knot at m_knot[span_index+m_order-1]. If (m0 + m1) < degree, then the degree-(m0+m1) cvs will be added to the NURBS curve. If (m0+m1) > degree, then (m0+m1)-degree cvs will be removed from the curve. See Also: ON_NurbsCurve::RepairBadKnots() ON_NurbsCurve::RemoveShortSegments()

◆ RepairBadKnots()

bool ON_NurbsCurve::RepairBadKnots ( double  knot_tolerance = 0.0,
bool  bRepair = true 
)

Description: Looks for problems caused by knots that are close together or have multiplicity >= order. If bRepair is true, the problems are fixed. Does not change the domain. Parameters: knot_tolerance - [in] >= 0 When in doubt, use zero. bRepair - [in] If true, then problems are repaired. Otherwise this function looks for problems that can be repaired, but does not modify the curve. Returns: True if bad knots were found and can be repaired. See Also: ON_NurbsCurve::RemoveShortSegments

◆ Reparameterize()

bool ON_NurbsCurve::Reparameterize ( double  c)

Description: Use a linear fractional transformation to reparameterize the NURBS curve. This does not change the curve's domain. Parameters: c - [in] reparameterization constant (generally speaking, c should be > 0). The control points and knots are adjusted so that output_nurbs(t) = input_nurbs(lambda(t)), where lambda(t) = c*t/( (c-1)*t + 1 ). Note that lambda(0) = 0, lambda(1) = 1, lambda'(t) > 0, lambda'(0) = c and lambda'(1) = 1/c. Returns: true if successful.
Remarks: The cv and knot values are values are changed so that output_nurbs(t) = input_nurbs(lambda(t)). See Also: ON_ReparameterizeRationalNurbsCurve

◆ ReserveCVCapacity()

bool ON_NurbsCurve::ReserveCVCapacity ( int  )

Tools for managing CV and knot memory.

◆ ReserveKnotCapacity()

bool ON_NurbsCurve::ReserveKnotCapacity ( int  )

◆ Reverse()

bool ON_NurbsCurve::Reverse ( )
overridevirtual

Description: virtual ON_Curve::Reverse override. Reverse parameterization by negating all knots and reversing the order of the control vertices. Remarks: Domain changes from [a,b] to [-b,-a]

Implements ON_Curve.

◆ SetCV() [1/3]

bool ON_NurbsCurve::SetCV ( int  ,
const ON_3dPoint  
)

◆ SetCV() [2/3]

bool ON_NurbsCurve::SetCV ( int  ,
const ON_4dPoint  
)

◆ SetCV() [3/3]

bool ON_NurbsCurve::SetCV ( int  ,
ON::point_style  ,
const double *   
)

◆ SetDomain()

bool ON_NurbsCurve::SetDomain ( double  t0,
double  t1 
)
overridevirtual

Description: virtual ON_Curve::SetDomain override. Set the domain of the curve Parameters: t0 - [in] t1 - [in] new domain will be [t0,t1] Returns: true if successful.

Reimplemented from ON_Curve.

◆ SetEndPoint()

bool ON_NurbsCurve::SetEndPoint ( ON_3dPoint  end_point)
overridevirtual

virtual

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

Reimplemented from ON_Curve.

◆ SetKnot()

bool ON_NurbsCurve::SetKnot ( int  knot_index,
double  knot_value 
)

Description: Set knot value. Parameters: knot_index - [in] 0 <= knot_index <= KnotCount()-1 knot_value - [in] Remarks: m_knot[] must exist. Use ReserveKnotCapacity to allocate m_knot[]. Returns: true if successful See Also: ON_NurbsCurve::ReserveKnotCapacity

◆ SetStartPoint()

bool ON_NurbsCurve::SetStartPoint ( ON_3dPoint  start_point)
overridevirtual

virtual

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

Reimplemented from ON_Curve.

◆ SetSubDFriendlyTag()

void ON_NurbsCurve::SetSubDFriendlyTag ( bool  bSubDFriendlyTag)

Description: Set the curve's SubDFriendlyTag() property. Parameters: bSubDFriendlyTag - [in] If bSubDFriendlyTag is true and IsSubDFriendly(true) is true, then the SubDFriendlyTag() property is set to true. Otherwise the SubDFriendlyTag property is set to false.

◆ SetUnclampedTagForExperts()

void ON_NurbsCurve::SetUnclampedTagForExperts ( bool  bUnclampedTag)

Description: Set the curve's UnclampedTag() property. Parameters: bUnclampedTag - [in] If bUnclampedTag is true, the curve has unclamped knots, and the curve is not periodic, then the UnclampedTag() property is set to true. Otherwise the UnclampedTag() property is set to false.

◆ SetWeight()

bool ON_NurbsCurve::SetWeight ( int  ,
double   
)

Description: Set value of control vertex weight. If curve is non-rational, it will be converted to rational.

◆ SizeOf()

unsigned int ON_NurbsCurve::SizeOf ( ) const
overridevirtual

virtual ON_Object::SizeOf override

Reimplemented from ON_Curve.

◆ SpanCount()

int ON_NurbsCurve::SpanCount ( ) const
overridevirtual

Description: virtual ON_Curve::SpanCount override. Get number of nonempty smooth (c-infinity) spans in curve Returns: Number of nonempty smooth (c-infinity) spans. Remarks: A nonempty span is bracketed by knots m_knot[i] < m_knot[i+1] with m_order-2 <= i < m_cv_count-1.

Implements ON_Curve.

◆ SpanIsLinear() [1/2]

bool ON_NurbsCurve::SpanIsLinear ( int  span_index,
double  min_length,
double  tolerance 
) const

Parameters: span_index - [in] (0 <= span_index <= m_cv_count-m_order) min_length -[in] minimum length of a linear span tolerance -[in] distance tolerance to use when checking control points between the span ends Returns true if the span is a non-degenerate line. This means:

  • dimension = 2 or 3
  • There are full multiplicity knots at each end of the span.
  • The length of the the line segment from the span's initial control point to the span's final control point is >= min_length.
  • The distance from the line segment to the interior control points is <= tolerance and the projections of these points onto the line increases monotonically.

◆ SpanIsLinear() [2/2]

bool ON_NurbsCurve::SpanIsLinear ( int  span_index,
double  min_length,
double  tolerance,
ON_Line line 
) const

◆ SpanIsSingular()

bool ON_NurbsCurve::SpanIsSingular ( int  span_index) const

Parameters: span_index - [in] The index of a non-empty span to test. span_index >= 0 span_index <= m_cv_count-m_order m_knot[span_index+m_order-2] < m_knot[span_index+m_order-1] Returns: true if the span_index parameter is valid and the span is singular (collapsed to a point). false if the span is not singular or span_index does not identify a non-empty span.

◆ Split()

bool ON_NurbsCurve::Split ( double  split_param,
ON_Curve *&  left_result,
ON_Curve *&  right_result 
) const
overridevirtual

Description: virtual ON_Curve::Split override.

Split() divides the curve at the specified parameter. The parameter must be in the interior of the curve's domain. The pointers passed to ON_NurbsCurve::Split must either be nullptr or point to an ON_NurbsCurve. If the pointer is nullptr, then a curve will be created in Split(). You may pass "this" as one of the pointers to Split(). For example,

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.

Parameters
split_paramt = curve parameter to split curve at
left_resultleft portion returned here (must be an ON_NurbsCurve)
right_resultright portion returned here (must be an ON_NurbsCurve)

Reimplemented from ON_Curve.

◆ SubDFriendlyTag()

bool ON_NurbsCurve::SubDFriendlyTag ( ) const

Returns: True if this curve was explicitly tagged as SubDFriendly and is currently SubDFriendly.

◆ SuperfluousKnot()

double ON_NurbsCurve::SuperfluousKnot ( int  ) const

◆ SwapCoordinates()

bool ON_NurbsCurve::SwapCoordinates ( int  i,
int  j 
)
overridevirtual

Description: virtual ON_Geometry::SwapCoordinates override. Swaps control vertex coordinate values with indices i and j. Parameters: i - [in] coordinate index j - [in] coordinate index

Reimplemented from ON_Geometry.

◆ Transform()

bool ON_NurbsCurve::Transform ( const ON_Xform xform)
overridevirtual

Description: virtual ON_Geometry::Transform override. Transforms the NURBS curve.

Parameters: xform - [in] transformation to apply to object.

Remarks: When overriding this function, be sure to include a call to ON_Object::TransformUserData() which takes care of transforming any ON_UserData that may be attached to the object.

Reimplemented from ON_Curve.

◆ Trim()

bool ON_NurbsCurve::Trim ( const ON_Interval )
overridevirtual

Description: virtual ON_Curve::Trim override.

Reimplemented from ON_Curve.

◆ TrimClosedCurve()

bool ON_NurbsCurve::TrimClosedCurve ( const ON_Interval in)

Description: If in is increasing, call Trim(in). If in is not increasing - If this is closed, make the subcurve given by the subdomain, [in[0], this->Domain()[1]] U [this->domain, in[1]]. The resulting domain will be [in[1], in[0]+this->Domain.Length()] Otherwise fail. Parameters: in - [in] a proper subdomain of the curve. Returns: true if successful.

◆ UnclampedTagForExperts()

bool ON_NurbsCurve::UnclampedTagForExperts ( ) const

Returns: True if this curve was explicitly tagged as having unclampled knots and currently has unclampled knots.

◆ UnclampEndForExperts()

bool ON_NurbsCurve::UnclampEndForExperts ( int  end)

Description: Unclamp end knots.
Does not modify the curve location or parameterization, but typically modifies knots and control vertices near the ends. Parameters: end - [in] 0 = unclamp start, 1 = unclamp end, 2 = unclamp start and end Returns: true if successful Remarks: Degree 1 NURBS curves cannot be unclamped. See Also: SetUnclampedTagForExperts

◆ UnmanageKnotForExperts()

void ON_NurbsCurve::UnmanageKnotForExperts ( int &  knot_capacity,
double *&  knot 
)

Description: Unconditionally transfer knot management to caller and zero m_knot and KnotCapacity(). Parameters: knot_capacity - [out] knot_capacity is set to input value of KnotCapacity() and then KnotCapacity() is set to 0. knot - [out] knot is set to input value of m_knot and then this->m_knot is set to nullptr. Remarks: If knot_capacity > 0, then knot points to memory allocated by onmalloc()/onrealloc().

◆ Weight()

double ON_NurbsCurve::Weight ( int  ) const

◆ Write()

bool ON_NurbsCurve::Write ( ON_BinaryArchive binary_archive) const
overridevirtual

Description: virtual ON_Object::Write override

Reimplemented from ON_Object.

◆ ZeroCVs()

bool ON_NurbsCurve::ZeroCVs ( )

zeros control vertices and, if rational, sets weights to 1

Member Data Documentation

◆ m_cv

double* ON_NurbsCurve::m_cv

Control points.

  • The i-th control point begins at CV(i) = m_cv + (i*m_cv_stride).
  • If m_is_rat is false, then the i-th control point is ( CV(i)[0], ..., CV(i)[m_dim-1] ).
  • If m_is_rat is true, then the i-th control point is stored in HOMOGENEOUS form and is [ CV(i)[0], ..., CV(i)[m_dim] ].

◆ m_cv_capacity

int ON_NurbsCurve::m_cv_capacity

If m_cv_capacity > 0, then m_cv[] is an array of at least m_cv_capacity doubles whose memory is managed by the ON_NurbsCurve class using onmalloc(), onrealloc(), and onfree(). If m_cv_capacity is 0 and m_cv is not nullptr, then m_cv[] is assumed to be big enough for any requested operation and m_cv[] is not deleted by the destructor.

◆ m_cv_count

int ON_NurbsCurve::m_cv_count

number of control vertices ( >= order )

◆ m_cv_stride

int ON_NurbsCurve::m_cv_stride

control vertex net memory

The pointer to start of "CV[i]" is m_cv + i*m_cv_stride.

◆ m_dim

int ON_NurbsCurve::m_dim

Implementation.

NOTE: These members are left "public" so that expert users may efficiently create NURBS curves using the default constructor and borrow the knot and CV arrays from their native NURBS representation. No technical support will be provided for users who access these members directly. If you can't get your stuff to work, then use the constructor with the arguments and the SetKnot() and SetCV() functions to fill in the arrays. (>=1)

◆ m_is_rat

int ON_NurbsCurve::m_is_rat

1 for rational B-splines. Rational control vertices use homogeneous form and explicit weight values are in m_cv[] array. 0 for non-rational B-splines. Control vertices have an implicit weight value of 1.0. An explicit weight value is not set in the m_cv[] array.

◆ m_knot

double* ON_NurbsCurve::m_knot

unsigned int tags = (m_knot_capacity_and_tags & ON_NurbsCurve::masks::tags); unsigned intknot_capacity = (m_knot_capacity_and_tags & ON_NurbsCurve::masks::knot_capacity_mask); If knot_capacity > 0, then m_knot[] is an array of at least knot_capacity doubles whose memory is managed by the ON_NurbsCurve class using onmalloc(), onrealloc(), and onfree(). If knot_capacity is 0 and m_knot is not nullptr, then m_knot[] is assumed to be big enough for any requested operation and m_knot[] is not deleted by the destructor. Knot vector. ( The knot vector has length m_order+m_cv_count-2. )

◆ m_order

int ON_NurbsCurve::m_order

order = degree+1 ( order >=2 )