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

Chapitre VIII Découpage d’une scène selon une fenêtre donnée.

Présentations similaires


Présentation au sujet: "Chapitre VIII Découpage d’une scène selon une fenêtre donnée."— Transcription de la présentation:

1 Chapitre VIII Découpage d’une scène selon une fenêtre donnée

2 2 Découpage selon une fenêtre Scène visible par rapport à une fenêtre   i [OBJET i  FENÊTRE] Portée :Classement des algorithmes de découpage : Élimination de parties cachées Techniques d’ombrage Remplissage d’objets Modélisation solide Complexité géométrique de la fenêtre, des objets de la scène (convexité, planarité, …) Découpage 2D ou 3D Homogénéité de la scène Nombre d’objets dans la scène Respect de certains principes de cohérence Conservation de la structure géom. des objets Facilité d’implantation en quincaillerie

3 3 Découpage d’un segment de droite selon une fenêtre rectangulaire dont les côtés sont || aux axes Méthode « A » Pour chaque segment, retenir uniquement les points du segment à l’intérieur de la fenêtre. - coûteux : # points / segment est élevé. perte d’informations Méthode « B » : Algorithme de Cohen & Sutherland Il s’agit de calculer les parties de segments visibles p/r à une fenêtre. fenêtre C D A B A' B' E F G H H'

4 4 Découpage d’un segment de droite selon une fenêtre rectangulaire dont les côtés sont || aux axes PRINCIPE 9 régions délimitant la fenêtre : 12 3 45 6 78 9 fenêtre L’algorithmeÉlimine les segments ne traversant pas la fenêtre Calcule les intersections avec les droites de prolongement des arêtes de la fenêtre.

5 5 Découpage d’un segment de droite selon une fenêtre rectangulaire dont les côtés sont || aux axes Identification des régions : [Gauche, Haut][Haut] [Droite, Haut] [Gauche] [ ] [Droite] [Gauche, Bas] [Bas][Droite, Bas] fenêtre

6 6 Découpage d’un segment de droite selon une fenêtre rectangulaire dont les côtés sont || aux axes Exemples : P P P Q Q Q P' Q' P' Q' P'' Q'' fenêtre 3 cas :

7 7 Découpage d’un segment de droite selon une fenêtre rectangulaire dont les côtés sont || aux axes Implantation : Entrée : U  (u x, u y ) et V  (v x, v y ) : les extrémités du segment A  (a x, a y ) et B  (b x, b y ) : les vecteurs de la fenêtre Sortie : S et T : les extrémités du segment visible s’il existe. Ext : TRUE si le segment ne traverse pas la fenêtre FALSE sinon. U V B A unsigned int E1, E2;// le masque de chaque extrémité. unsigned int Gauche = 0X8U; // le 4e bit à partir de la droite est mis à 1. unsigned int Droite = 0X2U; // le 2e bit à partir de la droite est mis à 1. unsigned int Haut = 0X1U; // le 1e bit à partir de la droite est mis à 1. unsigned int Bas = 0X4U;// le 3e bit à partir de la droite est mis à 1. int C x, C y ;// renferme un point d’intersection C avec la fenêtre. 10010001 0011 10000000 0010 11000100 0110 1 3 2 4

8 8 Découpage d’un segment de droite selon une fenêtre rectangulaire dont les côtés sont || aux axes Implantation : Extérieur = FALSE; E1 = Caracteristiques(u x, u y ); E2 = Caractéristiques(v x, v y ); Ext = FALSE;// On suppose que le segment intercepte la fenêtre. S = U;T = V;// Au départ, le segment visible coïncide avec U-V. Soitunsigned int Caracteristiques( int w x, int w y ) { // Retourne un masque caractérisant la région renfermant (w x, w y ). unsigned int Masque = 0; if (w x < a x ) Masque = Masque | Gauche; if (w y < a y ) Masque = Masque | Bas; if (w x > b x ) Masque = Masque | Droite; if (w y > b y ) Masque = Masque | Haut; return Masque; }

