From 97642dcac23601e6a30336706a2e47c399f3793c Mon Sep 17 00:00:00 2001 From: =?utf8?q?Kristian=20H=C3=B8gsberg?= Date: Tue, 23 May 2006 18:09:54 -0400 Subject: [PATCH] Tweaking. --- akamaru.c | 27 ++++++++++++++++++++++----- main.c | 14 +++++++------- 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) { -- 2.43.0