Program listing for file mechanics/src/collision/SiconosShape.hpp

Program listing for file mechanics/src/collision/SiconosShape.hpp#

  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