9 9 Découpage d’un segment de droite selon une fenêtre rectangulaire dont les côtés sont || aux axes Implantation : Considérer l’une des 2 extrémités du segment en dehors de la fenêtre dont la caractéristique est disons « E »; while ((E1 != 0) || (E2 != 0)) { if ((E1 & E2) != 0)// le segment est à l’extérieur de la fenêtre {Ext = TRUE; Terminé. };

10 10 Découpage d’un segment de droite selon une fenêtre rectangulaire dont les côtés sont || aux axes Implantation : if ((Gauche & E) != 0) Calculer le point d’intersection C entre le segment U-V et la verticale X = a x c’est-à-dire, A B E = {Gauche, Bas} U V C c x = a x, c y = u y (v x - a x ) + v y (a x - u x ) (v x - u x )

11 11 Découpage d’un segment de droite selon une fenêtre rectangulaire dont les côtés sont || aux axes Implantation : else if ((Droite & E) != 0) Calculer le point d’intersection C entre le segment U-V et la verticale X = a y. ……………… Si l’extrémité considérée est à gauche alorsS = C; E1 = Caractéristiques(S); sinonT = C; E2 = Caractéristiques(T); }

12 12 Découpage d’un segment de droite selon une fenêtre polygonale convexe à N côtés 1 2 3 4 0001 0011 0010 0110 0100 1100 1000 1001 0000 P Caractéristique d’une région : vecteur binaire de longueur N i e bit  1  le demi-espace formé par le prolongement du i e côté, où se trouve la région étudiée, ne contient pas la fenêtre.

13 13 Découpage d’un segment de droite selon une fenêtre polygonale convexe à N côtés Schéma de calcul : 1 Détermination des équations des droites D i de prolongement des côtés du polygone. 2 Calcul d’un point P  (P x, P y ) appartenant à l’intérieur de la fenêtre polygonale. Calcul d’un vecteur de SIGNE pour P: enum SIGNE {PLUS = '+', MOINS = '-'}; SIGNE Signe_de_P[N]; for(i = 0; i < N; i++) Signe_de_P[i] = le signe de {P y - m i * P x - b i }; Soit D i  la droite de prolongement du i e côté, i.e. y = m i x + b i. 3 Pour chaque extrémité A et B du segment à l’étude, calculer les 2 vecteurs Signe_de_A et Signe_de_B comme en. 2

14 14 Découpage d’un segment de droite selon une fenêtre polygonale convexe à N côtés 4 Caractéristiques de l’extrémité A : Code_de_A[i] =0 si Signe_de_A[i] = Signe_de_P[i] 1 sinon Caractéristiques de l’extrémité B : Code_de_B[i] =0 si Signe_de_B[i] = Signe_de_P[i] 1 sinon 5 Si  {Code_de_A[i]  Code_de_B[i]}  0 i=1, 2, …,N alors le segment est invisible. FIN.

15 15 Découpage d’un segment de droite selon une fenêtre polygonale convexe à N côtés 6 Si Code_de_A = 0 & Code_de_B = 0 alors le segment est visible. FIN. 7 On cherche un bit non nul de Code_de_A ou de Code_de_B. Soit j l’indice de ce bit, Calculer le point d’intersection C du segment AB avec la droite quelconque D j. Éliminer la partie du segment non visible : si le j ième bit correspond à l’extrémité A, alorsA = C; calculer de nouveau vecteur Signe_de_A comme en ; calculer les nouvelles caractéristiques de A: Code_de_A. sinon B = C; calculer de nouveau vecteur Signe_de_B comme en ; calculer les nouvelles caractéristiques de B: Code_de_B. Retourner à l’étape 5. FIN DE L’ALGORITHME 2 2

16 16 Découpage d’un segment de droite selon une fenêtre polygonale convexe à N côtés 1 2 3 4 0001 0011 0010 0110 0100 1100 1000 1001 0000 P Exemple d’application de cet algorithme de Cohen & Sutherland.

