Program listing for file mechanics/src/collision/SiconosShape.hpp#
Return to documentation for this file
1#ifndef SiconosShape_h
2#define SiconosShape_h
3
4#include "MechanicsFwd.hpp"
5#include <SiconosVisitor.hpp>
6#include <SiconosSerialization.hpp>
7#include <SiconosVector.hpp>
8#include <SiconosMatrix.hpp>
9
10class SiconosShape
11{
12protected:
13 ACCEPT_SERIALIZATION(SiconosShape);
14
15 double _inside_margin;
16 double _outside_margin;
17 unsigned int _version;
18
19 SiconosShape()
20 : _inside_margin(0.1)
21 , _outside_margin(0.0)
22 , _version(0)
23 {}
24
25public:
26
27 virtual ~SiconosShape() {}
28
29
30 void setInsideMargin (double margin)
31 {
32 _inside_margin = margin;
33 _version ++;
34 }
35
36
37 void setOutsideMargin(double margin)
38 {
39 _outside_margin = margin;
40 _version ++;
41 }
42
43 double insideMargin() { return _inside_margin; }
44
45 double outsideMargin() { return _outside_margin; }
46
47 unsigned int version() const { return _version; }
48
49 VIRTUAL_ACCEPT_VISITORS();
50};
51
52class SiconosPlane : public SiconosShape,
53 public std::enable_shared_from_this<SiconosPlane>
54{
55protected:
56 ACCEPT_SERIALIZATION(SiconosPlane);
57
58public:
59 SiconosPlane() : SiconosShape() {}
60
61 virtual ~SiconosPlane() {}
62
63 ACCEPT_VISITORS();
64};
65
66class SiconosSphere : public SiconosShape,
67 public std::enable_shared_from_this<SiconosSphere>
68{
69private:
70 SiconosSphere() : SiconosShape() {};
71
72protected:
73 ACCEPT_SERIALIZATION(SiconosSphere);
74 float _radius;
75
76public:
77 SiconosSphere(float radius)
78 : SiconosShape(), _radius(radius) {}
79
80 virtual ~SiconosSphere() {}
81
82 float radius() const { return _radius; }
83 void setRadius(float r) { _radius = r; _version ++; }
84
85 ACCEPT_VISITORS();
86};
87
88class SiconosBox : public SiconosShape,
89 public std::enable_shared_from_this<SiconosBox>
90{
91private:
92 SiconosBox() : SiconosShape() {};
93
94protected:
95 ACCEPT_SERIALIZATION(SiconosBox);
96 SP::SiconosVector _dimensions;
97
98public:
99 SiconosBox(double width, double height, double depth)
100 : SiconosShape(), _dimensions(new SiconosVector(3))
101 {
102 (*_dimensions)(0) = width;
103 (*_dimensions)(1) = height;
104 (*_dimensions)(2) = depth;
105 }
106
107 SiconosBox(SP::SiconosVector dimensions)
108 : SiconosShape(), _dimensions(dimensions) {}
109
110 virtual ~SiconosBox() {}
111
112 SP::SiconosVector dimensions() const { return _dimensions; }
113
114 void setDimensions(double width, double height, double depth)
115 {
116 (*_dimensions)(0) = width;
117 (*_dimensions)(1) = height;
118 (*_dimensions)(2) = depth;
119 _version ++;
120 }
121
122 void setDimensions(SP::SiconosVector dim)
123 {
124 _dimensions = dim;
125 _version ++;
126 }
127
128 void setDimensions(const SiconosVector& dim)
129 {
130 (*_dimensions)(0) = dim(0);
131 (*_dimensions)(1) = dim(1);
132 (*_dimensions)(2) = dim(2);
133 _version ++;
134 }
135
136 ACCEPT_VISITORS();
137};
138
139class SiconosCylinder : public SiconosShape,
140 public std::enable_shared_from_this<SiconosCylinder>
141{
142private:
143 SiconosCylinder() : SiconosShape() {};
144
145protected:
146
147 ACCEPT_SERIALIZATION(SiconosCylinder);
148 double _radius;
149 double _length;
150
151public:
152 SiconosCylinder(float radius, float length)
153 : SiconosShape(), _radius(radius), _length(length)
154 {
155 }
156
157 virtual ~SiconosCylinder() {}
158
159 void setRadius(double radius)
160 {
161 _radius = radius;
162 _version ++;
163 }
164
165 double radius() { return _radius; }
166
167 void setLength(double length)
168 {
169 _length = length;
170 _version ++;
171 }
172
173 double length() { return _length; }
174
175 ACCEPT_VISITORS();
176};
177
178class SiconosCone : public SiconosShape,
179 public std::enable_shared_from_this<SiconosCone>
180{
181private:
182 SiconosCone() : SiconosShape() {};
183
184protected:
185 ACCEPT_SERIALIZATION(SiconosCone);
186 double _radius;
187 double _length;
188
189public:
190 SiconosCone(float radius, float length)
191 : SiconosShape(), _radius(radius), _length(length)
192 {
193 }
194
195 virtual ~SiconosCone() {}
196
197 void setRadius(double radius)
198 {
199 _radius = radius;
200 _version ++;
201 }
202
203 double radius() { return _radius; }
204
205 void setLength(double length)
206 {
207 _length = length;
208 _version ++;
209 }
210
211 double length() { return _length; }
212
213 ACCEPT_VISITORS();
214};
215
216class SiconosCapsule : public SiconosShape,
217 public std::enable_shared_from_this<SiconosCapsule>
218{
219private:
220 SiconosCapsule() : SiconosShape() {};
221
222protected:
223
224 ACCEPT_SERIALIZATION(SiconosCapsule);
225 double _radius;
226 double _length;
227
228public:
229 SiconosCapsule(float radius, float length)
230 : SiconosShape(), _radius(radius), _length(length)
231 {
232 }
233
234 virtual ~SiconosCapsule() {}
235
236 void setRadius(double radius)
237 {
238 _radius = radius;
239 _version ++;
240 }
241
242 double radius() { return _radius; }
243
244 void setLength(double length)
245 {
246 _length = length;
247 _version ++;
248 }
249
250 double length() { return _length; }
251
252 ACCEPT_VISITORS();
253};
254
255
256
257class SiconosConvexHull : public SiconosShape,
258 public std::enable_shared_from_this<SiconosConvexHull>
259{
260private:
261 SiconosConvexHull() : SiconosShape() {};
262
263protected:
264
265 ACCEPT_SERIALIZATION(SiconosConvexHull);
266 SP::SiconosMatrix _vertices;
267
268public:
269 SiconosConvexHull(SP::SiconosMatrix vertices)
270 : SiconosShape(), _vertices(vertices)
271 {
272 if (_vertices && _vertices->size(1) != 3)
273 THROW_EXCEPTION("Convex hull vertices matrix must have 3 columns.");
274 }
275
276 virtual ~SiconosConvexHull() {}
277
278 SP::SiconosMatrix vertices() const { return _vertices; }
279
280 void setVertices(SP::SiconosMatrix vertices)
281 {
282 _vertices = vertices;
283 _version ++;
284 }
285
286 ACCEPT_VISITORS();
287};
288
289typedef std::vector<unsigned int> VUInt;
290TYPEDEF_SPTR(VUInt)
291
292class SiconosMesh : public SiconosShape,
293 public std::enable_shared_from_this<SiconosMesh>
294{
295private:
296 SiconosMesh() : SiconosShape() {};
297
298protected:
299
300 ACCEPT_SERIALIZATION(SiconosMesh);
301 SP::VUInt _indexes;
302 SP::SiconosMatrix _vertices;
303
304public:
305 SiconosMesh(SP::VUInt indexes,
306 SP::SiconosMatrix vertices)
307 : SiconosShape(), _indexes(indexes), _vertices(vertices)
308 {
309 if (!_indexes || (_indexes->size() % 3) != 0)
310 THROW_EXCEPTION("Mesh indexes size must be divisible by 3.");
311 if (!_vertices || _vertices->size(0) != 3)
312 THROW_EXCEPTION("Mesh vertices matrix must have 3 columns.");
313 }
314
315 SP::VUInt indexes() { return _indexes; }
316 SP::SiconosMatrix vertices() { return _vertices; }
317
318 virtual ~SiconosMesh() {}
319
320 ACCEPT_VISITORS();
321};
322
323class SiconosHeightMap : public SiconosShape,
324 public std::enable_shared_from_this<SiconosHeightMap>
325{
326private:
327 SiconosHeightMap() : SiconosShape() {};
328
329protected:
330
331 ACCEPT_SERIALIZATION(SiconosHeightMap);
332 SP::SiconosMatrix _height_data;
333 double _length_x;
334 double _length_y;
335
336public:
337 SiconosHeightMap(SP::SiconosMatrix height_data,
338 double length_x, double length_y)
339 : SiconosShape(), _height_data(height_data),
340 _length_x(length_x), _length_y(length_y)
341 {
342 }
343
344 SP::SiconosMatrix height_data() { return _height_data; }
345 double length_x() { return _length_x; }
346 double length_y() { return _length_y; }
347
348 virtual ~SiconosHeightMap() {}
349
350 ACCEPT_VISITORS();
351};
352
353
354class SiconosDisk : public SiconosShape,
355 public std::enable_shared_from_this<SiconosDisk>
356{
357private:
358 SiconosDisk() : SiconosShape() {};
359
360protected:
361 ACCEPT_SERIALIZATION(SiconosDisk);
362 float _radius;
363
364public:
365 SiconosDisk(float radius)
366 : SiconosShape(), _radius(radius) {}
367
368 virtual ~SiconosDisk() {}
369
370 float radius() const { return _radius; }
371 void setRadius(float r) { _radius = r; _version ++; }
372
373 ACCEPT_VISITORS();
374};
375
376class SiconosBox2d : public SiconosShape,
377 public std::enable_shared_from_this<SiconosBox2d>
378{
379private:
380 SiconosBox2d() : SiconosShape() {};
381
382protected:
383
384 ACCEPT_SERIALIZATION(SiconosBox2d);
385 SP::SiconosVector _dimensions;
386
387public:
388 SiconosBox2d(double width, double height)
389 : SiconosShape(), _dimensions(new SiconosVector(2))
390 {
391 (*_dimensions)(0) = width;
392 (*_dimensions)(1) = height;
393 }
394
395 SiconosBox2d(SP::SiconosVector dimensions)
396 : SiconosShape(), _dimensions(dimensions) {}
397
398 virtual ~SiconosBox2d() {}
399
400 SP::SiconosVector dimensions() const { return _dimensions; }
401
402 void setDimensions(double width, double height)
403 {
404 (*_dimensions)(0) = width;
405 (*_dimensions)(1) = height;
406 _version ++;
407 }
408
409 void setDimensions(SP::SiconosVector dim)
410 {
411 _dimensions = dim;
412 _version ++;
413 }
414
415 void setDimensions(const SiconosVector& dim)
416 {
417 (*_dimensions)(0) = dim(0);
418 (*_dimensions)(1) = dim(1);
419 _version ++;
420 }
421
422 ACCEPT_VISITORS();
423};
424
425class SiconosConvexHull2d : public SiconosShape,
426 public std::enable_shared_from_this<SiconosConvexHull2d>
427{
428private:
429 SiconosConvexHull2d() : SiconosShape() {};
430
431protected:
432
433 ACCEPT_SERIALIZATION(SiconosConvexHull2d);
434 SP::SiconosMatrix _vertices;
435
436
437 bool _avoidInternalEdgeContact;
438
439
440public:
441
442 int _normal_edge_pointA;
443
444 int _normal_edge_pointB;
445
446
447 SiconosConvexHull2d(SP::SiconosMatrix vertices)
448 : SiconosShape(), _vertices(vertices), _avoidInternalEdgeContact(false), _normal_edge_pointA(0), _normal_edge_pointB(1)
449 {
450 if (_vertices && _vertices->size(1) != 2)
451 THROW_EXCEPTION("Convex hull vertices matrix must have 2 columns in 2d.");
452 }
453
454 virtual ~SiconosConvexHull2d() {}
455
456 SP::SiconosMatrix vertices() const { return _vertices; }
457
458 void setVertices(SP::SiconosMatrix vertices)
459 {
460 _vertices = vertices;
461 _version ++;
462 }
463 bool avoidInternalEdgeContact() const {return _avoidInternalEdgeContact;}
464
465 void setAvoidInternalEdgeContact(bool value)
466 {
467 _avoidInternalEdgeContact = value;
468 }
469
470 ACCEPT_VISITORS();
471};
472
473#endif