opennurbs_arc.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_ARC_INC_)
#define ON_ARC_INC_
/*
Description:
An ON_Arc is a subcurve of 3d circle.
Details:
The curve is parameterized by an angle expressed in radians. For an IsValid() arc
the total subtended angle AngleRadians() = Domain()(1) - Domain()(0) must satisfy
0< AngleRadians() <2*Pi .
The parameterization of the ON_Arc is inherited from the ON_Circle it is derived from.
In particular
t -> center + cos(t)*radius*xaxis + sin(t)*radius*yaxis
where xaxis and yaxis, (part of ON_Circle::m_plane) form an othonormal frame of the plane
containing the circle.
*/
class ON_CLASS ON_Arc : public ON_Circle
{
public:
// Create a radius one arc with angle = 2*pi
ON_Arc();
/*
Description:
Construct an arc from a circle and an angle in radians
Parameters:
circle - [in]
angle_in_radians - [in]
*/
ON_Arc(
const ON_Circle& circle,
double angle_in_radians
);
/*
Parameters:
circle - [in]
angle_interval_in_radians - [in] increasing angle interval
in radians with angle_interval_in_radians.Length() <= 2.0*ON_PI.
*/
ON_Arc(
const ON_Circle& circle,
ON_Interval angle_interval_in_radians
);
/*
Description:
Construct an arc from a plane, radius and an angle in radians.
The center of the arc is at the plane's origin.
Parameters:
plane - [in]
circle is in this plane with center at m_origin
center - [in]
circle's center point
radius - [in]
angle_in_radians - [in]
*/
ON_Arc(
const ON_Plane& plane,
double radius,
double angle_in_radians
);
/*
Description:
Construct an arc parallel to the world XY plane from a
center point, radius, and angle in radians.
The arc starts at center+(radius,0,0).
Parameters:
center - [in]
radius - [in]
angle_in_radians - [in]
*/
ON_Arc(
const ON_3dPoint& center,
double radius,
double angle_in_radians
);
/*
Description:
Construct an arc parallel to plane from a center point,
radius, and angle in radians.
The arc starts at center+radius*plane.xaxis.
Parameters:
plane - [in]
The plane x, y and z axis are used to defines the circle
plane's x, y and z axis. The plane origin is ignorned.
center - [in]
circle's center point
radius - [in]
angle_in_radians - [in]
*/
ON_Arc(
const ON_Plane& plane,
const ON_3dPoint& center,
double radius,
double angle_in_radians
);
/*
Description:
Construct an arc that passes through three 2d points.
Parameters:
start_point - [in]
interior_point - [in]
end_point - [in]
*/
ON_Arc(
const ON_2dPoint& start_point,
const ON_2dPoint& interior_point,
const ON_2dPoint& end_point
);
/*
Description:
Construct an arc that passes through three 3d points.
Parameters:
start_point - [in]
interior_point - [in]
end_point - [in]
*/
ON_Arc(
const ON_3dPoint& start_point,
const ON_3dPoint& interior_point,
const ON_3dPoint& end_point
);
/*
Description:
Create an arc from a circle and an angle in radians
Parameters:
circle - [in]
angle_in_radians - [in]
Returns:
true if input is valid and a valid arc is created.
*/
bool Create(
const ON_Circle& circle,
double angle_in_radians
);
/*
Description:
Create an arc from a circle and an increasing angle interval
Parameters:
circle - [in]
angle_interval_in_radians - [in] increasing angle interval in radians
with angle_interval_in_radians.Length() <= 2.0*ON_PI
Returns:
true if input is valid and a valid arc is created.
*/
bool Create(
const ON_Circle& circle,
ON_Interval angle_interval_in_radians
);
/*
Description:
Create an arc from a plane, radius and an angle in radians.
The center of the arc is at the plane's origin.
Parameters:
plane - [in]
circle is in this plane with center at m_origin
center - [in]
circle's center point
radius - [in]
angle_in_radians - [in]
*/
bool Create(
const ON_Plane& plane,
double radius,
double angle_in_radians
);
/*
Description:
Create an arc parallel to the world XY plane from a
center point, radius, and angle in radians.
The arc starts at center+(radius,0,0).
Parameters:
center - [in]
radius - [in]
angle_in_radians - [in]
*/
bool Create(
const ON_3dPoint& center,
double radius,
double angle_in_radians
);
/*
Description:
Create an arc parallel to plane from a center point,
radius, and angle in radians.
The arc starts at center+radius*plane.xaxis.
Parameters:
plane - [in]
The plane x, y and z axis are used to defines the circle
plane's x, y and z axis. The plane origin is ignorned.
center - [in]
circle's center point
radius - [in]
angle_in_radians - [in]
*/
bool Create(
const ON_Plane& plane,
const ON_3dPoint& center,
double radius,
double angle_in_radians
);
/*
Description:
Create an arc that passes through three 2d points.
Parameters:
start_point - [in]
interior_point - [in]
end_point - [in]
*/
bool Create(
const ON_2dPoint& start_point,
const ON_2dPoint& interior_point,
const ON_2dPoint& end_point
);
/*
Description:
Create an arc that passes through three 3d points.
Parameters:
start_point - [in]
interior_point - [in]
end_point - [in]
*/
bool Create(
const ON_3dPoint& start_point,
const ON_3dPoint& interior_point,
const ON_3dPoint& end_point
);
/*
Description:
Create an arc from a 2d start point, 2d start direction
and a 2d end point.
Parameters:
start_point - [in]
dir_at_start - [in]
end_point - [in]
*/
bool Create(
const ON_2dPoint& start_point,
const ON_2dVector& dir_at_start,
const ON_2dPoint& end_point
);
/*
Description:
Create an arc from a 3d start point, 3d start direction
and a 3d end point.
Parameters:
start_point - [in]
dir_at_start - [in]
end_point - [in]
*/
bool Create(
const ON_3dPoint& start_point,
const ON_3dVector& dir_at_start,
const ON_3dPoint& end_point
);
ON_Arc& operator=( const ON_Circle& );
~ON_Arc();
// Description:
// Creates a text dump of the arc listing the normal, center
// radius, start point, end point, and angle.
// Remarks:
// Dump() is intended for debugging and is not suitable
// for creating high quality text descriptions of an
// arc.
void Dump( ON_TextLog& dump ) const;
// Description:
// Checks an arc to make sure it is valid.
// Detail:
// Radius>0 and 0<AngleRadians()<=2 ON_PI
// Returns:
// true if the arc is valid.
bool IsValid() const;
// Description:
// Get arc's 3d axis aligned bounding box.
// Returns:
// 3d bounding box.
ON_BoundingBox BoundingBox() const;
// Description:
// Get arc's 3d axis aligned bounding box or the
// union of the input box with the arc's bounding box.
// Parameters:
// bbox - [in/out] 3d axis aligned bounding box
// bGrowBox - [in] (default=false)
// If true, then the union of the input bbox and the
// arc's bounding box is returned in bbox.
// If false, the arc's bounding box is returned in bbox.
// Returns:
// true if arc has bounding box and calculation was successful.
bool GetBoundingBox(
ON_BoundingBox& bbox,
int bGrowBox = false
) 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;
// Returns:
// true if the arc is a complete circle; i.e., the arc's
// angle is 360 degrees.
bool IsCircle() const;
// Returns:
// The arc's subtended angle in radians.
double AngleRadians() const;
// Returns:
// The arc's subtended angle in degrees.
double AngleDegrees() const;
/*
Description:
Get evaluation domain.
Returns:
Evaluation domain (same as DomainRadians()).
*/
ON_Interval Domain() const;
// Returns:
// The arc's domain in radians.
ON_Interval DomainRadians() const;
// Returns:
// The arc's domain in degrees.
ON_Interval DomainDegrees() const;
// Description:
// Set arc's subtended angle in radians.
// Parameters:
// angle_in_radians - [in] 0 <= angle_in_radians <= 2.0*ON_PI
//
bool SetAngleRadians(
double angle_in_radians
);
/*
Description:
Set arc's angle interval in radians.
Parameters:
angle_in_radians - [in] increasing interval with
start and end angle in radians.
Length of the interval <= 2.0*ON_PI.
Returns:
true if successful.
*/
bool SetAngleIntervalRadians(
ON_Interval angle_in_radians
);
// Description:
// Set arc's domain as a subdomain of the circle.
// Parameters:
// domain_radian - [in] 0 < domain_radian[1] - domain_radian[0] <= 2.0 * ON*PI
//
bool Trim(
ON_Interval domain_radian
);
// Description:
// Set arc's subtended angle in degrees.
// Parameters:
// angle_in_degrees - [in] 0 < angle_in_degrees <= 360
bool SetAngleDegrees(
double angle_in_degrees
);
// Returns:
// Point at start of the arc.
ON_3dPoint StartPoint() const;
// Returns:
// Point at middle of the arc.
ON_3dPoint MidPoint() const;
// Returns:
// Point at end of the arc.
ON_3dPoint EndPoint() const;
// Description:
// Get the point on the arc that is closest to test_point.
// Parameters:
// test_point - [in]
// t - [out] parameter (in radians) of the point on the arc that
// is closest to test_point. If test_point is the center
// of the arc, then the starting point of the arc is
// (arc.Domain()[0]) returned.
bool ClosestPointTo(
const ON_3dPoint& test_point,
double* t
) const;
// Description:
// Get the point on the arc that is closest to test_point.
// Parameters:
// test_point - [in]
// Returns:
// The point on the arc that is closest to test_point.
// If test_point is the center of the arc, then the
// starting point of the arc is returned.
ON_3dPoint ClosestPointTo(
const ON_3dPoint& test_point
) const;
// Returns:
// Length of the arc = radius*(subtended angle in radians).
double Length() const;
/*
Returns:
Area of the arc's sector.
Remarks:
The arc's sector is the region bounded by the arc,
the line segment from the arc's end to the center,
and the line segment from the center to the arc's
start.
*/
double SectorArea() const;
/*
Returns:
Area centroid of the arc's sector.
Remarks:
The arc's sector is the region bounded by the arc,
the line segment from the arc's end to the center,
and the line segment from the center to the arc's
start.
*/
ON_3dPoint SectorAreaCentroid() const;
/*
Returns:
Area of the arc's segment.
Remarks:
The arc's segment is the region bounded by the arc and
the line segment from the arc's end to the arc's start.
*/
double SegmentArea() const;
/*
Returns:
Area centroid of the arc's segment.
Remarks:
The arc's segment is the region bounded by the arc and
the line segment from the arc's end to the arc's start.
*/
ON_3dPoint SegmentAreaCentroid() const;
// Description:
// Reverse the orientation of the arc. Changes the domain
// from [a,b] to [-b.-a].
bool Reverse();
// Description:
// Get a rational degree 2 NURBS curve representation
// of the arc. Note that the parameterization of NURBS curve
// does not match arc's transcendental paramaterization.
// Use GetRadianFromNurbFormParameter() and
// GetParameterFromRadian() to convert between the NURBS curve
// parameter and the transcendental parameter
// Parameters:
// nurbs_curve - [out] nurbs_curve returned here.
// Returns:
// 0 for failure and 2 for success.
int GetNurbForm(
ON_NurbsCurve& nurbs_curve
) const;
/*
Description:
Convert a NURBS curve arc parameter to a arc radians parameter.
Parameters:
nurbs_parameter - [in]
arc_radians_parameter - [out]
Example:
ON_Arc arc = ...;
double nurbs_t = 1.2345; // some number in interval (0,2.0*ON_PI).
double arc_t;
arc.GetRadianFromNurbFormParameter( nurbs_t, &arc_t );
ON_NurbsCurve nurbs_curve;
arc.GetNurbsForm( nurbs_curve );
arc_pt = arc.PointAt(arc_t);
nurbs_pt = nurbs_curve.PointAt(nurbs_t);
// arc_pt and nurbs_pt will be the same
Remarks:
The NURBS curve parameter is with respect to the NURBS curve
created by ON_Arc::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_Arc::GetNurbFormParameterFromRadian
*/
bool GetRadianFromNurbFormParameter(
double nurbs_parameter,
double* arc_radians_parameter
) const;
/*
Description:
Convert a arc radians parameter to a NURBS curve arc parameter.
Parameters:
arc_radians_parameter - [in] 0.0 to 2.0*ON_PI
nurbs_parameter - [out]
Example:
ON_Arc arc = ...;
double arc_t = 1.2345; // some number in interval (0,2.0*ON_PI).
double nurbs_t;
arc.GetNurbFormParameterFromRadian( arc_t, &nurbs_t );
ON_NurbsCurve nurbs_curve;
arc.GetNurbsForm( nurbs_curve );
arc_pt = arc.PointAt(arc_t);
nurbs_pt = nurbs_curve.PointAt(nurbs_t);
// arc_pt and nurbs_pt will be the same
Remarks:
The NURBS curve parameter is with respect to the NURBS curve
created by ON_Arc::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_Arc::GetNurbFormParameterFromRadian
*/
bool GetNurbFormParameterFromRadian(
double arc_radians_parameter,
double* nurbs_parameter
) const;
private:
friend bool ON_BinaryArchive::ReadArc( ON_Arc& );
friend bool ON_BinaryArchive::WriteArc( const ON_Arc& );
// increasing interval with start and end angle in radians
ON_Interval m_angle;
};
#endif
ON_2dPoint
Definition: opennurbs_point.h:267
ON_2dVector
Definition: opennurbs_point.h:675
ON_3dPoint
Definition: opennurbs_point.h:419
ON_3dVector
Definition: opennurbs_point.h:953
ON_Arc
Definition: opennurbs_arc.h:35
ON_Arc::BoundingBox
ON_BoundingBox BoundingBox() const
ON_Arc::ClosestPointTo
bool ClosestPointTo(const ON_3dPoint &test_point, double *t) const
ON_Arc::operator=
ON_Arc & operator=(const ON_Circle &)
ON_Arc::Trim
bool Trim(ON_Interval domain_radian)
ON_Arc::Create
bool Create(const ON_3dPoint &center, double radius, double angle_in_radians)
ON_Arc::GetTightBoundingBox
bool GetTightBoundingBox(ON_BoundingBox &tight_bbox, int bGrowBox=false, const ON_Xform *xform=0) const
ON_Arc::SetAngleDegrees
bool SetAngleDegrees(double angle_in_degrees)
ON_Arc::GetNurbFormParameterFromRadian
bool GetNurbFormParameterFromRadian(double arc_radians_parameter, double *nurbs_parameter) const
ON_Arc::SegmentAreaCentroid
ON_3dPoint SegmentAreaCentroid() const
ON_Arc::DomainRadians
ON_Interval DomainRadians() const
ON_Arc::Domain
ON_Interval Domain() const
ON_Arc::GetNurbForm
int GetNurbForm(ON_NurbsCurve &nurbs_curve) const
ON_Arc::SectorArea
double SectorArea() const
ON_Arc::IsCircle
bool IsCircle() const
ON_Arc::Create
bool Create(const ON_Circle &circle, ON_Interval angle_interval_in_radians)
ON_Arc::ClosestPointTo
ON_3dPoint ClosestPointTo(const ON_3dPoint &test_point) const
ON_Arc::EndPoint
ON_3dPoint EndPoint() const
ON_Arc::AngleRadians
double AngleRadians() const
ON_Arc::Create
bool Create(const ON_Plane &plane, double radius, double angle_in_radians)
ON_Arc::Create
bool Create(const ON_3dPoint &start_point, const ON_3dPoint &interior_point, const ON_3dPoint &end_point)
ON_Arc::Length
double Length() const
ON_Arc::GetRadianFromNurbFormParameter
bool GetRadianFromNurbFormParameter(double nurbs_parameter, double *arc_radians_parameter) const
ON_Arc::ON_Arc
ON_Arc(const ON_2dPoint &start_point, const ON_2dPoint &interior_point, const ON_2dPoint &end_point)
ON_Arc::SetAngleRadians
bool SetAngleRadians(double angle_in_radians)
ON_Arc::ON_Arc
ON_Arc()
ON_Arc::SetAngleIntervalRadians
bool SetAngleIntervalRadians(ON_Interval angle_in_radians)
ON_Arc::Create
bool Create(const ON_Circle &circle, double angle_in_radians)
ON_Arc::AngleDegrees
double AngleDegrees() const
ON_Arc::ON_Arc
ON_Arc(const ON_Circle &circle, ON_Interval angle_interval_in_radians)
ON_Arc::DomainDegrees
ON_Interval DomainDegrees() const
ON_Arc::Reverse
bool Reverse()
ON_Arc::Create
bool Create(const ON_Plane &plane, const ON_3dPoint &center, double radius, double angle_in_radians)
ON_Arc::ON_Arc
ON_Arc(const ON_Circle &circle, double angle_in_radians)
ON_Arc::~ON_Arc
~ON_Arc()
ON_Arc::ON_Arc
ON_Arc(const ON_Plane &plane, const ON_3dPoint &center, double radius, double angle_in_radians)
ON_Arc::Create
bool Create(const ON_3dPoint &start_point, const ON_3dVector &dir_at_start, const ON_3dPoint &end_point)
ON_Arc::IsValid
bool IsValid() const
ON_Arc::SectorAreaCentroid
ON_3dPoint SectorAreaCentroid() const
ON_Arc::ON_Arc
ON_Arc(const ON_3dPoint &center, double radius, double angle_in_radians)
ON_Arc::ON_Arc
ON_Arc(const ON_3dPoint &start_point, const ON_3dPoint &interior_point, const ON_3dPoint &end_point)
ON_Arc::SegmentArea
double SegmentArea() const
ON_Arc::Create
bool Create(const ON_2dPoint &start_point, const ON_2dPoint &interior_point, const ON_2dPoint &end_point)
ON_Arc::MidPoint
ON_3dPoint MidPoint() const
ON_Arc::ON_Arc
ON_Arc(const ON_Plane &plane, double radius, double angle_in_radians)
ON_Arc::StartPoint
ON_3dPoint StartPoint() const
ON_Arc::GetBoundingBox
bool GetBoundingBox(ON_BoundingBox &bbox, int bGrowBox=false) const
ON_Arc::Dump
void Dump(ON_TextLog &dump) const
ON_Arc::Create
bool Create(const ON_2dPoint &start_point, const ON_2dVector &dir_at_start, const ON_2dPoint &end_point)
ON_BinaryArchive::ReadArc
bool ReadArc(ON_Arc &)
ON_BinaryArchive::WriteArc
bool WriteArc(const ON_Arc &)
ON_BoundingBox
Definition: opennurbs_bounding_box.h:26
ON_Circle
Definition: opennurbs_circle.h:34
ON_Interval
Definition: opennurbs_point.h:49
ON_NurbsCurve
Definition: opennurbs_nurbscurve.h:30
ON_Plane
Definition: opennurbs_plane.h:21
ON_TextLog
Definition: opennurbs_textlog.h:23
ON_Xform
Definition: opennurbs_xform.h:29