10 o->poly = polydup(o->tab->poly);
14 objpolymove(Obj *o, double x, double y, double θ)
22 polytrans(o->tab->poly, o->poly, x, y, θ);
23 polybbox(o->poly, &o->bbox);
27 for(h = o->hinge; h != nil; h = h->onext){
28 h->p.x = c * h->p0.x - s * h->p0.y + x;
29 h->p.y = s * h->p0.x + c * h->p0.y + y;
35 objpolydraw(Obj *o, Image *i)
40 polydraw(o->poly, i, o->tab->fill, o->tab->line);
41 for(h = o->hinge; h != nil; h = h->onext){
42 p.x = i->r.min.x + (int)(h->p.x + 0.5);
43 p.y = i->r.min.y + (int)(h->p.y + 0.5);
44 ellipse(i, p, 2, 2, 0, display->black, ZP);
49 mkobjpoly(ObjT *t, Poly *p, Image *fill, Image *line, double imass)
51 t->init = objpolyinit;
52 t->draw = objpolydraw;
53 t->move = objpolymove;
61 addhinge(ObjT *t, double x, double y)
65 h = emalloc(sizeof(Hinge));
69 h->cnext = h->cprev = h;
70 for(hp = &t->hinge; *hp != nil; hp = &(*hp)->onext)
81 p = emalloc(sizeof(Poly));
83 p->vert = emalloc(sizeof(Vec) * (n + 1));
84 for(i = 0; i < n; i++){
85 p->vert[i].x = 10 * cos(2 * PI * i / n);
86 p->vert[i].y = 10 * sin(2 * PI * i / n);
88 p->vert[n] = p->vert[0];
93 ObjT tdomino, tboard, thboard, tball, tfix;
98 mkobjpoly(&tdomino, mkpoly(4, 0.0, 0.0, 10.0, 0.0, 10.0, 40.0, 0.0, 40.0), rgb(0xFF0000FF), display->black, 10);
99 mkobjpoly(&tboard, mkpoly(4, 0.0, 0.0, 100.0, 0.0, 100.0, 6.0, 0.0, 6.0), rgb(0x663300FF), nil, 0);
100 mkobjpoly(&thboard, mkpoly(4, 0.0, 0.0, 100.0, 0.0, 100.0, 6.0, 0.0, 6.0), rgb(0x884400FF), nil, 0.5);
101 addhinge(&thboard, 48.0, 0.0);
102 addhinge(&thboard, -48.0, 0.0);
103 mkobjpoly(&tball, mkball(17), rgb(0x00FF00FF), nil, 3);
104 mkobjpoly(&tfix, mkpoly(3, 0.0, 0.0, 10.0, -17.3, 20.0, 0.0), rgb(0x663300FF), display->black, 0);
105 addhinge(&tfix, 0.0, 0.0);
106 addtray(&tdomino, &tboard, &thboard, &tfix, &tball, nil);