Example #1
0
// 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);
  }
}
Example #2
0
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();
}