--- a/src/PhysicsObject.cc Sun Dec 07 22:15:21 2008 +0000
+++ b/src/PhysicsObject.cc Sun Dec 07 22:36:38 2008 +0000
@@ -394,3 +394,30 @@
return 0.0;
}
+bool PhysicsObject::collides (const PhysicsObject &obj) {
+ const std::vector<Vector> oShape = obj.getShape();
+ Vector p1, p2, p3;
+ int8_t sign, nsign;
+ for (std::vector<Vector>::const_iterator i = oShape.begin(); i != oShape.end(); i++) { // For every point in other shape
+ p3 = *i + obj.getPosition();
+ sign = 0;
+ for (std::vector<Vector>::const_iterator j = shape.begin(); j != shape.end(); j++) {
+ p1 = *j + position;
+ if ( (j+1) == shape.end() ) p2 = *shape.begin() + position;
+ else p2 = *(j+1) + position;
+ nsign = crossProduct(p1, p2, p3);
+ if ( sign == 0 ) sign = nsign;
+ else if ( ((sign < 0) && (nsign < 0)) || ((sign > 0) && (nsign > 0)) ) continue;
+ else return false;
+ }
+ }
+ return true;
+}
+
+int8_t crossProduct (const Vector &p1, const Vector &p2, const Vector &p3) {
+ float p = (p2.x - p1.x)*(p3.y - p1.y) - (p2.y - p1.y)*(p3.x - p1.x);
+ if (p < 0)
+ return -1;
+ else
+ return 1;
+}