17 17 Méthode « C » :Élimination des opérations de multiplication et de division Déterminer le point visible P v le plus loin de P 0 : 1 Si P 1 est visible alors P v = P 1 ; Extérieur = FALSE; FIN. 2 Q 0 = P 0 ; Q 1 = P 1 ; Extérieur = FALSE; 3 Si Q 0 Q 1 est à l’extérieur de la fenêtre de façon triviale alorsExtérieur = TRUE; FIN. 4 Soit P m le point milieu de Q 0 et Q 1, si P m Q 1 est à l’extérieur de la fenêtre de façon triviale alors Q 1 = P m ; retourner à l’étape sinon Q 0 = P m ; retourner à l’étape 3 4 P1P1 P0P0 P1P1 P0P0 P1P1 P0P0 FENÊTRE

18 18 Découpage d’un segment de droite selon une fenêtre rectangulaire dont les côtés sont || aux axes [Liang & Barsky, 84] (a, b) (c, d) (x, y)  (a +   x, b +   y),   [0, 1]  x = c - a  y = d - b FENÊTRE Q  (Q x, Q y ) P  (P x, P y ) (x, y)  FENÊTRE  P x  a +   x  Q x et P y  b +   y  Q y  p k   q k,k = 1, 2, 3, 4 oùp 1 = - p 2 = -  x, p 3 = - p 4 = -  y q 1 = a - P x, q 3 = b - P y, q 2 = Q x - a, q 4 = Q y - b.

19 19 Découpage d’un segment de droite selon une fenêtre rectangulaire dont les côtés sont || aux axes [Liang & Barsky, 84] (x, y)  FENÊTRE   q k / p k, si p k > 0;   q k / p k, si p k < 0;  Max q k / p k    Min q k / p k où  [0,1] p k 0 k = 1, 2, 3, 4 k = 1, 2, 3, 4. Il s’agit de calculer  1 et  2 les scalaires associés aux extrémités du segment visible:  1 = Max {0, Max q k / p k } p k < 0 k = 1, 2, 3, 4  2 = Min {1, Min q k / p k } p k > 0 k = 1, 2, 3, 4

20 20 Découpage d’un segment de droite selon une fenêtre rectangulaire dont les côtés sont || aux axes [Liang & Barsky, 84] Si  1   2 alors(a +  1  x, b +  1  y) et (a +  2  x, b +  2  y) sont les extrémités du segment visible. sinon le segment n’appartient pas à la fenêtre. (a, b) (c, d) 11  2 = 1  1 >  2

21 21 Les algorithmes précédents exigent la convexité de la fenêtre : vérification de la convexité d’un polygone Méthode A : Utilisation du produit vectoriel P 0, P 1, …, P N-1 les sommets du polygone R, P i : (x i, y i )  i. P i : (x i, y i, 0)  i.  v i : (P i - P i-1 ) x (P i+1 - P i )  i.  v i = {(x i - x i-1 ) (y i+1 - y i ) - (y i - y i-1 ) (x i+1 - x i )} k  v i = 0  i  cas dégénéré.  Les v i sont de mêmes signes  R est convexe.   i tel que v i = 0  sommets colinéaires. 

22 22 Vérification de la convexité d’un polygone Méthode B : Utilisation des transformations de base P 0, P 1, …, P N-1 les sommets du polygone R,  i = 0, 1, …, N - 1 1. Translation de R selon - P i. 2. Rotation autour de l’origine : P i+1 appartiendra à l’axe des x positifs. 3. Examiner le signe de y i+2. Si tous les signes sont identiques alors R est convexe. + Permet d’éliminer les dégénérescences : cas où y i+2 est égale à 0.

23 23 Découpage selon un polygone concave Méthode C : Décomposition d’un polygone concave en polygones convexes P 0, P 1, …, P N-1 les sommets du polygone R,  i = 0, 1, …, N – 1, 1. Translation de R selon - P i. 2. Rotation autour de l’origine de R dans le sens horaire: P i+1 est sur l’axe des x positifs 3. Examiner le signe de y i+2. Parcourons les sommets de R dans le sens antihoraire : Signe positif ou nul :: cas convexe Signe négatif :: décomposer R en 2 polygones à l’aide de l’axe des x.

