39 |
39 |
40 return text; |
40 return text; |
41 } |
41 } |
42 |
42 |
43 // ============================================================================= |
43 // ============================================================================= |
44 // ----------------------------------------------------------------------------- |
44 // |
45 Vertex::Vertex (double x, double y, double z) |
45 Vertex::Vertex (double x, double y, double z) |
46 { |
46 { |
47 m_coords[X] = x; |
47 m_coords[X] = x; |
48 m_coords[Y] = y; |
48 m_coords[Y] = y; |
49 m_coords[Z] = z; |
49 m_coords[Z] = z; |
50 } |
50 } |
51 |
51 |
52 // ============================================================================= |
52 // ============================================================================= |
53 // ----------------------------------------------------------------------------- |
53 // |
54 void Vertex::move (const Vertex& other) |
54 void Vertex::move (const Vertex& other) |
55 { |
55 { |
56 for_axes (ax) |
56 for_axes (ax) |
57 m_coords[ax] += other[ax]; |
57 m_coords[ax] += other[ax]; |
58 } |
58 } |
59 |
59 |
60 // ============================================================================= |
60 // ============================================================================= |
61 // ----------------------------------------------------------------------------- |
61 // |
62 double Vertex::distanceTo (const Vertex& other) const |
62 double Vertex::distanceTo (const Vertex& other) const |
63 { |
63 { |
64 double dx = abs (x() - other.x()); |
64 double dx = abs (x() - other.x()); |
65 double dy = abs (y() - other.y()); |
65 double dy = abs (y() - other.y()); |
66 double dz = abs (z() - other.z()); |
66 double dz = abs (z() - other.z()); |
67 return sqrt ((dx * dx) + (dy * dy) + (dz * dz)); |
67 return sqrt ((dx * dx) + (dy * dy) + (dz * dz)); |
68 } |
68 } |
69 |
69 |
70 // ============================================================================= |
70 // ============================================================================= |
71 // ----------------------------------------------------------------------------- |
71 // |
72 Vertex Vertex::midpoint (const Vertex& other) |
72 Vertex Vertex::midpoint (const Vertex& other) |
73 { |
73 { |
74 Vertex mid; |
74 Vertex mid; |
75 |
75 |
76 for_axes (ax) |
76 for_axes (ax) |
90 |
90 |
91 return fmt (fmtstr, x(), y(), z()); |
91 return fmt (fmtstr, x(), y(), z()); |
92 } |
92 } |
93 |
93 |
94 // ============================================================================= |
94 // ============================================================================= |
95 // ----------------------------------------------------------------------------- |
95 // |
96 void Vertex::transform (const Matrix& matr, const Vertex& pos) |
96 void Vertex::transform (const Matrix& matr, const Vertex& pos) |
97 { |
97 { |
98 double x2 = (matr[0] * x()) + (matr[1] * y()) + (matr[2] * z()) + pos[X]; |
98 double x2 = (matr[0] * x()) + (matr[1] * y()) + (matr[2] * z()) + pos[X]; |
99 double y2 = (matr[3] * x()) + (matr[4] * y()) + (matr[5] * z()) + pos[Y]; |
99 double y2 = (matr[3] * x()) + (matr[4] * y()) + (matr[5] * z()) + pos[Y]; |
100 double z2 = (matr[6] * x()) + (matr[7] * y()) + (matr[8] * z()) + pos[Z]; |
100 double z2 = (matr[6] * x()) + (matr[7] * y()) + (matr[8] * z()) + pos[Z]; |
103 y() = y2; |
103 y() = y2; |
104 z() = z2; |
104 z() = z2; |
105 } |
105 } |
106 |
106 |
107 // ============================================================================= |
107 // ============================================================================= |
108 // ----------------------------------------------------------------------------- |
108 // |
109 Vertex Vertex::operator-() const |
109 Vertex Vertex::operator-() const |
110 { |
110 { |
111 return Vertex (-m_coords[X], -m_coords[Y], -m_coords[Z]); |
111 return Vertex (-m_coords[X], -m_coords[Y], -m_coords[Z]); |
112 } |
112 } |
113 |
113 |
114 // ============================================================================= |
114 // ============================================================================= |
115 // ----------------------------------------------------------------------------- |
115 // |
116 bool Vertex::operator!= (const Vertex& other) const |
116 bool Vertex::operator!= (const Vertex& other) const |
117 { |
117 { |
118 return !operator== (other); |
118 return !operator== (other); |
119 } |
119 } |
120 |
120 |
121 // ============================================================================= |
121 // ============================================================================= |
122 // ----------------------------------------------------------------------------- |
122 // |
123 bool Vertex::operator== (const Vertex& other) const |
123 bool Vertex::operator== (const Vertex& other) const |
124 { |
124 { |
125 return getCoordinate (X) == other[X] && |
125 return getCoordinate (X) == other[X] && |
126 getCoordinate (Y) == other[Y] && |
126 getCoordinate (Y) == other[Y] && |
127 getCoordinate (Z) == other[Z]; |
127 getCoordinate (Z) == other[Z]; |
128 } |
128 } |
129 |
129 |
130 // ============================================================================= |
130 // ============================================================================= |
131 // ----------------------------------------------------------------------------- |
131 // |
132 Vertex& Vertex::operator/= (const double d) |
132 Vertex& Vertex::operator/= (const double d) |
133 { |
133 { |
134 for_axes (ax) |
134 for_axes (ax) |
135 m_coords[ax] /= d; |
135 m_coords[ax] /= d; |
136 |
136 |
137 return *this; |
137 return *this; |
138 } |
138 } |
139 |
139 |
140 // ============================================================================= |
140 // ============================================================================= |
141 // ----------------------------------------------------------------------------- |
141 // |
142 Vertex Vertex::operator/ (const double d) const |
142 Vertex Vertex::operator/ (const double d) const |
143 { |
143 { |
144 Vertex other (*this); |
144 Vertex other (*this); |
145 return other /= d; |
145 return other /= d; |
146 } |
146 } |
147 |
147 |
148 // ============================================================================= |
148 // ============================================================================= |
149 // ----------------------------------------------------------------------------- |
149 // |
150 Vertex& Vertex::operator+= (const Vertex& other) |
150 Vertex& Vertex::operator+= (const Vertex& other) |
151 { |
151 { |
152 move (other); |
152 move (other); |
153 return *this; |
153 return *this; |
154 } |
154 } |
155 |
155 |
156 // ============================================================================= |
156 // ============================================================================= |
157 // ----------------------------------------------------------------------------- |
157 // |
158 Vertex Vertex::operator+ (const Vertex& other) const |
158 Vertex Vertex::operator+ (const Vertex& other) const |
159 { |
159 { |
160 Vertex newvert (*this); |
160 Vertex newvert (*this); |
161 newvert.move (other); |
161 newvert.move (other); |
162 return newvert; |
162 return newvert; |
163 } |
163 } |
164 |
164 |
165 // ============================================================================= |
165 // ============================================================================= |
166 // ----------------------------------------------------------------------------- |
166 // |
167 int Vertex::operator< (const Vertex& other) const |
167 int Vertex::operator< (const Vertex& other) const |
168 { |
168 { |
169 if (operator== (other)) |
169 if (operator== (other)) |
170 return false; |
170 return false; |
171 |
171 |
183 |
183 |
184 return getCoordinate (Z) < other[Z]; |
184 return getCoordinate (Z) < other[Z]; |
185 } |
185 } |
186 |
186 |
187 // ============================================================================= |
187 // ============================================================================= |
188 // ----------------------------------------------------------------------------- |
188 // |
189 Matrix::Matrix (double vals[]) |
189 Matrix::Matrix (double vals[]) |
190 { |
190 { |
191 for (int i = 0; i < 9; ++i) |
191 for (int i = 0; i < 9; ++i) |
192 m_vals[i] = vals[i]; |
192 m_vals[i] = vals[i]; |
193 } |
193 } |
194 |
194 |
195 // ============================================================================= |
195 // ============================================================================= |
196 // ----------------------------------------------------------------------------- |
196 // |
197 Matrix::Matrix (double fillval) |
197 Matrix::Matrix (double fillval) |
198 { |
198 { |
199 for (int i = 0; i < 9; ++i) |
199 for (int i = 0; i < 9; ++i) |
200 m_vals[i] = fillval; |
200 m_vals[i] = fillval; |
201 } |
201 } |
202 |
202 |
203 // ============================================================================= |
203 // ============================================================================= |
204 // ----------------------------------------------------------------------------- |
204 // |
205 Matrix::Matrix (initlist<double> vals) |
205 Matrix::Matrix (initlist<double> vals) |
206 { |
206 { |
207 assert (vals.size() == 9); |
207 assert (vals.size() == 9); |
208 memcpy (&m_vals[0], & (*vals.begin()), sizeof m_vals); |
208 memcpy (&m_vals[0], & (*vals.begin()), sizeof m_vals); |
209 } |
209 } |
210 |
210 |
211 // ============================================================================= |
211 // ============================================================================= |
212 // ----------------------------------------------------------------------------- |
212 // |
213 void Matrix::puts() const |
213 void Matrix::puts() const |
214 { |
214 { |
215 for (int i = 0; i < 3; ++i) |
215 for (int i = 0; i < 3; ++i) |
216 { |
216 { |
217 for (int j = 0; j < 3; ++j) |
217 for (int j = 0; j < 3; ++j) |
259 |
259 |
260 return val; |
260 return val; |
261 } |
261 } |
262 |
262 |
263 // ============================================================================= |
263 // ============================================================================= |
264 // ----------------------------------------------------------------------------- |
264 // |
265 Matrix& Matrix::operator= (const Matrix& other) |
265 Matrix& Matrix::operator= (const Matrix& other) |
266 { |
266 { |
267 memcpy (&m_vals[0], &other.m_vals[0], sizeof m_vals); |
267 memcpy (&m_vals[0], &other.m_vals[0], sizeof m_vals); |
268 return *this; |
268 return *this; |
269 } |
269 } |
270 |
270 |
271 // ============================================================================= |
271 // ============================================================================= |
272 // ----------------------------------------------------------------------------- |
272 // |
273 double Matrix::getDeterminant() const |
273 double Matrix::getDeterminant() const |
274 { |
274 { |
275 return (val (0) * val (4) * val (8)) + |
275 return (val (0) * val (4) * val (8)) + |
276 (val (1) * val (5) * val (6)) + |
276 (val (1) * val (5) * val (6)) + |
277 (val (2) * val (3) * val (7)) - |
277 (val (2) * val (3) * val (7)) - |
279 (val (1) * val (3) * val (8)) - |
279 (val (1) * val (3) * val (8)) - |
280 (val (0) * val (5) * val (7)); |
280 (val (0) * val (5) * val (7)); |
281 } |
281 } |
282 |
282 |
283 // ============================================================================= |
283 // ============================================================================= |
284 // ----------------------------------------------------------------------------- |
284 // |
285 bool Matrix::operator== (const Matrix& other) const |
285 bool Matrix::operator== (const Matrix& other) const |
286 { |
286 { |
287 for (int i = 0; i < 9; ++i) |
287 for (int i = 0; i < 9; ++i) |
288 if (val (i) != other[i]) |
288 if (val (i) != other[i]) |
289 return false; |
289 return false; |
290 |
290 |
291 return true; |
291 return true; |
292 } |
292 } |
293 |
293 |
294 // ============================================================================= |
294 // ============================================================================= |
295 // ----------------------------------------------------------------------------- |
295 // |
296 LDBoundingBox::LDBoundingBox() |
296 LDBoundingBox::LDBoundingBox() |
297 { |
297 { |
298 reset(); |
298 reset(); |
299 } |
299 } |
300 |
300 |
301 // ============================================================================= |
301 // ============================================================================= |
302 // ----------------------------------------------------------------------------- |
302 // |
303 void LDBoundingBox::calculate() |
303 void LDBoundingBox::calculate() |
304 { |
304 { |
305 reset(); |
305 reset(); |
306 |
306 |
307 if (!getCurrentDocument()) |
307 if (!getCurrentDocument()) |
343 break; |
343 break; |
344 } |
344 } |
345 } |
345 } |
346 |
346 |
347 // ============================================================================= |
347 // ============================================================================= |
348 // ----------------------------------------------------------------------------- |
348 // |
349 LDBoundingBox& LDBoundingBox::operator<< (const Vertex& v) |
349 LDBoundingBox& LDBoundingBox::operator<< (const Vertex& v) |
350 { |
350 { |
351 calcVertex (v); |
351 calcVertex (v); |
352 return *this; |
352 return *this; |
353 } |
353 } |
354 |
354 |
355 // ============================================================================= |
355 // ============================================================================= |
356 // ----------------------------------------------------------------------------- |
356 // |
357 LDBoundingBox& LDBoundingBox::operator<< (LDObject* obj) |
357 LDBoundingBox& LDBoundingBox::operator<< (LDObject* obj) |
358 { |
358 { |
359 calcObject (obj); |
359 calcObject (obj); |
360 return *this; |
360 return *this; |
361 } |
361 } |
362 |
362 |
363 // ============================================================================= |
363 // ============================================================================= |
364 // ----------------------------------------------------------------------------- |
364 // |
365 void LDBoundingBox::calcVertex (const Vertex& v) |
365 void LDBoundingBox::calcVertex (const Vertex& v) |
366 { |
366 { |
367 for_axes (ax) |
367 for_axes (ax) |
368 { |
368 { |
369 m_Vertex0[ax] = min (v[ax], m_Vertex0[ax]); |
369 m_Vertex0[ax] = min (v[ax], m_Vertex0[ax]); |
372 |
372 |
373 setEmpty (false); |
373 setEmpty (false); |
374 } |
374 } |
375 |
375 |
376 // ============================================================================= |
376 // ============================================================================= |
377 // ----------------------------------------------------------------------------- |
377 // |
378 void LDBoundingBox::reset() |
378 void LDBoundingBox::reset() |
379 { |
379 { |
380 m_Vertex0[X] = m_Vertex0[Y] = m_Vertex0[Z] = 10000.0; |
380 m_Vertex0[X] = m_Vertex0[Y] = m_Vertex0[Z] = 10000.0; |
381 m_Vertex1[X] = m_Vertex1[Y] = m_Vertex1[Z] = -10000.0; |
381 m_Vertex1[X] = m_Vertex1[Y] = m_Vertex1[Z] = -10000.0; |
382 setEmpty (true); |
382 setEmpty (true); |
383 } |
383 } |
384 |
384 |
385 // ============================================================================= |
385 // ============================================================================= |
386 // ----------------------------------------------------------------------------- |
386 // |
387 double LDBoundingBox::size() const |
387 double LDBoundingBox::size() const |
388 { |
388 { |
389 double xscale = (m_Vertex0[X] - m_Vertex1[X]); |
389 double xscale = (m_Vertex0[X] - m_Vertex1[X]); |
390 double yscale = (m_Vertex0[Y] - m_Vertex1[Y]); |
390 double yscale = (m_Vertex0[Y] - m_Vertex1[Y]); |
391 double zscale = (m_Vertex0[Z] - m_Vertex1[Z]); |
391 double zscale = (m_Vertex0[Z] - m_Vertex1[Z]); |