// draw controls point around a figure void drawSel() { glColor3f(0, 0, 0); int size = figureSet.size(); Figure *f = figureSet[selected]; /* getPoint() is a virtual method: every figure has at least two points (is at least a line) */ int *pt1 = f->getPoint(1)->getCoords(); int *pt2 = f->getPoint(2)->getCoords(); glLoadName(size+1); drawQuad(pt1[0]-3, pt1[1]-3, pt1[0]+3, pt1[1]+3); glLoadName(size+2); drawQuad(pt2[0]-3, pt2[1]-3, pt2[0]+3, pt2[1]+3); if (Triangle *t = dynamic_cast<Triangle*>(f)) { // triangle: one more point int *pt3 = t->getPoint(3)->getCoords(); glLoadName(size+3); drawQuad(pt3[0]-3, pt3[1]-3, pt3[0]+3, pt3[1]+3); } else if (Quad *q = dynamic_cast<Quad*>(f)) { // quad: two more point int *pt3 = q->getPoint(3)->getCoords(); int *pt4 = q->getPoint(4)->getCoords(); glLoadName(size+3); drawQuad(pt3[0]-3, pt3[1]-3, pt3[0]+3, pt3[1]+3); glLoadName(size+4); drawQuad(pt4[0]-3, pt4[1]-3, pt4[0]+3, pt4[1]+3); } }
void mouseMotion(int x, int y) { Point *p = new Point(x, H2-y); if ((figType == POINTER) && sel) { Figure *f = figureSet[selected]; if (cpsel){ // the user is trying to move a control point (modify) f->setPoint(cp - figureSet.size(), p); } else { // the user want to move the figure as a block (move) // common points int xoffset = x - ox; int yoffset = oy - y; // openGl invert y coordinate int *pt1 = f->getPoint(1)->getCoords(); int *pt2 = f->getPoint(2)->getCoords(); // move coordinates basing on offsets Point *p1 = new Point(pt1[0] + xoffset, pt1[1] + yoffset); f->setPoint(1, p1); Point *p2 = new Point(pt2[0] + xoffset, pt2[1] + yoffset); f->setPoint(2, p2); if (Triangle *t = dynamic_cast<Triangle*>(f)) { int *pt3 = t->getPoint(3)->getCoords(); Point *p3 = new Point(pt3[0] + xoffset, pt3[1] + yoffset); t->setPoint(3, p3); } else if (Quad *q = dynamic_cast<Quad*>(f)) { int *pt3 = q->getPoint(3)->getCoords(); int *pt4 = q->getPoint(4)->getCoords(); Point *p3 = new Point(pt3[0] + xoffset, pt3[1] + yoffset); q->setPoint(3, p3); Point *p4 = new Point(pt4[0] + xoffset, pt4[1] + yoffset); q->setPoint(4, p4); } } ox = x; // refresh coordinates oy = y; } // show the figure while creating switch(figType) { case LINE: { Line *l = (Line*) figureSet.back(); l->setPoint(2, p); break; } case TRIANGLE: { Triangle *t = (Triangle*) figureSet.back(); t->setTriangle(p); break; } case QUAD: { Quad *q = (Quad*) figureSet.back(); q->setQuad(p); break; } } glutPostRedisplay(); }