24 24 Découpage selon un polygone concave PiPi P i+1 P i+2 P i+3 P i+4 P P i+5 P i+6 P i+7 P i+8 P i+9 P i+10 P i+11 P i+12 P i+13 P i+14 Calculer les points d’intersection entre la fenêtre R et l’axe des x : Déterminer 2 points communs aux polygones : P i et P Point d’intersection à droite de P i+1 dont l’abscisse est minimale.

25 25 Découpage selon un polygone concave i.e. à partir d’une liste de polygones convexes. PiPi P i+1 P i+2 P i+3 P i+4 P i+6 P i+7 P i+8 P i+9 P i+10 P i+11 P i+13 P i+14 P P i+3 P i+5 P P i+12 P i+14 PiPi P i+15 4. R est convexe. Résultat : Liste de polygones convexes On réitère avec les 2 nouveaux polygones.

26 26 Variante de l’algorithme précédent sans utiliser de transformations de base P 0, P 1, …, P N-1 les sommets du polygone R,  i = 0, 1, …, N – 1, Parcourons les sommets de R dans le sens antihoraire : 1. Si tous les sommets de R sont au-dessus de la droite de prolongement de l’arête P i -P i+1, alors le polygone R est convexe par rapport à cette arête; sinon décomposer R en 2 polygones à l’aide de cette droite : Calculer les points d’intersection entre la fenêtre R et la droite : Déterminer 2 points communs aux polygones : P i et P Point d’intersection à droite de P i+1 le plus près possible de P i+1.

27 27 Variante de l’algorithme précédent sans utiliser de transformations de base PiPi P i+1 P i+2 P i+3 P i+4 P P i+5 P i+6 P i+7 P i+8 P i+9 P i+10 P i+11 P i+12 P i+13 P i+14 2. On réitère avec les 2 nouveaux polygones. Le polygone R est convexe.

28 28 Découpage d’un segment de droite selon une fenêtre concave [Tilove, 81] sans décomposition Soit AB le segment à découper, construire STUV : un rectangle renfermant la fenêtre et AB, construire CD : un segment renfermant le sous-segment AB avec C et D à l’extérieur de STUV. S V T U C D A B

29 29 Découpage d’un segment de droite selon une fenêtre concave [Tilove, 81] sans décomposition Calculer la liste L des points d’intersection entre CD et les arêtes de la fenêtre. Attention : Traitement des cas spéciaux Associer à chaque point d’intersection P de la liste L le scalaire  tel que P  C +  (D – C). Trier la liste L en ordre croissant du scalaire  de chaque point. Soient P i,i = 0, 1, …, N, les points d’intersection de la liste L triée, les segments P 0 -P 1, P 2 -P 3, …, P N-1 P N sont visibles par rapport à la fenêtre. CD intercepte un sommet de la fenêtre ou renferme une arête de la fenêtre.

30 30 Découpage de polygones quelconques selon une fenêtre polygonale convexe avec comme résultante un polygone La partie visible du polygone doit rester polygonale. fenêtre

31 31 Découpage de polygones selon une fenêtre polygonale convexe avec comme résultante un polygone Algorithme de Sutherland-Hodgman (74) Découper le polygone par rapport à chaque arête de la fenêtre. Le polygone obtenu après le 1er découpage est utilisé pour le second, etc. arête courante

32 32 Algorithme en pseudo-code La fenêtre est définie à l’aide des sommets P 0, P 1, P 2, …, P n-1 dans le sens antihoraire et le polygone à découper à l’aide des sommets Q 0, Q 1, Q 2, …, Q m-1. Créer une liste L 1 des sommets Q 0, Q 1, Q 2, …, Q m-1, Q 0. Pour chaque valeur de i allant de 0 à n-1, Créer une liste vide L 2 de sommets. Poser R  le premier sommet de L 1. Si R est du côté de la fenêtre par rapport à l’arête P i - P i+1, alorsinitialiser la variable booléenne TEST à vrai et ajouter R dans la liste L 2. sinoninitialiser la variable booléenne TEST à faux.

