#include "akamaru.h"
const double elasticity = 0.7;
+const double friction = 1;
+const double gravity = 20;
void
polygon_init (Polygon *p, int num_points, ...)
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++) {
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
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;
model_accumulate_forces (model);
model_integrate (model, delta_t);
-
for (i = 0; i < 50; i++)
model_constrain (model);