#include "akamaru.h"
const double elasticity = 0.5;
-const double friction = 1;
+const double friction = 4;
const double gravity = 50;
void
}
void
-polygon_init (Polygon *p, int num_points, ...)
+polygon_init (Polygon *p, int enclosing, int num_points, ...)
{
double dx, dy, length;
int i, j;
va_start (ap, num_points);
p->num_points = num_points;
p->points = g_new (Point, num_points);
+ p->enclosing = enclosing;
for (i = 0; i < num_points; i++) {
p->points[i].x = va_arg (ap, double);
void
polygon_init_diamond (Polygon *polygon, double x, double y)
{
- return polygon_init (polygon, 5,
+ return polygon_init (polygon, FALSE, 5,
x, y,
x + 10, y + 40,
x + 90, y + 40,
polygon_init_rectangle (Polygon *polygon, double x0, double y0,
double x1, double y1)
{
- return polygon_init (polygon, 4, x0, y0, x0, y1, x1, y1, x1, y0);
+ return polygon_init (polygon, FALSE, 4, x0, y0, x0, y1, x1, y1, x1, y0);
+}
+
+void
+polygon_init_enclosing_rectangle (Polygon *polygon, double x0, double y0,
+ double x1, double y1)
+{
+ return polygon_init (polygon, TRUE, 4, x0, y0, x0, y1, x1, y1, x1, y0);
}
void
dy = point->y - polygon->points[i].y;
if (polygon->normals[i].x * dx + polygon->normals[i].y * dy >= 0)
- return FALSE;
+ return polygon->enclosing;
}
- return TRUE;
+ return !polygon->enclosing;
}
static void
if (d > distance) {
distance = d;
edge = i;
- polygon->edge = i;
n = &polygon->normals[i];
}
}
int num_points;
Point *points;
Vector *normals;
- int edge;
+ int enclosing;
};
struct _Model {
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 (Polygon *p, int enclosing, int num_points, ...);
void polygon_init_diamond (Polygon *polygon, double x, double y);
void polygon_init_rectangle (Polygon *polygon, double x0, double y0,
double x1, double y1);
+void polygon_init_enclosing_rectangle (Polygon *polygon, double x0, double y0,
+ double x1, double y1);
void model_fini (Model *model);
model->polygons = g_new (Polygon, 1);
model->num_polygons = 1;
- polygon_init_rectangle (&model->polygons[0], -4000, y, 4000, 2000);
+ polygon_init_enclosing_rectangle (&model->polygons[0], 0, 0, 1024 - 50, y);
model->anchors[0].x = x;
model->anchors[0].y = y;
model->anchors[0].object = &model->objects[0];
- object_init (&model->objects[0], x, y, 1);
+ object_init (&model->objects[0], x, y, 20);
object = &model->objects[1];
spring = model->springs;
model->polygons = g_new (Polygon, 1);
model->num_polygons = 1;
- polygon_init_rectangle (&model->polygons[0], -400, 300, 1400, 350);
+ polygon_init_enclosing_rectangle (&model->polygons[0], 10, 10, 700, 500);
model->anchors[0].x = 300;
model->anchors[0].y = 300;
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);
}