summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKristian Høgsberg <krh@redhat.com>2006-06-11 14:24:49 -0400
committerKristian Høgsberg <krh@redhat.com>2006-06-11 14:24:49 -0400
commit4b4b752bb845106529d270b73419b97e11d595c2 (patch)
tree5caa6ef1565f7f07af2285a3f312ad1ba1288ab6
parentb5f68f48302a165bed1dd5f824373189eacd85b9 (diff)
New feature: polygons can now enclose objects.
-rw-r--r--akamaru.c21
-rw-r--r--akamaru.h6
-rw-r--r--dock.c4
-rw-r--r--main.c16
4 files changed, 32 insertions, 15 deletions
diff --git a/akamaru.c b/akamaru.c
index 88277f6..cc55143 100644
--- a/akamaru.c
+++ b/akamaru.c
@@ -21,7 +21,7 @@
#include "akamaru.h"
const double elasticity = 0.5;
-const double friction = 1;
+const double friction = 4;
const double gravity = 50;
void
@@ -85,7 +85,7 @@ anchor_init (Anchor *anchor, Object *object, double x, double y)
}
void
-polygon_init (Polygon *p, int num_points, ...)
+polygon_init (Polygon *p, int enclosing, int num_points, ...)
{
double dx, dy, length;
int i, j;
@@ -97,6 +97,7 @@ polygon_init (Polygon *p, int num_points, ...)
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);
@@ -120,7 +121,7 @@ polygon_init (Polygon *p, int num_points, ...)
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,
@@ -132,7 +133,14 @@ void
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
@@ -276,10 +284,10 @@ polygon_contains_point (Polygon *polygon, Point *point)
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
@@ -297,7 +305,6 @@ polygon_reflect_object (Polygon *polygon, Object *object)
if (d > distance) {
distance = d;
edge = i;
- polygon->edge = i;
n = &polygon->normals[i];
}
}
diff --git a/akamaru.h b/akamaru.h
index cf7bf8b..77f8d58 100644
--- a/akamaru.h
+++ b/akamaru.h
@@ -69,7 +69,7 @@ struct _Polygon {
int num_points;
Point *points;
Vector *normals;
- int edge;
+ int enclosing;
};
struct _Model {
@@ -108,10 +108,12 @@ 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 (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);
diff --git a/dock.c b/dock.c
index bc439ff..54e4746 100644
--- a/dock.c
+++ b/dock.c
@@ -94,13 +94,13 @@ model_init_dock (Model *model, int num_items, int x, int y, int spacing)
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;
diff --git a/main.c b/main.c
index fd1318f..15fbce4 100644
--- a/main.c
+++ b/main.c
@@ -279,7 +279,7 @@ model_init_dock (Model *model)
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;
@@ -441,14 +441,22 @@ draw_polygons (cairo_t *cr, Model *model, Color *color)
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);
}