summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKristian Høgsberg <krh@redhat.com>2006-05-23 18:09:54 -0400
committerKristian Høgsberg <krh@dinky.bitplanet.net>2006-05-23 18:09:54 -0400
commit97642dcac23601e6a30336706a2e47c399f3793c (patch)
treeda4fc2e41271b57576c748e56d918faf20852a3b
parent9bdb07522bfbb2611a7e70f1204d96b98bc0e615 (diff)
Tweaking.
-rw-r--r--akamaru.c27
-rw-r--r--main.c14
2 files changed, 29 insertions, 12 deletions
diff --git a/akamaru.c b/akamaru.c
index 8dc477c..8a9e587 100644
--- 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 0aec615..79bf4b5 100644
--- 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) {