/* Programme pour tester les routines de remplissage de polygone. Compilé et lié avec Borland C++ 4.02 dont: bcc -ms l21-3.c l21-2.c l21-1.c Testé par Jim Mischel 11/30/94. */ #include #include #include "polygon.h" /* Affiche le polygone décrit par la liste de points PointList dans la couleur Color avec tous les points ayant des coordonnés sous la forme(X,Y) */ #define DRAW_POLYGON(PointList,Color,X,Y) \ Polygon.Length = sizeof(PointList)/sizeof(struct Point); \ Polygon.PointPtr = PointList; \ FillConvexPolygon(&Polygon, Color, X, Y); void main(void); extern int FillConvexPolygon(struct PointListHeader *, int, int, int); void main() { int i, j; struct PointListHeader Polygon; static struct Point ScreenRectangle[] = {{0,0},{320,0},{320,200},{0,200}}; static struct Point ConvexShape[] = {{0,0},{121,0},{320,0},{200,51},{301,51},{250,51},{319,143}, {320,200},{22,200},{0,200},{50,180},{20,160},{50,140}, {20,120},{50,100},{20,80},{50,60},{20,40},{50,20}}; static struct Point Hexagon[] = {{90,-50},{0,-90},{-90,-50},{-90,50},{0,90},{90,50}}; static struct Point Triangle1[] = {{30,0},{15,20},{0,0}}; static struct Point Triangle2[] = {{30,20},{15,0},{0,20}}; static struct Point Triangle3[] = {{0,20},{20,10},{0,0}}; static struct Point Triangle4[] = {{20,20},{20,0},{0,10}}; union REGS regset; /* Active l'affichage du mode 13h de VGA, le mode 320x200 en 256 couleurs */ regset.x.ax = 0x0013; /* AH = 0 sélectionne la fonction initialisation du mode, AL = 0x13 sélectionne le mode 0x13 quand il est mis comme paramètre de INT 0x10 */ int86(0x10, ®set, ®set); /* Efface l'écran en cyan */ DRAW_POLYGON(ScreenRectangle, 3, 0, 0); /* Affiche une forme irrégulière qui correspond à notre définition de convexe mais n'est pas convexe selon la définition normale */ DRAW_POLYGON(ConvexShape, 6, 0, 0); getch(); /* attend une touche clavier */ /* Affiche des triangles adjacents dans la moitié supérieure de l'écran */ for (j=0; j<=80; j+=20) { for (i=0; i<290; i += 30) { DRAW_POLYGON(Triangle1, 2, i, j); DRAW_POLYGON(Triangle2, 4, i+15, j); } } /* Affiche des triangles dans la moitié inférieure de l'écran */ for (j=100; j<=170; j+=20) { /* Traite une rangée de triangles pointant à droite */ for (i=0; i<290; i += 20) { DRAW_POLYGON(Triangle3, 40, i, j); } /* Traite une rangée de triangles pointant à gauche à mi-chemin entre une rangée de triangles pointant à droite et encore une autre entre les deux */ for (i=0; i<290; i += 20) { DRAW_POLYGON(Triangle4, 1, i, j+10); } } getch(); /* attend une touche clavier */ /* affiche une série d'hexagones concentriques de mêmes proportions au centre de l'écran */ for (i=0; i<16; i++) { DRAW_POLYGON(Hexagon, i, 160, 100); for (j=0; j= 0 ? 3 : -3; Hexagon[j].Y -= Hexagon[j].Y >= 0 ? 2 : -2; } else { Hexagon[j].Y -= Hexagon[j].Y >= 0 ? 3 : -3; } } } getch(); /* attend un touche clavier */ /* Retourne en mode texte et quitte */ regset.x.ax = 0x0003; /* AL = 3 sélectionne le mode texte 80x25 */ int86(0x10, ®set, ®set); }