]> git.cworth.org Git - akamaru/blobdiff - akamaru.c
Add init function for springs and clean up grid init.
[akamaru] / akamaru.c
index 8dc477cc0f2ee4b7c10edb92f2828ef2102a2333..eee05e24a1d68f28bd4893c431e11235e5487664 100644 (file)
--- a/akamaru.c
+++ b/akamaru.c
  *   corrections at the end instead of meaning as it goes.
  */
 
-#include <gtk/gtk.h>
-#include <cairo.h>
-#include <cairo-xlib.h>
-#include <gdk/gdkx.h>
+#include <glib.h>
 #include <stdlib.h>
 #include <string.h>
-#include <sys/time.h>
+#include <stdarg.h>
 #include <math.h>
 
 #include "akamaru.h"
 
 const double elasticity = 0.7;
+const double friction = 1;
+const double gravity = 20;
+
+void
+object_init (Object *object, double x, double y, double mass)
+{
+  object->position.x = x;
+  object->position.y = y;
+  object->previous_position.x = x;
+  object->previous_position.y = y;
+  object->mass = mass;
+}
+
+void
+spring_init (Spring *spring, Object *a, Object *b, double length)
+{
+  spring->a = a;
+  spring->b = b;
+  spring->length = length;
+}
+
+void
+string_init (String *string, Object *a, Object *b, double length)
+{
+  string->a = a;
+  string->b = b;
+  string->length = length;
+}
+
+void
+offset_spring_init (OffsetSpring *spring, Object *a, Object *b,
+                   double dx, double dy)
+{
+  spring->a = a;
+  spring->b = b;
+  spring->dx = dx;
+  spring->dy = dy;
+}
 
 void
 polygon_init (Polygon *p, int num_points, ...)
@@ -101,11 +136,18 @@ model_accumulate_forces (Model *model)
   int i;
   double x, y, dx, dy, distance, displacement;
   Point middle;
-  Vector u;
+  Vector u, v;
 
   for (i = 0; i < model->num_objects; i++) {
+    /* Gravity */
     model->objects[i].force.x = 0;
-    model->objects[i].force.y = 3 * model->objects[i].mass;
+    model->objects[i].force.y = gravity * model->objects[i].mass;
+
+    /* Friction */
+    v.x = model->objects[i].position.x - model->objects[i].previous_position.x;
+    v.y = model->objects[i].position.y - model->objects[i].previous_position.y;
+    model->objects[i].force.x -= v.x * friction;
+    model->objects[i].force.y -= v.y * friction;
   }
 
   for (i = 0; i < model->num_springs; i++) {
@@ -142,6 +184,15 @@ model_accumulate_forces (Model *model)
     model->offset_springs[i].b->force.x -= dx * model->k;
     model->offset_springs[i].b->force.y -= dy * model->k;
   }
+
+  for (i = 0; i < model->num_objects; i++) {
+    double f = 
+      model->objects[i].force.x * model->objects[i].force.x +
+      model->objects[i].force.y * model->objects[i].force.y;
+
+    if (f > 100000000)
+      abort();
+  }
 }
 
 static void
@@ -157,9 +208,9 @@ model_integrate (Model *model, double step)
     y = o->position.y;
     
     o->position.x =
-      x + 0.9 * (x - o->previous_position.x) + o->force.x * step * step;
+      x + (x - o->previous_position.x) + o->force.x * step * step;
     o->position.y =
-      y + 0.9 * (y - o->previous_position.y) + o->force.y * step * step;
+      y + (y - o->previous_position.y) + o->force.y * step * step;
 
     o->previous_position.x = x;
     o->previous_position.y = y;
@@ -330,7 +381,6 @@ model_step (Model *model, double delta_t)
 
   model_accumulate_forces (model);
   model_integrate (model, delta_t);
-
   for (i = 0; i < 50; i++)
     model_constrain (model);