33 33 Algorithme en pseudo-code Tant et aussi longtemps que la liste L 1 n’a pas été parcourue au complet Poser S  le sommet suivant de L 1. Si S est du côté de la fenêtre par rapport à l’arête P i - P i+1 alorssi TEST est faux alors initialiser la variable booléenne TEST à vrai; ajouter le point d’intersection entre l’arête P i - P i+1 de la fenêtre et l’arête R-S du polygone à découper dans la liste L 2. Ajouter S dans la liste L 2. sinonsi TEST est vrai alors initialiser la variable booléenne TEST à faux. ajouter le point d’intersection entre l’arête P i - P i+1 de la fenêtre et l’arête R-S du polygone à découper dans la liste L 2. S est affecté à R. Copier la liste L 2 dans la liste L 1.

34 34 Découpage de polygones selon une fenêtre polygonale convexe avec comme résultante un polygone arête courante À la fin de l’algorithme, la liste L 1 contient les sommets du polygone après découpage.

35 35 Découpage de polygones selon une fenêtre polygonale convexe avec comme résultante un polygone arête courante fenêtre - Créer des polygones intermédiaires complexes : - Créer des polygones dégénérés :

36 36 Découpage de polygones selon une fenêtre polygonale concave avec comme résultante un ou des polygones concaves Décomposition de la fenêtre en composantes convexes Algorithme de Weiler-Atherton (77) complexe Trou à l’intérieur du polygone à découper Polygone à découper Trou dans la fenêtre fenêtre Parcours simultanés des différents contours polygonaux.

37 37 Découpage dans l’espace à 3 dimensions 2 volumes de découpage :- parallélépipède rectangle - pyramide tronquée Extension de l’algorithme de Cohen-Sutherland droite proche loin gauche haut bas Projection en parallèle Projection en perspective z droite proche loin gauche haut bas

38 38 Découpage dans l’espace à 3 dimensions Extension de l’algorithme de Cohen-Sutherland On associe à chaque extrémité P du segment à découper, un vecteur binaire B de longueur 6. B i  1  P  région délimitée par le i e plan (coïncidant avec la i ième facette de la fenêtre) ne contenant pas le volume de découpage. les 2 extrémités du segment possède un code nul  le segment est visible. les 2 extrémités du segment possède un code dont un des bits est 1 pour les deux  le segment est invisible. Autrement, le segment est visible partiellement ou invisible sans que l’on puisse le déduire immédiatement. Autres extensions

39 39 Vérification de la propriété de convexité d’un volume dont les faces sont polygonales et décomposition en volumes convexes Utilisation des transformations de base 1. Translation du volume de telle sorte que l’un des sommets de cette face, disons Q, coïncide avec l’origine. 2. Effectuer une rotation autour de l’origine de telle façon que l’une des arêtes dont une des extrémités est Q coïncide avec l’axe des x. 3. Rotation autour de l’axe des x de sorte que cette facette polygonale coïncide avec le plan z = 0. Si tous les signes sont identiques alors le volume est convexe p/r à ce plan. Le volume est convexe s’il l’est p/r à tous les plans. Pour toute face polygonale du volume à découper, 4. Examiner le signe de la composante en z de tous les autres sommets du volume.

40 40 Vérification de la propriété de convexité d’un volume dont les faces sont polygonales et décomposition en volumes convexes Utilisation des transformations de base 5. Si le volume est concave, on le subdivise en 2 à l’aide du plan z = 0. 6. On recommence avec les 2 nouveaux volumes.

41 41 Extension du problème Présence de plusieurs fenêtres Découpage à l’intérieur ou à l’extérieur de la fenêtre Découpage d’objets non polygonaux p/r à une fenêtre non polygonale etc.


Télécharger ppt "Chapitre VIII Découpage d’une scène selon une fenêtre donnée."

Présentations similaires


Annonces Google