]> git.cworth.org Git - akamaru/commitdiff
Tweaking.
authorKristian Høgsberg <krh@redhat.com>
Tue, 23 May 2006 22:09:54 +0000 (18:09 -0400)
committerKristian Høgsberg <krh@dinky.bitplanet.net>
Tue, 23 May 2006 22:09:54 +0000 (18:09 -0400)
akamaru.c
main.c

index 8dc477cc0f2ee4b7c10edb92f2828ef2102a2333..8a9e587b40e66da2259011549be4fd2e97820e14 100644 (file)
--- a/akamaru.c
+++ b/akamaru.c
@@ -24,6 +24,8 @@
 #include "akamaru.h"
 
 const double elasticity = 0.7;
+const double friction = 1;
+const double gravity = 20;
 
 void
 polygon_init (Polygon *p, int num_points, ...)
@@ -101,11 +103,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 +151,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 > 1000000)
+      abort();
+  }
 }
 
 static void
@@ -157,9 +175,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 +348,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);
 
diff --git a/main.c b/main.c
index 0aec615ad7650ac2c0019fd07cdf068495a33d3b..79bf4b546859e17c6bb06457488ce10f6f4b39be 100644 (file)
--- a/main.c
+++ b/main.c
@@ -137,7 +137,7 @@ model_init_curtain (Model *model)
       model->objects[index].position.y = y;
       model->objects[index].previous_position.x = x;
       model->objects[index].previous_position.y = y;
-      model->objects[i].mass = 1;
+      model->objects[index].mass = 1;
 
       if (j + 1 < num_rope_objects) {
        stick_index = i * (num_rope_objects - 1) + j;
@@ -226,7 +226,7 @@ model_init_molecule (Model *model)
   model->num_objects = num_objects;
   model->springs = g_new (Spring, num_springs);
   model->num_springs = num_springs;
-  model->k = 0.2;
+  model->k = 2;
 
   for (i = 0; i < num_objects; i++) {
     model->objects[i].position.x = 200 + i * 20;
@@ -250,10 +250,10 @@ model_init_molecule (Model *model)
 static void
 model_init_wobbly (Model *model)
 {
-  const int width = 6, height = 6;
+  const int width = 4, height = 4;
   const int num_objects = width * height;
   const int num_offset_springs = (width - 1) * height + width * (height - 1);
-  const int distance = 10;
+  const int distance = 20;
   double x, y;
   int i, j, object_index, spring_index;
 
@@ -262,7 +262,7 @@ model_init_wobbly (Model *model)
   model->num_objects = num_objects;
   model->offset_springs = g_new (OffsetSpring, num_offset_springs);
   model->num_offset_springs = num_offset_springs;
-  model->k = 1;
+  model->k = 6.5;
 
   model_init_polygons (model);
 
@@ -276,7 +276,7 @@ model_init_wobbly (Model *model)
       model->objects[object_index].position.y = y;
       model->objects[object_index].previous_position.x = x;
       model->objects[object_index].previous_position.y = y;
-      model->objects[object_index].mass = 0.3;
+      model->objects[object_index].mass = 0;
 
       if (i + 1 < width) {
        model->offset_springs[spring_index].a = &model->objects[object_index];
@@ -718,7 +718,7 @@ timeout_callback (gpointer data)
 {
   Closure *closure = data;
 
-  model_step (closure->model, 1);
+  model_step (closure->model, 0.4);
 
   closure->i++;
   if (closure->i == 1) {