X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=main.c;h=2423b4f05069ab9c557a691e110984a5a8aeff2b;hb=4e16902eb4a956c7ea79cb4d7f7e56419ea29012;hp=0aec615ad7650ac2c0019fd07cdf068495a33d3b;hpb=9bdb07522bfbb2611a7e70f1204d96b98bc0e615;p=akamaru diff --git a/main.c b/main.c index 0aec615..2423b4f 100644 --- 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[i].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,29 +197,26 @@ 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); 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; - 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,39 @@ model_init_molecule (Model *model) static void model_init_wobbly (Model *model) { - const int width = 6, height = 6; + 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 = 10; + 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 = 1; + 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.3; - - 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++; } } } @@ -718,7 +680,7 @@ timeout_callback (gpointer data) { Closure *closure = data; - model_step (closure->model, 1); + model_step (closure->model, 0.2); closure->i++; if (closure->i == 1) {