src/PhysicsObject.cc
changeset 268 0b96b88af335
parent 265 d97bf6790c22
child 272 97de051edbcf
--- 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;
+}