]> git.cworth.org Git - akamaru/blobdiff - main.c
Add new Spacer constraint and a 'dock' model.
[akamaru] / main.c
diff --git a/main.c b/main.c
index 79bf4b546859e17c6bb06457488ce10f6f4b39be..39cb5ad1158a64535661f33fb6221138f74ca51d 100644 (file)
--- a/main.c
+++ b/main.c
@@ -49,11 +49,8 @@ model_init_snake (Model *model)
   model_init_polygons (model);
 
   for (i = 0; i < num_objects; i++) {
-    model->objects[i].position.x = random() % 200 + 20;
-    model->objects[i].position.y = random() % 200 + 20;
-    model->objects[i].previous_position.x = random() % 200 + 20;
-    model->objects[i].previous_position.y = random() % 200 + 20;
-    model->objects[i].mass = 1;
+    object_init (&model->objects[i],
+                random() % 200 + 20, random() % 200 + 20, 1);
 
     if (i + 1 < num_objects) {
       model->sticks[i * 2].a = &model->objects[i];
@@ -86,11 +83,7 @@ model_init_rope (Model *model)
   model_init_polygons (model);
 
   for (i = 0; i < num_objects; i++) {
-    model->objects[i].position.x = 200;
-    model->objects[i].position.y = 40 + i * stick_length;
-    model->objects[i].previous_position.x = 200;
-    model->objects[i].previous_position.y = 40 + i * stick_length;
-    model->objects[i].mass = 1;
+    object_init (&model->objects[i], 200, 40 + i * stick_length, 1);
 
     if (i + 1 < num_objects) {
       model->sticks[i].a = &model->objects[i];
@@ -133,11 +126,7 @@ model_init_curtain (Model *model)
       x = 200 + i * rope_offset;
       y = 40 + j * stick_length;
       index = i * num_rope_objects + j;
-      model->objects[index].position.x = x;
-      model->objects[index].position.y = y;
-      model->objects[index].previous_position.x = x;
-      model->objects[index].previous_position.y = y;
-      model->objects[index].mass = 1;
+      object_init (&model->objects[index], x, y, 1);
 
       if (j + 1 < num_rope_objects) {
        stick_index = i * (num_rope_objects - 1) + j;
@@ -163,8 +152,9 @@ model_init_grid (Model *model)
     (num_ropes - 1) * num_rope_objects;
   const int string_length = 20;
   const int rope_offset = 20;
-  double x, y;
-  int i, j, index, string_index;
+  Object *object;
+  String *string;
+  int i, j;
 
   memset (model, 0, sizeof *model);
   model->objects = g_new (Object, num_objects);
@@ -180,31 +170,18 @@ model_init_grid (Model *model)
   model->offsets[0].dx = rope_offset;
   model->offsets[0].dy = 0;
 
+  object = model->objects;
+  string = model->strings;
   for (i = 0; i < num_ropes; i++) {
     for (j = 0; j < num_rope_objects; j++) {
-      x = 200 + i * rope_offset;
-      y = 40 + j * string_length;
-      index = i * num_rope_objects + j;
-      model->objects[index].position.x = x;
-      model->objects[index].position.y = y;
-      model->objects[index].previous_position.x = x;
-      model->objects[index].previous_position.y = y;
-      model->objects[index].mass = 1;
-
-      if (i + 1 < num_ropes) {
-       string_index = i * num_rope_objects + j;
-       model->strings[string_index].a = &model->objects[index];
-       model->strings[string_index].b = &model->objects[index + num_rope_objects];
-       model->strings[string_index].length = string_length;
-      }
-
-      if (j + 1 < num_rope_objects) {
-       string_index =
-         (num_ropes - 1) * num_rope_objects + i * (num_rope_objects - 1) + j;
-       model->strings[string_index].a = &model->objects[index];
-       model->strings[string_index].b = &model->objects[index + 1];
-       model->strings[string_index].length = string_length;
-      }
+      object_init (object, 200 + i * rope_offset, 40 + j * string_length, 1);
+
+      if (i + 1 < num_ropes)
+       string_init (string++,
+                    object, object + num_rope_objects, string_length);
+      if (j + 1 < num_rope_objects)
+       string_init (string++, object, object + 1, string_length);
+      object++;
     }
 
     model->offsets[0].objects[i] = &model->objects[i * num_rope_objects];
@@ -220,6 +197,7 @@ model_init_molecule (Model *model)
   const int num_springs = num_objects * 2;
   const int spring_length = 50;
   int i;
+  Spring *spring;
 
   memset (model, 0, sizeof *model);
   model->objects = g_new (Object, num_objects);
@@ -228,21 +206,17 @@ model_init_molecule (Model *model)
   model->num_springs = num_springs;
   model->k = 2;
 
-  for (i = 0; i < num_objects; i++) {
-    model->objects[i].position.x = 200 + i * 20;
-    model->objects[i].position.y = 200;
-    model->objects[i].previous_position.x = 200 + i * 20;
-    model->objects[i].previous_position.y = 200;
-    model->objects[i].mass = 0;
-  }
+  for (i = 0; i < num_objects; i++)
+    object_init (&model->objects[i], 200 + i * 20, 200, 0);
 
+  spring = model->springs;
   for (i = 0; i < num_objects; i++) {
-    model->springs[i * 2].a = &model->objects[i];
-    model->springs[i * 2].b = &model->objects[(i + 1) % num_objects];
-    model->springs[i * 2].length = spring_length;
-    model->springs[i * 2 + 1].a = &model->objects[i];
-    model->springs[i * 2 + 1].b = &model->objects[(i + 2) % num_objects];
-    model->springs[i * 2 + 1].length = spring_length;
+    spring_init (spring++, &model->objects[i],
+                &model->objects[(i + 1) % num_objects],
+                spring_length);
+    spring_init (spring++, &model->objects[i],
+                &model->objects[(i + 2) % num_objects],
+                spring_length);
   }
 }
 
@@ -250,51 +224,86 @@ model_init_molecule (Model *model)
 static void
 model_init_wobbly (Model *model)
 {
-  const int width = 4, height = 4;
+  const int width = 8, height = 8;
   const int num_objects = width * height;
   const int num_offset_springs = (width - 1) * height + width * (height - 1);
-  const int distance = 20;
+  const int distance = 30;
   double x, y;
-  int i, j, object_index, spring_index;
+  int i, j;
+  Object *object;
+  OffsetSpring *spring;
 
   memset (model, 0, sizeof *model);
   model->objects = g_new (Object, num_objects);
   model->num_objects = num_objects;
   model->offset_springs = g_new (OffsetSpring, num_offset_springs);
   model->num_offset_springs = num_offset_springs;
-  model->k = 6.5;
+  model->k = 4.5;
 
   model_init_polygons (model);
 
-  object_index = 0;
-  spring_index = 0;
+  object = model->objects;
+  spring = model->offset_springs;
   for (i = 0; i < width; i++) {
     for (j = 0; j < height; j++) {
       x = 200 + i * distance;
       y = 40 + j * distance;
-      model->objects[object_index].position.x = x;
-      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;
-
-      if (i + 1 < width) {
-       model->offset_springs[spring_index].a = &model->objects[object_index];
-       model->offset_springs[spring_index].b = &model->objects[object_index + height];
-       model->offset_springs[spring_index].dx = distance;
-       model->offset_springs[spring_index].dy = 0;
-       spring_index++;
-      }
+      object_init (object, x, y, 0);
+
+      if (i + 1 < width)
+       offset_spring_init (spring++, object, object + height, distance, 0);
       
-      if (j + 1 < height) {
-       model->offset_springs[spring_index].a = &model->objects[object_index];
-       model->offset_springs[spring_index].b = &model->objects[object_index + 1];
-       model->offset_springs[spring_index].dx = 0;
-       model->offset_springs[spring_index].dy = distance;
-       spring_index++;
-      }
+      if (j + 1 < height)
+       offset_spring_init (spring++, object, object + 1, 0, distance);
 
-      object_index++;
+      object++;
+    }
+  }
+}
+
+static void
+model_init_dock (Model *model)
+{
+  const int num_objects = 8;
+  const int num_spacers = (num_objects - 1) * (num_objects - 2) / 2;
+  const int num_springs = num_objects - 1;
+  const int distance = 30;
+  double x, y;
+  int i, j;
+  Object *object;
+  Spring *spring;
+  Spacer *spacer;
+
+  memset (model, 0, sizeof *model);
+  model->objects = g_new (Object, num_objects);
+  model->num_objects = num_objects;
+  model->springs = g_new (Spring, num_springs);
+  model->num_springs = num_springs;
+  model->spacers = g_new (Spacer, num_spacers);
+  model->num_spacers = num_spacers;
+  model->k = 0.1;
+
+  model_init_polygons (model);
+  model->polygons = g_new (Polygon, 1);
+  polygon_init_rectangle (&model->polygons[0], -400, 300, 1400, 350);
+  model->num_polygons = 1;
+
+
+  object = model->objects;
+  spring = model->springs;
+  spacer = model->spacers;
+  for (i = 0; i < num_objects; i++, object++) {
+    x = 200 + i * distance / 3;
+    y = 40;
+    object_init (object, x, y, 1);
+    if (i == 0)
+      continue;
+    spring_init (spring++,
+                &model->objects[0],
+                &model->objects[i],
+                distance);
+    for (j = 1; j < num_objects - i; j++) {
+      spacer_init (spacer++, object, object + j, distance);
     }
   }
 }
@@ -592,7 +601,8 @@ create_model_store (void)
     { "Curtain", model_init_curtain },
     { "Grid", model_init_grid },
     { "Molecule", model_init_molecule },
-    { "Wobbly", model_init_wobbly }
+    { "Wobbly", model_init_wobbly },
+    { "Dock", model_init_dock }
   };
 
   GtkTreeIter iter;
@@ -718,7 +728,7 @@ timeout_callback (gpointer data)
 {
   Closure *closure = data;
 
-  model_step (closure->model, 0.4);
+  model_step (closure->model, 0.2);
 
   closure->i++;
   if (closure->i == 1) {