1 #ifndef INC_COLLISION_H
2 #define INC_COLLISION_H
3 
4 #include "coords.h"
5 
6 // pointHitsCircle: given a point starting at (x,y) moving with velocity
7 // (vx,vy), determines when the point first is in the circle at the origin
8 // with radius rad. Returns -1 for "never". If et is non-negative, also
9 // returns -1 for "after et".
10 float pointHitsCircle(float x, float y, float vx, float vy, float rad, float et=-1);
11 
12 // pointHitsPolygon: as for pointHitsCircleWithin. 'points' must march
13 // anticlockwise around the polygon.
14 float pointHitsPolygon(CartCoord* points, int n, CartCoord p, RelCartCoord v, float et=-1);
15 
16 struct CollisionCircle;
17 struct CollisionPolygon;
18 
19 // CollisionObject: Virtual representing an object moving with constant velocity.
20 struct CollisionObject
21 {
22     CartCoord startPos;
23     RelCartCoord velocity;
24     virtual float pointHits(CartCoord p, RelCartCoord v, float et=-1) const
25 	=0;
26     float pointHits(float x, float y, float vx, float vy, float et) const;
27     bool pointIn(float x, float y) const;
28     bool pointIn(CartCoord p) const;
29 
30     virtual bool circleIntersects(CartCoord c, float rad) const =0;
31 
32     bool objectCollides(const CollisionCircle& other) const;
33     bool objectCollides(const CollisionPolygon& other) const;
34 
CollisionObjectCollisionObject35     CollisionObject(CartCoord startPos, RelCartCoord velocity)
36 	: startPos(startPos), velocity(velocity) {};
CollisionObjectCollisionObject37     CollisionObject() {}
~CollisionObjectCollisionObject38     virtual ~CollisionObject() {}
39 };
40 
41 struct CollisionCircle : public CollisionObject
42 {
43     float radius;
44 
45     CollisionCircle(CartCoord istartPos, RelCartCoord ivelocity, float iradius=1)
CollisionObjectCollisionCircle46 	: CollisionObject(startPos, velocity), radius(iradius)
47     {}
48 
49     bool circleIntersects(CartCoord c, float rad) const;
50 
51     float pointHits(CartCoord p, RelCartCoord v, float et=-1) const;
52 };
53 
54 struct CollisionPolygon : public CollisionObject
55 {
56     int numPoints;
57     RelCartCoord* points;
58     float angle;
59 
60     CollisionPolygon(int inumPoints, RelCartCoord* ipoints, float iangle=0) :
numPointsCollisionPolygon61 	numPoints(inumPoints), points(ipoints), angle(iangle) {}
62 
63     bool circleIntersects(CartCoord c, float rad) const;
64 
65     float pointHits(CartCoord p, RelCartCoord v, float et=-1) const;
66 };
67 #endif /* INC_COLLISION_H */
68