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_POINT_GRID_INC_)
18 #define OPENNURBS_POINT_GRID_INC_
19 
20 class ON_CLASS ON_PointGrid : public ON_Geometry
21 {
22 public:
23   ON_PointGrid();
24   ON_PointGrid(const ON_PointGrid&);
25   ON_PointGrid(
26           int,  // point count0 (>=1)
27           int   // point count1 (>=1)
28           );
29 
30   void Initialize(void);  // zeros all fields
31 
32   ON_BOOL32 Create(
33           int,  // point count0 (>=1)
34           int   // point count1 (>=1)
35           );
36 
37   void Destroy();
38 
39   virtual ~ON_PointGrid();
40   void EmergencyDestroy(); // call if memory used by point grid becomes invalid
41 
42 	ON_PointGrid& operator=(const ON_PointGrid&);
43 
44   // point_grid[i][j] returns GetPoint(i,j)
45   ON_3dPoint* operator[](int);             // 0 <= index < PointCount(0)
46   const ON_3dPoint* operator[](int) const; // 0 <= index < PointCount(0)
47 
48   /////////////////////////////////////////////////////////////////
49   // ON_Object overrides
50 
51   /*
52   Description:
53     Tests an object to see if its data members are correctly
54     initialized.
55   Parameters:
56     text_log - [in] if the object is not valid and text_log
57         is not NULL, then a brief englis description of the
58         reason the object is not valid is appened to the log.
59         The information appended to text_log is suitable for
60         low-level debugging purposes by programmers and is
61         not intended to be useful as a high level user
62         interface tool.
63   Returns:
64     @untitled table
65     true     object is valid
66     false    object is invalid, uninitialized, etc.
67   Remarks:
68     Overrides virtual ON_Object::IsValid
69   */
70   ON_BOOL32 IsValid( ON_TextLog* text_log = NULL ) const;
71 
72   void Dump( ON_TextLog& ) const; // for debugging
73 
74   ON_BOOL32 Write(
75          ON_BinaryArchive&  // open binary file
76        ) const;
77 
78   ON_BOOL32 Read(
79          ON_BinaryArchive&  // open binary file
80        );
81 
82   ON::object_type ObjectType() const;
83 
84   /////////////////////////////////////////////////////////////////
85   // ON_Geometry overrides
86 
87   int Dimension() const;
88 
89   ON_BOOL32 GetBBox( // returns true if successful
90          double*,    // minimum
91          double*,    // maximum
92          ON_BOOL32 = false  // true means grow box
93          ) const;
94 
95   /*
96 	Description:
97     Get tight bounding box of the point grid.
98 	Parameters:
99 		tight_bbox - [in/out] tight bounding box
100 		bGrowBox -[in]	(default=false)
101       If true and the input tight_bbox is valid, then returned
102       tight_bbox is the union of the input tight_bbox and the
103       tight bounding box of the point grid.
104 		xform -[in] (default=NULL)
105       If not NULL, the tight bounding box of the transformed
106       point grid is calculated.  The point grid is not modified.
107 	Returns:
108     True if the returned tight_bbox is set to a valid
109     bounding box.
110   */
111 	bool GetTightBoundingBox(
112 			ON_BoundingBox& tight_bbox,
113       int bGrowBox = false,
114 			const ON_Xform* xform = 0
115       ) const;
116 
117   ON_BOOL32 Transform(
118          const ON_Xform&
119          );
120 
121   // virtual ON_Geometry::IsDeformable() override
122   bool IsDeformable() const;
123 
124   // virtual ON_Geometry::MakeDeformable() override
125   bool MakeDeformable();
126 
127   ON_BOOL32 SwapCoordinates(
128         int, int        // indices of coords to swap
129         );
130 
131   /////////////////////////////////////////////////////////////////
132   // Interface
133 
134   ON_BOOL32 IsClosed(
135         int // dir
136         ) const;
137 
138   int PointCount(   // number of points in grid direction
139         int         // dir 0 = "s", 1 = "t"
140         ) const;
141 
142   int PointCount(   // total number of points in grid
143         void
144         ) const;
145 
146   ON_3dPoint& Point(
147         int, int // point index ( 0 <= i <= PointCount(0), 0 <= j <= PointCount(1)
148         );
149 
150   ON_3dPoint Point(
151         int, int // point index ( 0 <= i <= PointCount(0), 0 <= j <= PointCount(1)
152         ) const;
153 
154   double* PointArray();
155 
156   const double* PointArray() const;
157 
158   int PointArrayStride(  // point stride in grid direction
159         int         // dir 0 = "s", 1 = "t"
160         ) const;
161 
162   ON_BOOL32 SetPoint(      // set a single point
163         int, int, // point index ( 0 <= i <= PointCount(0), 0 <= j <= PointCount(1)
164         const ON_3dPoint& // value of point
165         );
166 
167   ON_BOOL32 GetPoint(              // get a single control vertex
168         int, int,   // CV index ( 0 <= i <= CVCount(0), 0 <= j <= CVCount(1)
169         ON_3dPoint&      // gets euclidean cv when NURBS is rational
170         ) const;
171 
172   ON_BOOL32 Reverse(  // reverse grid order
173     int // dir  0 = "s", 1 = "t"
174     );
175 
176   ON_BOOL32 Transpose(); // transpose grid points
177 
178   /////////////////////////////////////////////////////////////////
179   // Implementation
180 protected:
181 
182   int m_point_count[2];   // number of points (>=1)
183   int m_point_stride0;    // >= m_point_count[1]
184   ON_3dPointArray m_point;
185   // point[i][j] = m_point[i*m_point_stride0+j]
186 
187 private:
188   static ON_3dPoint m_no_point; // prevent crashes when sizes are 0
189 
190   ON_OBJECT_DECLARE(ON_PointGrid);
191 };
192 
193 
194 #endif
195