Added gravity.
[universe.git] / polygon.h
1
2 // Written and (C) by Francois Fleuret
3 // Contact <francois.fleuret@idiap.ch> for comments & bug reports
4
5 #ifndef POLYGON_H
6 #define POLYGON_H
7
8 #include "misc.h"
9 #include "canvas.h"
10
11 #ifdef XFIG_SUPPORT
12 #include "xfig_tracer.h"
13 #endif
14
15 #ifdef X11_SUPPORT
16 #include "simple_window.h"
17 #endif
18
19 class Polygon {
20   struct Triangle {
21     int a, b, c;
22   };
23
24   int _nb_max_polygons;
25   int _nb_polygons; // We need to know the total number of polygons in
26                     // the universe
27
28   scalar_t _mass, _moment_of_inertia, _radius;
29
30   scalar_t *_relative_x, *_relative_y;
31   scalar_t _last_center_x, _last_center_y, _last_theta;
32
33   int _total_nb_dots;
34   int *_nb_dots;
35   int *_effecting_edge;
36
37   scalar_t *_length;
38   Triangle *_triangles;
39
40   inline void intersection(scalar_t xa2, scalar_t ya2,
41                            scalar_t xa1, scalar_t ya1,
42                            scalar_t xb2, scalar_t yb2,
43                            scalar_t xb1, scalar_t yb1,
44                            scalar_t &det, scalar_t &s1, scalar_t &s2) {
45     scalar_t m11, m12, m21, m22, n11, n12, n21, n22, v1, v2;
46     m11 = xa1 - xa2; m12 = xb2 - xb1; m21 = ya1 - ya2; m22 = yb2 - yb1;
47     det = m11 * m22 - m12 * m21;
48     if(det != 0) {
49       n11 = + m22 / det; n12 = - m12 / det; n21 = - m21 / det; n22 = + m11 / det;
50       v1 = xb2 - xa2; v2 = yb2 - ya2;
51       s1 = n11 * v1 + n12 * v2; s2 = n21 * v1 + n22 * v2;
52     }
53   }
54
55 public:
56   bool _initialized;
57   bool _nailed;
58   int _nb_vertices;
59   scalar_t *_x, *_y;
60   scalar_t _red, _green, _blue;
61   scalar_t _center_x, _center_y, _theta;
62   scalar_t _dcenter_x, _dcenter_y, _dtheta;
63
64   // The x and y parameters are ignored if null. Useful to initialize
65   // directly.
66
67   Polygon(scalar_t mass,
68           scalar_t red, scalar_t green, scalar_t blue,
69           scalar_t *x, scalar_t *y,
70           int nv);
71
72   ~Polygon();
73
74   Polygon *clone();
75
76 #ifdef XFIG_SUPPORT
77   void color_xfig(XFigTracer *tracer);
78   void print_xfig(XFigTracer *tracer);
79 #endif
80
81 #ifdef X11_SUPPORT
82   void draw(SimpleWindow *window);
83   void draw_contours(SimpleWindow *window);
84 #endif
85
86   void draw(Canvas *canvas);
87   void draw_contours(Canvas *canvas);
88
89   void set_vertex(int k, scalar_t x, scalar_t y);
90   void set_position(scalar_t center_x, scalar_t center_y, scalar_t theta);
91   void set_speed(scalar_t dcenter_x, scalar_t dcenter_y, scalar_t dtheta);
92   bool contain(scalar_t x, scalar_t y);
93   void triangularize(int &nt, int nb, int *index);
94   void initialize(int nb_polygons);
95   bool update(scalar_t dt);
96   scalar_t relative_x(scalar_t ax, scalar_t ay);
97   scalar_t relative_y(scalar_t ax, scalar_t ay);
98   scalar_t absolute_x(scalar_t rx, scalar_t ry);
99   scalar_t absolute_y(scalar_t rx, scalar_t ry);
100
101   void apply_force(scalar_t dt, scalar_t x, scalar_t y, scalar_t fx, scalar_t fy);
102   void apply_border_forces(scalar_t dt, scalar_t xmax, scalar_t ymax);
103   void apply_collision_forces(scalar_t dt, int n_polygon, Polygon *p);
104
105   bool collide(Polygon *p);
106 };
107
108 #endif