]> git.cworth.org Git - akamaru/blobdiff - akamaru.c
New feature: polygons can now enclose objects.
[akamaru] / akamaru.c
index 88277f66bc9dd78a0c491e243731f3089627c24e..cc551436cd371449ec3a2f19ef7c9faf5559c1ed 100644 (file)
--- a/akamaru.c
+++ b/akamaru.c
@@ -21,7 +21,7 @@
 #include "akamaru.h"
 
 const double elasticity = 0.5;
-const double friction = 1;
+const double friction = 4;
 const double gravity = 50;
 
 void
@@ -85,7 +85,7 @@ anchor_init (Anchor *anchor, Object *object, double x, double y)
 }
 
 void
-polygon_init (Polygon *p, int num_points, ...)
+polygon_init (Polygon *p, int enclosing, int num_points, ...)
 {
   double dx, dy, length;
   int i, j;
@@ -97,6 +97,7 @@ polygon_init (Polygon *p, int num_points, ...)
   va_start (ap, num_points);
   p->num_points = num_points;
   p->points = g_new (Point, num_points);
+  p->enclosing = enclosing;
 
   for (i = 0; i < num_points; i++) {
     p->points[i].x = va_arg (ap, double);
@@ -120,7 +121,7 @@ polygon_init (Polygon *p, int num_points, ...)
 void
 polygon_init_diamond (Polygon *polygon, double x, double y)
 {
-  return polygon_init (polygon, 5, 
+  return polygon_init (polygon, FALSE, 5, 
                       x, y, 
                       x + 10, y + 40,
                       x + 90, y + 40,
@@ -132,7 +133,14 @@ void
 polygon_init_rectangle (Polygon *polygon, double x0, double y0,
                        double x1, double y1)
 {
-  return polygon_init (polygon, 4, x0, y0, x0, y1, x1, y1, x1, y0);
+  return polygon_init (polygon, FALSE, 4, x0, y0, x0, y1, x1, y1, x1, y0);
+}
+
+void
+polygon_init_enclosing_rectangle (Polygon *polygon, double x0, double y0,
+                               double x1, double y1)
+{
+  return polygon_init (polygon, TRUE, 4, x0, y0, x0, y1, x1, y1, x1, y0);
 }
 
 void
@@ -276,10 +284,10 @@ polygon_contains_point (Polygon *polygon, Point *point)
     dy = point->y - polygon->points[i].y;
 
     if (polygon->normals[i].x * dx + polygon->normals[i].y * dy >= 0)
-      return FALSE;
+      return polygon->enclosing;
   }
 
-  return TRUE;
+  return !polygon->enclosing;
 }
 
 static void
@@ -297,7 +305,6 @@ polygon_reflect_object (Polygon *polygon, Object *object)
     if (d > distance) {
       distance = d;
       edge = i;
-      polygon->edge = i;
       n = &polygon->normals[i];
     }
   }