La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

1 Génération dun segment de droite. 2 Génération dun segment de droite « point par point » x1x1 y1y1 x2x2 y2y2 Objectif : Afficher le segment de droite.

Présentations similaires


Présentation au sujet: "1 Génération dun segment de droite. 2 Génération dun segment de droite « point par point » x1x1 y1y1 x2x2 y2y2 Objectif : Afficher le segment de droite."— Transcription de la présentation:

1 1 Génération dun segment de droite

2 2 Génération dun segment de droite « point par point » x1x1 y1y1 x2x2 y2y2 Objectif : Afficher le segment de droite (x 1, y 1 )-(x 2, y 2 ) i.e. choisir les « pixels » les plus « proches » du segment à tracer VOISINAGE DUN POINT Critères de choix dun bon algorithme : efficacitésimplicitéCorrespondance avec le segment réel

3 3 Algorithme DDA Soient (x 1, y 1 )-(x 2, y 2 ) les extrémités du segment, x = x 2 - x 1 (x, y) le point courant, y = y 2 - y 1 (x, y ) est le prochain point généré. où x = x + x, > 0 y = y + y (x, y ) segment de droite (x 1, y 1 )-(x 2, y 2 )car (y - y) / (x - x) = y / x = pente du segment de droite ([x + 0.5], [y + 0.5]) est considéré.

4 4 Plusieurs choix du pas A = 1 / max(| x |, | y |) x = 1 et y = pente y = 1 et x = 1 / pente ou Implantation : | y| > | x| Nb_de_points_generes | y| xinc x / Nb_de_points_generes yinc (signe de y) 1 Nb_de_points_generes | x| yinc y / Nb_de_points_generes xinc (signe de x) 1 vrai faux x x ; y y ; Répéter Nb_de_points_generes fois Afficher([x], [y]) x x + xinc y y + yinc

5 5 Algorithme DDA avec = 1 / max(| x |, | y |) Une division réelle et 4 variables réelles est-il suffisamment petit ou trop petit? Quarrive-t-il dans le cas dun segment horizontal, dun segment vertical dun segment dont la pente est 1

6 6 Deuxième choix du pas B = 2 -n, où 2 n-1 max(| x |, | y |) 2 n Recherche de n : [log 2 {max(| x |, | y |) }] comment procéder? Implantation : eps_dx | x| et eps_dy | y| nb_iterations 1 Tant et aussi longtemps que eps_dx 1ou eps_dy 1 faire décaler dune position vers la droite eps_dx décaler dune position vers la droite eps_dy décaler dune position vers la gauche nb_iterations x x ; y y ; eps_dx = (signe de x) eps_dx;eps_dy = (signe de y) eps_dy; Répéter « nb_iterations » fois Afficher([x], [y]) x x + eps_dx;y y + eps_dy 2 n points à afficher

7 7 Algorithme DDA avec = 2 -n, où 2 n-1 max(| x |, | y |) 2 n Pas de divisions réelles Présence de variables réelles 2 n > max(| x |, | y |)?????

8 8 Algorithme de Bresenham Mouvements élémentaires à partir dun point :4 mouvements axiaux + 4 mouvements diagonaux Cas simple 1er quadrant : x 0, y 0 Hypothèse non restrictive : une des extrémités du segment est prise comme origine. Il sagit de déterminer une suite de mouvements axiaux et/ou diagonaux.

9 9 Algorithme de Bresenham Soit le point courant (r, q) dans le premier octant, (r, q) (r+1, q+1) (r+1, q) mouvement axial mouvement diagonal Segment à afficher s2 s1 2 alternatives :(r+1, q) et (r+1, q+1) Le choix se fait en comparant les longueurs s1 et s2 : si q+1-s < s-q alors effectuer un mouvement diagonal sinon effectuer un mouvement axial Note : On pose s ordonnée du point dintersection du segment avec la verticale x = r + 1.

10 10 Choix entre un mouvement axial et un mouvement diagonal Extrémité initiale du segment : lorigine s = y (r + 1) / x q s < s - q q y (r + 1) / x < y (r + 1) / x - q Puisque x > 0, 2 ( - q x + r y) + 2 y - x > 0 Posons e(r, q) = 2 ( - q x + r y) + 2 y - x, e(r+1, q) = e(r,q) + 2 y e(r+1, q+1) = e(r,q) + 2 ( y - x) e(0,0) = 2 y - x

11 11 Implantation de lalgorithme de Bresenham Soient dx, dy, x, y, e, inc_axial, inc_diagonal des variables entières, y 0 inc_axial 2 * dy; e inc_axial - dx; inc_diagonal e - dx; Pour x = 0 jusquà dx faire afficher(x, y); si e 0alorsy y + 1 e e + inc_diagonal sinone e + inc_axial FIN

