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(OPENNURBS_CYLINDER_INC_)
18 #define OPENNURBS_CYLINDER_INC_
19 
20 class ON_NurbsSurface;
21 class ON_RevSurface;
22 class ON_Brep;
23 
24 /*
25 Description:
26   ON_Cylinder is a right circular cylinder.
27 */
28 class ON_CLASS ON_Cylinder
29 {
30 public:
31   ON_Cylinder(); // zeros all fields - cylinder is invalid
32 
33   ON_Cylinder( // infinte cylinder
34     const ON_Circle&  // point on the bottom plane
35     );
36 
37   ON_Cylinder( // infinte cylinder
38     const ON_Circle&,  // point on the bottom plane
39     double             // height
40     );
41 
42   ~ON_Cylinder();
43 
44   bool Create(
45     const ON_Circle&  // point on the bottom plane
46     );
47 
48   bool Create(
49     const ON_Circle&,  // point on the bottom plane
50     double               // height
51     );
52 
53   bool IsValid() const; // returns true if all fields contain reasonable
54                         // information and equation jibes with point and Z.
55 
56   bool IsFinite() const; // returns true if the cylinder is finite
57                          // (height[0] != height[1]) and false if the
58                          // cylinder is infinite.
59 
60   const ON_3dVector& Axis() const;
61   const ON_3dPoint& Center() const;
62   double Height() const; // returns 0 for infinite cylinder
63   ON_Circle CircleAt(
64         double // linear parameter
65         ) const;
66   ON_Line LineAt(
67         double // angular parameter
68         ) const;
69 
70   // evaluate parameters and return point
71   ON_3dPoint PointAt(
72     double, // angular parameter [0,2pi]
73     double  // linear parameter (height from base circle's plane)
74     ) const;
75   ON_3dPoint NormalAt(
76     double, // angular parameter [0,2pi]
77     double  // linear parameter (height from base circle's plane)
78     ) const;
79 
80   // returns parameters of point on cylinder that is closest to given point
81   bool ClosestPointTo(
82          ON_3dPoint,
83          double*, // angular parameter [0,2pi]
84          double*  // linear parameter (height from base circle's plane)
85          ) const;
86   // returns point on cylinder that is closest to given point
87   ON_3dPoint ClosestPointTo(
88          ON_3dPoint
89          ) const;
90 
91   // For intersections see ON_Intersect();
92 
93   // rotate cylinder about its origin
94   bool Rotate(
95         double,               // sin(angle)
96         double,               // cos(angle)
97         const ON_3dVector&  // axis of rotation
98         );
99   bool Rotate(
100         double,               // angle in radians
101         const ON_3dVector&  // axis of rotation
102         );
103 
104   // rotate cylinder about a point and axis
105   bool Rotate(
106         double,               // sin(angle)
107         double,               // cos(angle)
108         const ON_3dVector&, // axis of rotation
109         const ON_3dPoint&   // center of rotation
110         );
111   bool Rotate(
112         double,              // angle in radians
113         const ON_3dVector&, // axis of rotation
114         const ON_3dPoint&   // center of rotation
115         );
116 
117   bool Translate(
118         const ON_3dVector&
119         );
120 
121   // parameterization of NURBS surface does not match cylinder's transcendental paramaterization
122   int GetNurbForm( ON_NurbsSurface& ) const; // returns 0=failure, 2=success
123 
124   /*
125   Description:
126     Creates a surface of revolution definition of the cylinder.
127   Parameters:
128     srf - [in] if not NULL, then this srf is used.
129   Result:
130     A surface of revolution or NULL if the cylinder is not
131     valid or is infinite.
132   */
133   ON_RevSurface* RevSurfaceForm( ON_RevSurface* srf = NULL ) const;
134 
135 public: // members left public
136   // base circle
137   ON_Circle  circle;
138 
139 
140   // If height[0] = height[1], the cylinder is infinite,
141   // Otherwise, height[0] < height[1] and the center of
142   // the "bottom" cap is
143   //
144   //          circle.plane.origin + height[0]*circle.plane.zaxis,
145   //
146   // and the center of the top cap is
147   //
148   //          circle.plane.origin + height[1]*circle.plane.zaxis.
149   double height[2];
150 };
151 
152 #endif
153