1 /* $NoKeywords: $ */
2 /*
3 //
4 // Copyright (c) 1993-2012 Robert McNeel & Associates. All rights reserved.
5 // OpenNURBS, Rhinoceros, and Rhino3D are registered trademarks of Robert
6 // McNeel & Associates.
7 //
8 // THIS SOFTWARE IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY.
9 // ALL IMPLIED WARRANTIES OF FITNESS FOR ANY PARTICULAR PURPOSE AND OF
10 // MERCHANTABILITY ARE HEREBY DISCLAIMED.
11 //
12 // For complete openNURBS copyright information see <http://www.opennurbs.org>.
13 //
14 ////////////////////////////////////////////////////////////////
15 */
16 
17 #if !defined(ON_CONE_INC_)
18 #define ON_CONE_INC_
19 
20 class ON_NurbsSurface;
21 class ON_Brep;
22 
23 // Description:
24 //   Lightweight right circular cone.  Use ON_ConeSurface if
25 //   you need ON_Cone geometry as a virtual ON_Surface.
26 class ON_CLASS ON_Cone
27 {
28 public:
29 
30   // Creates a cone with world XY plane as the base plane,
31   // center = (0,0,0), radius = 0.0, height = 0.0.
32   ON_Cone();
33 
34   // See ON_Cone::Create.
35   ON_Cone(
36     const ON_Plane& plane,
37     double height,
38     double radius
39     );
40 
41   ~ON_Cone();
42 
43   // Description:
44   //   Creates a right circular cone from a plane, height,
45   //   and radius.
46   //  plane - [in] The apex of cone is at plane.origin and
47   //      the axis of the cone is plane.zaxis.
48   //  height - [in] The center of the base is height*plane.zaxis.
49   //  radius - [in] tan(cone angle) = radius/height
50   ON_BOOL32 Create(
51     const ON_Plane& plane,
52     double height,
53     double radius
54     );
55 
56   // Returns true if plane is valid, height is not zero, and
57   // radius is not zero.
58   ON_BOOL32 IsValid() const;
59 
60   // Returns:
61   //   Center of base circle.
62   // Remarks:
63   //   The base point is plane.origin + height*plane.zaxis.
64   ON_3dPoint BasePoint() const;
65 
66   // Returns:
67   //   Point at the tip of the cone.
68   // Remarks:
69   //   The apex point is plane.origin.
70   const ON_3dPoint& ApexPoint() const;
71 
72   // Returns:
73   //   Unit vector axis of cone.
74   const ON_3dVector& Axis() const;
75 
76   // Returns:
77   //   The angle (in radians) between the axis and the
78   //   side of the cone.
79   //   The angle and the height have the same sign.
80   double AngleInRadians() const;
81 
82   // Returns:
83   //   The angle Iin degrees) between the axis and the side.
84   //   The angle and the height have the same sign.
85   double AngleInDegrees() const;
86 
87   // evaluate parameters and return point
88   // Parameters:
89   //   radial_parameter - [in] 0.0 to 2.0*ON_PI
90   //   height_parameter - [in] 0 = apex, height = base
91   ON_3dPoint PointAt(
92     double radial_parameter,
93     double height_parameter
94     ) const;
95 
96   // Parameters:
97   //   radial_parameter - [in] (in radians) 0.0 to 2.0*ON_PI
98   //   height_parameter - [in] 0 = apex, height = base
99   // Remarks:
100   //   If radius>0 and height>0, then the normal points "out"
101   //   when height_parameter >= 0.
102   ON_3dVector NormalAt(
103     double radial_parameter,
104     double height_parameter
105     ) const;
106 
107   // Description:
108   //   Get iso curve circle at a specified height.
109   // Parameters:
110   //   height_parameter - [in] 0 = apex, height = base
111   ON_Circle CircleAt(
112     double height_parameter
113     ) const;
114 
115   // Description:
116   //   Get iso curve line segment at a specified angle.
117   // Parameters:
118   //   radial_parameter - [in] (in radians) 0.0 to 2.0*ON_PI
119   ON_Line LineAt(
120     double radial_parameter
121     ) const;
122 
123   // returns parameters of point on cone that is closest to given point
124   bool ClosestPointTo(
125           ON_3dPoint point,
126           double* radial_parameter,
127           double* height_parameter
128          ) const;
129 
130   // returns point on cone that is closest to given point
131   ON_3dPoint ClosestPointTo(
132          ON_3dPoint
133          ) const;
134 
135   ON_BOOL32 Transform( const ON_Xform& );
136 
137   // rotate cone about its origin
138   ON_BOOL32 Rotate(
139         double sin_angle,
140         double cos_angle,
141         const ON_3dVector& axis_of_rotation
142         );
143 
144   ON_BOOL32 Rotate(
145         double angle_in_radians,
146         const ON_3dVector& axis_of_rotation
147         );
148 
149   // rotate cone about a point and axis
150   ON_BOOL32 Rotate(
151         double sin_angle,
152         double cos_angle,
153         const ON_3dVector& axis_of_rotation,
154         const ON_3dPoint& center_of_rotation
155         );
156   ON_BOOL32 Rotate(
157         double angle_in_radians,
158         const ON_3dVector& axis_of_rotation,
159         const ON_3dPoint& center_of_rotation
160         );
161 
162   ON_BOOL32 Translate(
163         const ON_3dVector& delta
164         );
165 
166   ON_BOOL32 GetNurbForm( ON_NurbsSurface& ) const;
167 
168   /*
169   Description:
170     Creates a surface of revolution definition of the cylinder.
171   Parameters:
172     srf - [in] if not NULL, then this srf is used.
173   Result:
174     A surface of revolution or NULL if the cylinder is not
175     valid or is infinite.
176   */
177   ON_RevSurface* RevSurfaceForm( ON_RevSurface* srf = NULL ) const;
178 
179 public:
180   ON_Plane plane; // apex = plane.origin, axis = plane.zaxis
181   double   height; // not zero
182   double   radius; // not zero
183 };
184 
185 #endif
186