spacer->length = length;
}
+void
+anchor_init (Anchor *anchor, Object *object, double x, double y)
+{
+ anchor->object = object;
+ anchor->x = x;
+ anchor->y = y;
+}
+
void
polygon_init (Polygon *p, int num_points, ...)
{
}
}
+static void
+model_constrain_anchor (Model *model, Anchor *anchor)
+{
+ anchor->object->position.x = anchor->x;
+ anchor->object->position.y = anchor->y;
+ anchor->object->previous_position.x = anchor->x;
+ anchor->object->previous_position.y = anchor->y;
+}
+
static void
model_constrain_offset (Model *model, Offset *offset)
{
double dx, dy, x, y, distance, fraction;
int i;
- /* Anchor object constraint. */
- if (model->anchor_object != NULL) {
- model->anchor_object->position.x = model->anchor_position.x;
- model->anchor_object->position.y = model->anchor_position.y;
- model->anchor_object->previous_position.x = model->anchor_position.x;
- model->anchor_object->previous_position.y = model->anchor_position.y;
- }
+ if (model->mouse_anchor.object != NULL)
+ model_constrain_anchor (model, &model->mouse_anchor);
+ for (i = 0; i < model->num_anchors; i++)
+ model_constrain_anchor (model, &model->anchors[i]);
/* String constraints. */
for (i = 0; i < model->num_strings; i++) {
typedef struct _Spring Spring;
typedef struct _OffsetSpring OffsetSpring;
typedef struct _Spacer Spacer;
+typedef struct _Anchor Anchor;
typedef struct _Polygon Polygon;
typedef struct _Offset Offset;
typedef struct _Model Model;
int length;
};
+struct _Anchor {
+ Object *object;
+ double x, y;
+};
+
struct _Polygon {
int num_points;
Point *points;
OffsetSpring *offset_springs;
int num_spacers;
Spacer *spacers;
+ int num_anchors;
+ Anchor *anchors;
int num_polygons;
Polygon *polygons;
double k;
double friction;
- Object *anchor_object;
- Vector anchor_position;
+ Anchor mouse_anchor;
double theta;
};
void stick_init (Stick *stick, Object *a, Object *b, double length);
void string_init (String *string, Object *a, Object *b, double length);
void spacer_init (Spacer *spacer, Object *a, Object *b, double length);
+void anchor_init (Anchor *anchor, Object *object, double x, double y);
void polygon_init (Polygon *p, int num_points, ...);
void polygon_init_diamond (Polygon *polygon, double x, double y);
model->sticks[i * 2 + 1].length = random() % 20 + 20;
}
}
-
- model->anchor_object = NULL;
}
static void
model->sticks[i].length = stick_length;
}
}
-
- model->anchor_object = NULL;
}
static void
model->offsets[0].objects[i] = &model->objects[i * num_rope_objects];
}
-
- model->anchor_object = NULL;
}
static void
model_init_grid (Model *model)
{
- const int num_ropes = 4;
- const int num_rope_objects = 4;
+ const int num_ropes = 8;
+ const int num_rope_objects = 8;
const int num_objects = num_ropes * num_rope_objects;
const int num_strings = num_ropes * (num_rope_objects - 1) +
(num_ropes - 1) * num_rope_objects;
model->offsets[0].objects[i] = &model->objects[i * num_rope_objects];
}
-
- model->anchor_object = NULL;
}
static void
model->num_springs = num_springs;
model->spacers = g_new (Spacer, num_spacers);
model->num_spacers = num_spacers;
+ model->anchors = g_new (Anchor, 1);
+ model->num_anchors = 1;
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;
+ polygon_init_rectangle (&model->polygons[0], -400, 300, 1400, 350);
+ model->anchors[0].x = 300;
+ model->anchors[0].y = 300;
+ model->anchors[0].object = &model->objects[0];
object = model->objects;
spring = model->springs;
if (event->button != 1)
return TRUE;
- closure->model->anchor_position.x = event->x;
- closure->model->anchor_position.y = event->y;
- closure->model->anchor_object = model_find_nearest (closure->model,
- event->x, event->y);
+ closure->model->mouse_anchor.x = event->x;
+ closure->model->mouse_anchor.y = event->y;
+ closure->model->mouse_anchor.object =
+ model_find_nearest (closure->model, event->x, event->y);
return TRUE;
}
if ((event->state & GDK_BUTTON1_MASK) == 0)
return TRUE;
- closure->model->anchor_object = NULL;
+ closure->model->mouse_anchor.object = NULL;
return TRUE;
}
gdk_window_get_pointer (event->window, &x, &y, &state);
- closure->model->anchor_position.x = x + 0.5;
- closure->model->anchor_position.y = y + 0.5;
+ closure->model->mouse_anchor.x = x + 0.5;
+ closure->model->mouse_anchor.y = y + 0.5;
return TRUE;
}