12 12 Génération dun arc de cercle

13 13 Génération dun arc de cercle Soit C : (C x, C y ) le centre du cercle de rayon r, léquation du cercle est : (x - C x ) 2 + (y - C y ) 2 = r 2. 1.Translation de -C : x 2 + y 2 = r 2. 2.Calcul des points (x, y) pour générer le cercle centré à lorigine. 3.Translation de C. x 2 + y 2 = r 2 d y 2 = - 2x = 2 y dydx dy =-x dx y y n+1 - y n - x n x n+1 - x n y n (x n, y n ) (x n+1, y n+1 ) dy dx (x n, y n ) y n+1 - y n = - x n x n+1 - x n = y n où = 2 -n, 2 n-1 r < 2 n Note : On obtient une spirale car x 2 n+1 + y 2 n+1 = (1 + 2 ) r 2 si (x n, y n ) cercle. A.

14 14 Génération dun arc de cercle Solution à ce problème : Si est petit, aucun problème. Alternative : x n+1 - x n = y n y n+1 - y n = - x n+1 On a : x 2 n+1 + y 2 n+1 [( ) r 2, (1 + 2 ) r 2 ] si (x n, y n ) cercle. B. Approche exacte x n+1 y n+1 = R xnxn ynyn = x n cos - y n sin y n cos + x n sin où x 2 n+1 + y 2 n+1 = r 2 C. Approximation d un cercle par un polygone à N côtés (x i, y i ) :(r cos 2 i/ N, r sin 2 i / N),i= 1, 2, …, N sont les sommets du polygone.

15 15 Génération dun arc de cercle D. Adaptation de lalgorithme de Bresenham On doit profiter au maximum des propriétés de symétrie dun cercle. On considère un octant seulement, celui allant de (0, R) à (R / 2, R / 2). Les autres octants sont générés par simple symétrie. Le point de départ est donc (0, R). x = 1, 2, … R / 2(jusquà ce que x = y) soit (u,v) le dernier point généré, deux candidats sont possibles : (u+1,v) et (u+1,v-1), soit y lordonnée du point appartenant au cercle dont labscisse est u+1, alorsy 2 = R 2 – (u+1) 2. v y v-1 u+1 d1d1 d2d2 On obtient :d 1 = v 2 – y 2 = v 2 – R 2 + (u+1) 2 d 2 = y 2 – (v-1) 2 = R 2 – (u+1) 2 - (v-1) 2

16 16 Génération dun arc de cercle Posonsp(u, v)= d 1 – d 2 = 2 (u+1) 2 + v 2 – 2R 2 + (v-1) 2. Si p(u, v) < 0alors choisir (u + 1, v) sinon choisir (u + 1, v – 1). De plus, on obtient : Mouvement axial :p(u+1, v) = p(u, v) + 4u + 6 Mouvement diagonal : p(u+1, v-1) = p(u, v) + 4(u - v) + 10.

17 17 Élimination de leffet descalier

18 18 Élimination de leffet descalier Problème : Les algorithmes de génération de points forment des paliers horizontaux ou verticaux. Pour éliminer ces effets, plusieurs solutions sont possibles : 1. Faire varier lintensité lumineuse du point selon sa distance au point théorique. 2. Techniques de simulation de grisée : Ex. : un pixel une matrice 3 x 3 etc.

19 19 Dautres solutions Chaque segment aura donc une largeur de trait, fonction de la dimension du rectangle. un point à lécran (pixel) rectangle On fixe lintensité dune position à lécran à partir de laire de la partie du rectangle recouverte par cette position. 3. On fixe lintensité globale en fonction de la pente. 4. Utilisation dun mode de résolution élevée 5.

20 20 Variante de lalgorithme de Bresenham Stratégie : à chaque étape, choisir un point principal le plus proche du trait théorique et un point secondaire (lautre point). Soit le point courant (r, q) dans le premier octant, (r, q) (r+1, q+1) (r+1, q) mouvement axial mouvement diagonal Segment à afficher s2 s1 2 alternatives :(r+1, q) et (r+1, q+1) Le choix se fait toujours en comparant les longueurs s1 et s2 :(on pose s s2) si q+1-s < s-q alors effectuer un mouvement diagonal (intensité maximale) effectuer un mouvement axial (intensité plus faible) sinon effectuer un mouvement axial (intensité maximale) effectuer un mouvement diagonal(intensité plus faible) 6.


Télécharger ppt "1 Génération dun segment de droite. 2 Génération dun segment de droite « point par point » x1x1 y1y1 x2x2 y2y2 Objectif : Afficher le segment de droite."

Présentations similaires


Annonces Google