16 p = emalloc(sizeof(Poly));
18 p->vert = emalloc((n + 1) * sizeof(Vec));
20 for(i = 0; i < n; i++){
21 p->vert[i].x = va_arg(va, double);
22 p->vert[i].y = va_arg(va, double);
24 p->vert[n] = p->vert[0];
41 for(i = 0; i < o->nvert; i++){
44 t = p->x * q->y - p->y * q->x;
46 x += (p->x + q->x) * t / 3;
47 y += (p->y + q->y) * t / 3;
51 for(i = 0; i <= o->nvert; i++){
55 for(i = 0; i < o->nvert; i++){
58 t = p->x * q->y - p->y * q->x;
59 I += (p->x * (p->x + q->x) + q->x * q->x + p->y * (p->y + q->y) + q->y * q->y) * t / 6;
70 q = emalloc(sizeof(Poly));
72 q->vert = emalloc((p->nvert + 1) * sizeof(Vec));
73 for(i = 0; i <= p->nvert; i++)
74 q->vert[i] = p->vert[i];
80 polytrans(Poly *sp, Poly *dp, double x0, double y0, double θ)
85 assert(sp->nvert == dp->nvert);
88 for(i = 0; i <= sp->nvert; i++){
91 dp->vert[i].x = x0 + x * c - y * s;
92 dp->vert[i].y = y0 + x * s + y * c;
98 polybbox(Poly *sp, Rectangle *t)
100 int fx, fy, cx, cy, i;
102 t->min.x = floor(sp->vert[0].x - Slop);
103 t->max.x = ceil(sp->vert[0].x + Slop) + 1;
104 t->min.y = floor(sp->vert[0].y - Slop);
105 t->max.y = ceil(sp->vert[0].y + Slop) + 1;
106 for(i = 1; i < sp->nvert; i++){
108 cx = ceil(fx + Slop); fx = floor(fx - Slop);
109 fy = sp->vert[i].y + 1;
110 cy = ceil(fy + Slop); fy = floor(fy - Slop);
111 if(fx < t->min.x) t->min.x = fx;
112 if(cx > t->max.x) t->max.x = cx;
113 if(fy < t->min.y) t->min.y = fy;
114 if(cy > t->max.y) t->max.y = cy;
119 polydraw(Poly *p, Image *d, Image *fill, Image *line)
125 if(p->nvert + 1 > maxp){
128 buf = emalloc((p->nvert + 1) * sizeof(Point));
130 for(i = 0; i <= p->nvert; i++){
131 buf[i].x = d->r.min.x + (int)(p->vert[i].x + 0.5);
132 buf[i].y = d->r.min.y + (int)(p->vert[i].y + 0.5);
134 if(fill != nil) fillpoly(d, buf, p->nvert + 1, 0, fill, ZP);
135 if(line != nil) poly(d, buf, p->nvert + 1, 0, 0, 0, line, ZP);
147 hingedup(Hinge *h, Obj *o)
153 for(; h != nil; h = h->onext){
154 p = emalloc(sizeof(Hinge));
158 p->cnext = p->cprev = p;
170 o = emalloc(sizeof(Obj));
172 o->hinge = hingedup(t->hinge, o);
174 o->next = o->prev = o;
183 p = emalloc(sizeof(Obj));
185 p->poly = polydup(o->poly);
186 p->next = p->prev = p;
187 p->hinge = hingedup(p->hinge, p);
192 objcat(Obj *l, Obj *o)
201 polycheck(Poly *a, Poly *b)
207 for(i = 0; i < a->nvert; i++){
210 for(j = 0; j < b->nvert; j++){
213 d = (z->y - x->y) * (y->x - x->x) - (z->x - x->x) * (y->y - x->y);
214 d /= vecdist(*x, *y);
215 if(d < -Slop) goto next;
219 }else if(d < 0) goto next;
228 objcoll(Obj *a, Obj *b)
230 if(!rectXrect(a->bbox, b->bbox)) return 0;
231 if(a->poly == nil || b->poly == nil) return 0;
232 return polycheck(a->poly, b->poly) || polycheck(b->poly, a->poly);
240 o->next->prev = o->prev;
241 o->prev->next = o->next;
244 for(h = o->hinge; h != nil; h = h->onext){
245 h->cprev->cnext = h->cnext;
246 h->cnext->cprev = h->cprev;
262 hinged(Obj *a, Obj *b)
266 if(b->hinge == nil) return 0;
267 for(k = a->hinge; k != nil; k = k->onext)
268 for(l = k->cnext; l != k; l = l->cnext)
269 for(m = b->hinge; m != nil; m = m->onext)
286 for(o = l->next; o != l; o = o->next)
287 for(h = o->hinge; h != nil; h = h->onext){
288 for(hh = h->cnext; hh != h; hh = hh->cnext)
291 if(hh == h) continue;
298 copyhinges(Obj *sl, Obj *dl)
304 for(n = 0, o = sl->next; o != sl; o = o->next)
306 ol = emalloc(sizeof(Obj *) * n);
307 for(n = 0, o = dl->next; o != dl; o = o->next)
309 for(o = sl->next, p = dl->next; o != sl; o = o->next, p = p->next){
310 for(h = o->hinge, k = p->hinge; h != nil; h = h->onext, k = k->onext){
311 if(h->cnext == h) continue;
312 for(l = h->cnext->o->hinge, n = 0; l != h->cnext; l = l->onext)
314 for(l = ol[h->cnext->o->idx]->hinge; n != 0; n--)
316 l->cprev->cnext = k->cnext;
317 k->cnext->cprev = l->cprev;