/* $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 . // //////////////////////////////////////////////////////////////// */ #if !defined(ON_GEOMETRY_CURVE_ARC_INC_) #define ON_GEOMETRY_CURVE_ARC_INC_ /* Description: ON_ArcCurve is used to represent arcs and circles. ON_ArcCurve.IsCircle() returns true if the curve is a complete circle. Details: an ON_ArcCurve is a subcurve of a circle, with a constant speed parameterization. The parameterization is an affine linear reparameterzation of the underlying arc m_arc onto the domain m_t. A valid ON_ArcCurve has Radius()>0 and 00 and 0 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 = 0.0 // 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 = 0.0 // tolerance to use when checking ) const; ON_BOOL32 IsInPlane( const ON_Plane&, // plane to test double = 0.0 // 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; bool IsContinuous( ON::continuity c, double t, int* hint = NULL, 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; ON_BOOL32 Reverse(); // reverse parameterizatrion // Domain changes from [a,b] to [-b,-a] /* 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 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; ON_BOOL32 Trim( const ON_Interval& ); // 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. bool Extend( const ON_Interval& domain ); /* Description: Splits (divides) the arc at the specified parameter. The parameter must be in the interior of the arc's domain. The ON_Curve pointers passed to ON_ArcCurve::Split must either be NULL or point to ON_ArcCurve objects. If a pointer is NULL, then an ON_ArcCurve will be created in Split(). You may pass "this" as left_side or right_side. Parameters: t - [in] parameter to split the curve at in the interval returned by Domain(). left_side - [out] left portion of curve returned here. If not NULL, left_side must point to an ON_ArcCuve. right_side - [out] right portion of curve returned here If not NULL, right_side must point to an ON_ArcCuve. Remarks: Overrides virtual ON_Curve::Split. */ virtual ON_BOOL32 Split( double t, ON_Curve*& left_side, ON_Curve*& right_side ) const; // virtual ON_Curve::GetNurbForm override int GetNurbForm( // 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. ON_NurbsCurve&, double = 0.0, const ON_Interval* = NULL // OPTIONAL subdomain of arc curve ) const; // virtual ON_Curve::HasNurbForm override int HasNurbForm( // returns 0: unable to create NURBS representation // with desired accuracy. // 1: success - NURBS parameterization // matches the curve's // 2: success - returned NURBS point locus matches // the curve'sbut, on // the interior of the curve's domain, the // curve's parameterization and the NURBS // parameterization may not match to the // desired accuracy. ) const; // virtual ON_Curve::GetCurveParameterFromNurbFormParameter override ON_BOOL32 GetCurveParameterFromNurbFormParameter( double, // nurbs_t double* // curve_t ) const; // virtual ON_Curve::GetNurbFormParameterFromCurveParameter override ON_BOOL32 GetNurbFormParameterFromCurveParameter( double, // curve_t double* // nurbs_t ) const; /* Description: Returns true if this arc curve is a complete circle. */ bool IsCircle() const; // Returns: // The arc's radius. double Radius() const; // Returns: // The arc's subtended angle in radians. double AngleRadians() const; // Returns: // The arc's subtended angle in degrees. double AngleDegrees() const; ///////////////////////////////////////////////////////////////// ON_Arc m_arc; // evaluation domain (always increasing) // ( m_t[i] corresponds to m_arc.m_angle[i] ) ON_Interval m_t; // The dimension of a arc curve can be 2 or 3. // (2 so ON_ArcCurve can be used as a trimming curve) int m_dim; }; #endif