Chapitre 3 Remplissage des polygones Achraf Othman Support du cours :
Polygones dans le plan Définition Un polygone Π dans le plan est une suite de segments Π = (S 1, S 2,, S n ) avec n ℵ * Et pour i = 1,,n, le segment S i est de la forme S i = [S i-1, S i ] Où P i est un point du plan pour i=0,,n avec P 0= P n P i s appelle un sommet du polygone Les segments S i s appellent les arêtes du polygone. 2
Polygones dans le plan Points intérieurs et points extérieurs Soit un polygone Π = (S 1, S 2,, S n ) et un point M du plan qui ne se trouve pas sur aucun des segments du Π. Considérons une demi-droite issue de M qui ne contient aucun des sommets du polygone Π. On dit que le point M est à l intérieur au polygone Π si la demi-droite intersecte un nombre impair de segments de Π. Sinon, si le nombre est pair, on dit que le point M est à l intérieur du polygone Π. 3
Polygones dans le plan Points intérieurs et points extérieurs 4
Polygones dans le plan Polygones convexes Un polygone Π = (S 1, S 2,, S n ) est dit convexe si pour tous points M et M qui sont intérieurs au polygone Π, le segment [MM ] est entièrement composé de points intérieurs au polygone Π. 5
Principe du remplissage de polygones Considérons un polygone Π du plan, dont tous les sommets ont des coordonnées entières. Le problème du remplissage consiste à trouver un algorithme permettant de parcourir tous les points de coordonnées entières du plan qui sont intérieurs du polygone. Parcourir et afficher tous les pixels qui se trouvent à l intérieur d un polygone donné sur un écran ou une image numérique. 6
Principe du remplissage de polygones Le principe du remplissage consiste à calculer des segments horizontaux inclus du polygone. 7
Principe du remplissage de polygones Nous devons déterminer, pour chaque horizontale, quels pixels sont à l intérieur du polygone: Les marquer Les afficher en couleur En faisant cela itérativement pour toutes les horizontales. On remplit complètement le polygone. 8
Principe du remplissage de polygones Le remplissage, pour chaque ligne horizontale, sera décomposé en trois étapes: 1) Trouver les extrémités des segments horizontaux inclus dans le polygone Π. Ces extrémités correspondent à des intersections de la ligne horizontale avec les arêtes du polygone. 2) Trier les extrémités obtenues à l étape 1 dans l ordre des coordonnées X croissantes. 3) Afficher tous les pixels qui sont à l intérieur du polygone entre paires d extrémités. On utilise la règle de parité pour déterminer qu un pixel se trouve à l intérieur de Π. 9
Parcours des arêtes Comment trouver les extrémités sur chaque horizontale Les extrémités des segments horizontaux inclus dans le polygone correspondent à des intersections d une horizontale avec les arêtes du polygone, donc à des points sur les arêtes. 10
Algorithme de parcours des arêtes du polygone (1) Détermination des extrémités des segments horizontaux inclut dans le polygone par un parcours des arêtes du polygone. Chaque arête du polygone va d un pixel (x bas, y bas ) à un pixel (x haut, y haut ) avec y bas < y haut. On fait varier l ordonnée y de y bas à y haut, et on obtient la relation suivante pour les coordonnées de l intersection de notre arête avec les horizontales: Où est l inverse de la pente de la droite. 11
Algorithme de parcours des arêtes du polygone (2) Pour se ramener à l arithmétique entière, on décompose la donnée 1/m en : Son numérateur numerat = x haut x bas, qui est de signe quelconque. Son dénominateur denomin = y haut y bas, qui est toujours strictement positif. On considère une variable entière increment telle que : représente, à une constante inférieure à 1 près, la partie fractionnaire de x i. La variable increment doit être augmentée de la quantité numerat à chaque étape (itération). On dessine un pixel dont l abscisse est arrondi de la valeur x i. 12
Algorithme de parcours des arêtes du polygone (3) Cette valeur arrondie doit être augmentée lorsque la quantité dépasse 1. On note Q la partie entière de, alors l abscisse du pixel à afficher doit être augmentée de la valeur Q. Il faut alors ramener la quantité à sa partie fractionnaire pour qu elle redevienne inférieure à 1. Astuce 1 : la variable increment doit rester ramenée entre 0 et (denomin-1) Astuce 2 : la variable increment doit être diminué de la Q x denomin. 13
Algorithme de parcours des arêtes du polygone (4) : initialisation L initialisation correcte de la variable increment dépend de la pente de la droite et du caractère gauche ou droite de l arête du polygone : Pour une arête gauche avec numerat>0 (pente positive), on a : int increment = denominateur 1 ; Pour une arête droite avec numerat > 0 (pente positive), on a : int increment = -1 ; Pour une arête gauche avec numerat <= 0 (pente négative), on a : int increment = 0 ; Pour une arête droite avec numerat <= 0 (pente négative), on a : int increment = - denominateur ; 14
Algorithme de parcours des arêtes du polygone (5) void gauche_pente_pos (int xbas, int ybas, int xhaut, int yhaut, int couleur) { }} int y; int x = xbas; int numerateur = xhaut xbas; int denominateur = yhaut / ybas; int increment = denominateur 1; int Q; for(y = ybas ; y <= yhaut ; y++) { PutPixel(x,y,couleur); increment += numerateur; Q = increment / denomintaeur; x += Q; increment -= Q * denominateur; 15
16
Algorithme de parcours des arêtes du polygone (7) Prenons l exemple d une arête : denomin = y haut y bas = 10 numerat = x haut x bas = 4 On suppose, par exemple que : xbas = 3 et ybas = 0 pente positive, initialisation : increment= denomin 1 = 9 Algorithme : 17
void gauche_pente_pos (int xbas, int ybas, int xhaut, int yhaut, int couleur) { int y; int x = xbas; int numerateur = xhaut xbas; int denominateur = yhaut / ybas; int increment = denominateur 1; int Q; for(y = ybas ; y <= yhaut ; y++) { PutPixel(x,y,couleur); increment += numerateur; Q = increment / denomintaeur; x += Q; increment -= Q * denominateur; }} denomin = y haut y bas = 10 numerat = x haut x bas = 4 y 0 1 2 3 4 5 6 7 8 9 10 increment 9 9+4=13 7 7+4=11 1+4=5 5+4=9 9+4=13 3+4=7 7+4=11 1+4=5 5+4=9 x 3 3+1=4 4 4+1=5 5+0=5 5+0=5 5+1=6 6+0=6 6+1=7 7+0=7 7+0=7 18 Pixel (3,0) (4,1) (4,2) (5,3) (5,4) (5,5) (6,6) (6,7) (7,8) (7,9) (7,10)
Remplissage de polygones Le cas du polygone convexe 19
Remplissage de polygones Algorithme 1 : Le cas du polygone convexe Avantage : pour chaque horizontale, on a au plus un segment horizontal inclus dans le polygone Π. Idée de l algorithme : Partir du bas du polygone vers le haut. Parcourir les arêtes qui bordent le polygone à gauche et à droite (en utilisant l algorithme précédent). 20
Remplissage de polygones Algorithme 1 : Le cas du polygone convexe Par exemple, pour le polygone Π : Parcourir les arêtes [AH] et [BC] Lorsqu on arrive à la hauteur 2 On remplace l arête [BC] par [CD] Parcourir les arêtes [AH] et [CD] Lorsqu on arrive à la hauteur 3 On remplace l arête [AH] par [HG] Parcourir les arêtes [HG] et [CD] Jusqu à la hauteur 7. 21
Remplissage de polygones Algorithme 2 : La tables des arêtes actives TAACONV On fait varier une variable y de l ordonnée du point le plus bas du polygone Π à l ordonnée du point le plus haut. On maintient une table des arêtes actives TAACONV qui: Pour une valeur donnée de y, code les deux arêtes du polygone qui intersectent : L horizontale de hauteur y Les abscisses arrondies des intersections de ces arêtes avec l horizontale de hauteur y Exemple : 22
Remplissage de polygones Algorithme 2 : La tables des arêtes actives TAACONV On représente la table des arêtes actives pour Π et pour y = {4,5,6} Exemple pour y = 4 : 23
TAACONV y = 4 : y haut x numerat denomin y haut x numerat denomin 6 4-1 3 5 9 1 3 24
Remplissage de polygones Algorithme 2 : La tables des arêtes actives TAACONV Lorsque la variable y est incrémentée, il faut mettre à jour la table des arêtes actives TAACONV, en remplaçant les arêtes pour laquelles y=y haut par les arêtes pour lesquelles y=y bas. Mettre à jour la donnée x des autres arêtes suivant l algorithme de parcours des arêtes. En déterminant la variable increment. En mémorise cette donnée dans increment[0] pour l arête à gauche et increment[1] pour l arête à droite. 25
TAACONV y = 5 : y haut x numerat denomin y haut x numerat denomin 6 4-1 3 7 9-4 2 26
TAACONV y = 6 : y haut x numerat denomin y haut x numerat denomin 7 3 2 1 7 7-4 2
Remplissage de polygones La table des arêtes globale TACONV Pour introduire rapidement une nouvelle arête telle que y=y bas, on construit une table des arêtes globale (TACONV) contenant toutes les arêtes non-horizontales du polygone, classées suivant leurs y bas. Exemple : 28
Remplissage de polygones La table des arêtes globale TACONV Coordo onnées de Y 7 6 5 4 3 7 3 2 1 7 10-4 2 6 4-1 3 5 9 1 3 2 3 6-2 2 2 7 2 1 TACONV y haut x bas numerat denomin y haut x bas numerat denomin 29
Remplissage de polygones La table des arêtes globale TACONV Chaque deux arêtes doivent apparaître dans la table TACONV ordonnées de gauche à droite. Une arête a1 est à gauche d une arête a2 si et seulement si : Soit a1.xmin < a2.xmin Soit a1.xmin = a2.xmin et (comparaison des pentes). Ce qui exprime en nombre entiers : a1.numerat x a2.numerat < a2.numerat x a1.denomin 30
Remplissage de polygones Algorithme E0 (init) : construite TACONV E1 : initialiser y à la plus petite valeur min(ybas) de ybas. E2 : copier les deux arêtes de la table TACONV à la hauteur 0 (la plus basse, correspondant à y) dans la table TAACONV. Initialiser les deux variables increment. E3 : Répéter tant que y est strictement inférieur à la plus grande valeur possible de yhaut : E3.1 : Afficher les pixels entre les deux pixels (x,y) correspondant aux deux éléments de TAACONV. E3.2 : Remplacer les arêtes de TAACONV qui ont leur yhaut égal à y par les arêtes de la table TACONV pour lesquelles ybas=y. E3.3 : Mettre à jour les valeurs de x dans TAACONV pour incrémenter y. E3.4 : incrémenter y. 31
Exercice d application Soient A(1,5) et B(7,1) deux points. En considérant le segment [AB] comme une arête gauche de polygone, appliquer l algorithme de parcours des arêtes utilisé dans l algorithme de remplissage de polygones pour parcourir l arête [AB]. En considérant le segment [AB] comme une arête droite de polygone, appliquer l algorithme de parcours des arêtes utilisé dans l algorithme de remplissage de polygones pour parcourir l arête [AB]. Refaire le même exercice pour A(1,2) et B(6,4). 32
Exercice d application Appliquer l algorithme de remplissage de polygones au polygone convexe représenté ci-dessus. 33
Fenêtrage de polygones 2D 34
35
36
Le support du cours est disponible sur le site : 37
Références 38