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_enclosing_rectangle (&model->polygons[0], 10, 10, 700, 500);
+ model->anchors[0].x = 300;
+ model->anchors[0].y = 300;
+ model->anchors[0].object = &model->objects[0];
object = model->objects;
spring = model->springs;
for (i = 0; i < model->num_polygons; i++) {
p = &model->polygons[i];
- cairo_set_source_rgba (cr, color->red, color->green, color->blue, 0.4);
-
for (j = 0; j < p->num_points; j++)
cairo_line_to (cr, p->points[j].x, p->points[j].y);
cairo_close_path (cr);
+
+ if (p->enclosing) {
+ cairo_set_source_rgba (cr, color->red, color->green, color->blue, 0.1);
+ cairo_fill_preserve (cr);
+ }
+
+ cairo_set_source_rgba (cr, color->red, color->green, color->blue, 0.4);
+ if (p->enclosing)
+ cairo_stroke (cr);
+ else
+ cairo_fill (cr);
}
- cairo_fill (cr);
}
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;
}
GtkWidget *model_combo;
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
- gtk_window_set_title (GTK_WINDOW (window), "Akamaru");
+ gtk_window_set_title (GTK_WINDOW (window), "赤丸");
g_signal_connect (window, "destroy",
G_CALLBACK (gtk_main_quit), &window);