/* Triangle en 2D */ /* */ /* Auteur: Nicolas JANEY */ /* nicolas.janey@univ-fcomte.fr */ /* Novembre 2010 */ #include #include #include #include #include #include #include "Triangle2D.h" #include "Position2D.h" #include "Trace.h" Triangle2D::Triangle2D(void) { p1 = new Position2D(); p2 = new Position2D(); p3 = new Position2D(); } Triangle2D::Triangle2D(Position2D *pt1, Position2D *pt2, Position2D *pt3) { p1 = new Position2D(pt1); p2 = new Position2D(pt2); p3 = new Position2D(pt3); } Triangle2D::Triangle2D(Triangle2D *t) { p1 = new Position2D(t->p1); p2 = new Position2D(t->p2); p3 = new Position2D(t->p3); } Triangle2D::~Triangle2D(void) { delete(p1); delete(p2); delete(p3); } void Triangle2D::print(void) { p1->print(); printf("\n"); p2->print(); printf("\n"); p3->print(); printf("\n"); } static int round(double v) { return((int) (v + (( v > 0.0 ) ? 0.4999 : -0.4999))); } void Triangle2D::trace(void) { traceSegment(round(p1->c[0]),round(p1->c[1]), round(p2->c[0]),round(p2->c[1])); traceSegment(round(p1->c[0]),round(p1->c[1]), round(p3->c[0]),round(p3->c[1])); traceSegment(round(p3->c[0]),round(p3->c[1]), round(p2->c[0]),round(p2->c[1])); } static void gereAbscisse(int x,int y,int *xmin,int *xmax) { if ( x < xmin[y] ) xmin[y] = x; if ( x > xmax[y] ) xmax[y] = x; } static void traceCote(int xi,int yi,int xf,int yf, int *xmin,int *xmax,int ymin) { int i,cumul; yi -= ymin; yf -= ymin; int x = xi; int y = yi; int dx = xf - xi; int dy = yf - yi; int xinc = ( dx > 0 ) ? 1 : -1; int yinc = ( dy > 0 ) ? 1 : -1; dx = abs(dx); dy = abs(dy); gereAbscisse(x,y,xmin,xmax); if ( dx > dy ) { cumul = dx / 2; for ( i = 1 ; i <= dx ; i++ ) { x += xinc; cumul += dy; if (cumul >= dx) { cumul -= dx; y += yinc; } gereAbscisse(x,y,xmin,xmax); } } else { cumul = dy / 2; for ( i = 1 ; i <= dy ; i++ ) { y += yinc; cumul += dx; if ( cumul >= dy ) { cumul -= dy; x += xinc; } gereAbscisse(x,y,xmin,xmax); } } } void Triangle2D::remplit(void) { int ymin = round(p1->c[1]); int ymax = round(p1->c[1]); if ( round(p2->c[1]) < ymin ) ymin = round(p2->c[1]); if ( round(p2->c[1]) > ymax ) ymax = round(p2->c[1]); if ( round(p3->c[1]) < ymin ) ymin = round(p3->c[1]); if ( round(p3->c[1]) > ymax ) ymax = round(p3->c[1]); int dy = ymax-ymin+1; int *xmin =(int *) calloc(dy,sizeof(int)); int *xmax =(int *) calloc(dy,sizeof(int)); for ( int i = 0 ; i < dy ; i++ ) { xmax[i] = -1000000; xmin[i] = 1000000; } traceCote(round(p1->c[0]),round(p1->c[1]), round(p2->c[0]),round(p2->c[1]), xmin,xmax,ymin); traceCote(round(p1->c[0]),round(p1->c[1]), round(p3->c[0]),round(p3->c[1]), xmin,xmax,ymin); traceCote(round(p3->c[0]),round(p3->c[1]), round(p2->c[0]),round(p2->c[1]), xmin,xmax,ymin); glBegin(GL_POINTS); for ( int y = ymin ; y <= ymax ; y++ ) for ( int x = xmin[y-ymin] ; x <= xmax[y-ymin] ; x++ ) glVertex2i(x,y); glEnd(); free(xmin); free(xmax); }