326 lines
9.0 KiB
C++
326 lines
9.0 KiB
C++
/* $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_CIRCLE_INC_)
|
|
#define ON_CIRCLE_INC_
|
|
|
|
class ON_NurbsCurve;
|
|
|
|
/*
|
|
Description:
|
|
ON_Circle is a circle in 3d. The cirle is represented by a radius and an
|
|
orthonormal frame of the plane containing the circle, with origin at the center.
|
|
|
|
An Is_Valid() circle has positive radius and an Is_ Valid() plane defining the frame.
|
|
|
|
The circle is parameterized by radians from 0 to 2 Pi given by
|
|
t -> center + cos(t)*radius*xaxis + sin(t)*radius*yaxis
|
|
where center, xaxis and yaxis define the orthonormal frame of the circle's plane.
|
|
*/
|
|
class ON_CLASS ON_Circle
|
|
{
|
|
public:
|
|
// Creates a radius one circle with center (0,0,0)
|
|
// in the world XY plane
|
|
ON_Circle();
|
|
|
|
// Creates a circle in the plane with center at
|
|
// plane.origin.
|
|
ON_Circle(
|
|
const ON_Plane& plane,
|
|
double radius
|
|
);
|
|
|
|
// Creates a circle parallel to the world XY plane
|
|
// with given center and radius
|
|
ON_Circle(
|
|
const ON_3dPoint& center,
|
|
double radius
|
|
);
|
|
|
|
// Creates a circle parallel to the plane
|
|
// with given center and radius.
|
|
ON_Circle(
|
|
const ON_Plane& plane,
|
|
const ON_3dPoint& center,
|
|
double radius
|
|
);
|
|
|
|
// Create a circle through three 2d points.
|
|
// The start/end of the circle is at point P.
|
|
ON_Circle( // circle through 3 2d points
|
|
const ON_2dPoint& P,
|
|
const ON_2dPoint& Q,
|
|
const ON_2dPoint& R
|
|
);
|
|
|
|
// Create a circle through three 3d points.
|
|
// The start/end of the circle is at point P.
|
|
ON_Circle(
|
|
const ON_3dPoint& P,
|
|
const ON_3dPoint& Q,
|
|
const ON_3dPoint& R
|
|
);
|
|
|
|
~ON_Circle();
|
|
|
|
// Creates a circle in the plane with center at
|
|
// plane.origin.
|
|
bool Create(
|
|
const ON_Plane& plane,
|
|
double radius
|
|
);
|
|
|
|
// Creates a circle parallel to the world XY plane
|
|
// with given center and radius
|
|
bool Create(
|
|
const ON_3dPoint& center,
|
|
double radius
|
|
);
|
|
|
|
// Creates a circle parallel to the plane
|
|
// with given centr and radius.
|
|
bool Create(
|
|
const ON_Plane& plane,
|
|
const ON_3dPoint& center,
|
|
double radius
|
|
);
|
|
|
|
// Create a circle through three 2d points.
|
|
// The start/end of the circle is at point P.
|
|
bool Create( // circle through 3 2d points
|
|
const ON_2dPoint& P,
|
|
const ON_2dPoint& Q,
|
|
const ON_2dPoint& R
|
|
);
|
|
|
|
// Create a circle through three 3d points.
|
|
// The start/end of the circle is at point P.
|
|
bool Create(
|
|
const ON_3dPoint& P,
|
|
const ON_3dPoint& Q,
|
|
const ON_3dPoint& R
|
|
);
|
|
|
|
// Create a circle from two 2d points and a
|
|
// tangent at the first point.
|
|
// The start/end of the circle is at point P.
|
|
bool Create(
|
|
const ON_2dPoint& P,
|
|
const ON_2dVector& tangent_at_P,
|
|
const ON_2dPoint& Q
|
|
);
|
|
|
|
// Create a circle from two 3d points and a
|
|
// tangent at the first point.
|
|
// The start/end of the circle is at point P.
|
|
bool Create(
|
|
const ON_3dPoint& P,
|
|
const ON_3dVector& tangent_at_P,
|
|
const ON_3dPoint& Q
|
|
);
|
|
|
|
// A Valid circle has m_radius>0 and m_plane.IsValid().
|
|
bool IsValid() const;
|
|
|
|
//bool UpdatePoints(); // sets m_point[] to have valid points
|
|
|
|
bool IsInPlane( const ON_Plane&, double = ON_ZERO_TOLERANCE ) const;
|
|
|
|
double Radius() const;
|
|
double Diameter() const;
|
|
double Circumference() const;
|
|
const ON_3dPoint& Center() const;
|
|
const ON_3dVector& Normal() const;
|
|
const ON_Plane& Plane() const; // plane containing circle
|
|
|
|
ON_BoundingBox BoundingBox() const;
|
|
|
|
/*
|
|
Description:
|
|
Get tight bounding box.
|
|
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
|
|
arc's tight bounding box.
|
|
xform -[in] (default=NULL)
|
|
If not NULL, the tight bounding box of the transformed
|
|
arc is calculated. The arc is not modified.
|
|
Returns:
|
|
True if a valid tight_bbox is returned.
|
|
*/
|
|
bool GetTightBoundingBox(
|
|
ON_BoundingBox& tight_bbox,
|
|
int bGrowBox = false,
|
|
const ON_Xform* xform = 0
|
|
) const;
|
|
|
|
bool Transform( const ON_Xform& );
|
|
|
|
// Circles use trigonometric parameterization
|
|
// t -> center + cos(t)*radius*xaxis + sin(t)*radius*yaxis
|
|
ON_3dPoint PointAt(
|
|
double // evaluation parameter
|
|
) const;
|
|
ON_3dVector DerivativeAt(
|
|
int, // derivative (>=0)
|
|
double // evaluation parameter
|
|
) const;
|
|
|
|
ON_3dVector TangentAt(double) const;
|
|
|
|
// returns parameters of point on circle that is closest to given point
|
|
bool ClosestPointTo(
|
|
const ON_3dPoint& point,
|
|
double* t
|
|
) const;
|
|
|
|
// returns point on circle that is closest to given point
|
|
ON_3dPoint ClosestPointTo(
|
|
const ON_3dPoint& point
|
|
) const;
|
|
|
|
// evaluate circle's implicit equation in plane
|
|
double EquationAt( const ON_2dPoint& plane_point ) const;
|
|
|
|
ON_2dVector GradientAt( const ON_2dPoint& plane_point ) const;
|
|
|
|
// rotate circle about its center
|
|
bool Rotate(
|
|
double sin_angle,
|
|
double cos_angle,
|
|
const ON_3dVector& axis_of_rotation
|
|
);
|
|
|
|
bool Rotate(
|
|
double angle_in_radians,
|
|
const ON_3dVector& axis_of_rotation
|
|
);
|
|
|
|
// rotate circle about a point and axis
|
|
bool Rotate(
|
|
double sin_angle,
|
|
double cos_angle,
|
|
const ON_3dVector& axis_of_rotation,
|
|
const ON_3dPoint& center_of_rotation
|
|
);
|
|
|
|
bool Rotate(
|
|
double angle_in_radians,
|
|
const ON_3dVector& axis_of_rotation,
|
|
const ON_3dPoint& center_of_rotation
|
|
);
|
|
|
|
bool Translate(
|
|
const ON_3dVector& delta
|
|
);
|
|
|
|
bool Reverse();
|
|
|
|
// Description:
|
|
// Get a four span rational degree 2 NURBS circle representation
|
|
// of the circle.
|
|
// Returns:
|
|
// 2 for success, 0 for failure
|
|
// Remarks:
|
|
// Note that the parameterization of NURBS curve
|
|
// does not match circle's transcendental paramaterization.
|
|
// Use ON_Circle::GetRadianFromNurbFormParameter() and
|
|
// ON_Circle::GetParameterFromRadian() to convert between
|
|
// the NURBS curve parameter and the transcendental parameter.
|
|
int GetNurbForm(
|
|
ON_NurbsCurve& nurbs_curve
|
|
) const;
|
|
|
|
/*
|
|
Description:
|
|
Convert a NURBS curve circle parameter to a circle radians parameter.
|
|
Parameters:
|
|
nurbs_parameter - [in]
|
|
circle_radians_parameter - [out]
|
|
Example:
|
|
|
|
ON_Circle circle = ...;
|
|
double nurbs_t = 1.2345; // some number in interval (0,2.0*ON_PI).
|
|
double circle_t;
|
|
circle.GetRadianFromNurbFormParameter( nurbs_t, &circle_t );
|
|
|
|
ON_NurbsCurve nurbs_curve;
|
|
circle.GetNurbsForm( nurbs_curve );
|
|
circle_pt = circle.PointAt(circle_t);
|
|
nurbs_pt = nurbs_curve.PointAt(nurbs_t);
|
|
// circle_pt and nurbs_pt will be the same
|
|
|
|
Remarks:
|
|
The NURBS curve parameter is with respect to the NURBS curve
|
|
created by ON_Circle::GetNurbForm. At nurbs parameter values of
|
|
0.0, 0.5*ON_PI, ON_PI, 1.5*ON_PI, and 2.0*ON_PI, the nurbs
|
|
parameter and radian parameter are the same. At all other
|
|
values the nurbs and radian parameter values are different.
|
|
See Also:
|
|
ON_Circle::GetNurbFormParameterFromRadian
|
|
*/
|
|
bool GetRadianFromNurbFormParameter(
|
|
double nurbs_parameter,
|
|
double* circle_radians_parameter
|
|
) const;
|
|
|
|
/*
|
|
Description:
|
|
Convert a circle radians parameter to a NURBS curve circle parameter.
|
|
Parameters:
|
|
circle_radians_parameter - [in] 0.0 to 2.0*ON_PI
|
|
nurbs_parameter - [out]
|
|
Example:
|
|
|
|
ON_Circle circle = ...;
|
|
double circle_t = 1.2345; // some number in interval (0,2.0*ON_PI).
|
|
double nurbs_t;
|
|
circle.GetNurbFormParameterFromRadian( circle_t, &nurbs_t );
|
|
|
|
ON_NurbsCurve nurbs_curve;
|
|
circle.GetNurbsForm( nurbs_curve );
|
|
circle_pt = circle.PointAt(circle_t);
|
|
nurbs_pt = nurbs_curve.PointAt(nurbs_t);
|
|
// circle_pt and nurbs_pt will be the same
|
|
|
|
Remarks:
|
|
The NURBS curve parameter is with respect to the NURBS curve
|
|
created by ON_Circle::GetNurbForm. At radian values of
|
|
0.0, 0.5*ON_PI, ON_PI, 1.5*ON_PI, and 2.0*ON_PI, the nurbs
|
|
parameter and radian parameter are the same. At all other
|
|
values the nurbs and radian parameter values are different.
|
|
See Also:
|
|
ON_Circle::GetNurbFormParameterFromRadian
|
|
*/
|
|
bool GetNurbFormParameterFromRadian(
|
|
double circle_radians_parameter,
|
|
double* nurbs_parameter
|
|
) const;
|
|
|
|
public:
|
|
// circle is in the plane with center at plane.m_origin.
|
|
ON_Plane plane;
|
|
double radius; // radius
|
|
//ON_3dPoint m_point[3]; // 3 points on the circle
|
|
};
|
|
|
|
|
|
#endif
|
|
|