Connexité (suite)

Voir la documentation de Ch. Ronse, notamment

Thm de Jordan

Une figure fermée (courbe simple du plan) sépare le plan en deux régions : intérieur et extérieur.

Pour que cela soit vrai dans le plan discrétisé pour des courbes simples fermées (les bords des zones, objets, ou figures) vérifiant 4-adjacence il faut prendre 8-adjacence pour le fond, et vice versa.

Modélisation par éléments de volume (voxels)

  • Décomposition des objets en voxels (discrétisation)
  • Enumération des voxels appartenant à un objet
  • Représentation (structure de données)
    • par listes de voxels…n'est pas très
    • par arbre octal : octree

FIXME à compléter

Partitionnement régulier

Partitionnement binaire

Partitionnement binaire selon les bords de l'objet (BSP = Binary Space Partitioning).

  • L'espace est divisé en deux à l'aide d'un plan (droite en 2-d) et d'une orientation
  • La représentation se fait par un arbre binaire dont
    • les noeuds sont les plans (avec orientation? des vecteurs, quoi)
    • les feuilles correspondent à une région intérieur ou extérieur.

Droites de Réveillès et algo. de Lucas

Tracé de Cercles

Algorithmes de tracer de cercles

Pour l'étude, on considère la partie dans le deuxième octant1) (x>0, y>x) d'un cercle de rayon R et centre (0,0). x2 + y2 = R2.

Deux approches se présente :

  • Calculs flottants : pour x=0,1,\ldots\quad y=arrondi(sqrt{R*R - x*x)
  • Algorithme de Bresenham (analogue de son algorithme pour les segments) : incrémentale, arithmétique entière.
Algorithme de Bresenham
Principe

A chaque étape, le pixel à choisir dans la colonne suivante sera soit au même niveau, soit un cran plus bas, car dans cet octant la tangente varie de pente 0 à pente -1, pas plus. Soient S: (\left(x_c+1,y_c\right), T : \left(x_c +1, y_c -1\right). La distance algébrique de chacun de ces points au cercle indique si le point est à l'intérieur (valeur négative) ou extérieur (valeur positive) et se calcule:

  • D\left(S\right) = \left(x_c + 1\right)^2 + \left(y_c \right)^2 - R^2
  • D\left(T\right) = \left(x_c + 1\right)^2 + \left(y_c -1\right)^2 - R^2

De trois choses l'une : * si les deux points sont à l'intérieur (si S l'est, T le sera) indiqué par deux valeurs négatives, on choisit S (le point au dessus est plus proche du cercle dans cette région). La somme D(S)+D(T) < 0.

  • si les deux points sont à l'extérieur (si T l'est, S aussi) indiqué par deux valeurs positives, on choisit T. La somme D(S) + D(T) > 0
  • si S est à l'extérieur et T à l'intérieur, on compare leurs distances on faisant leur somme.
    • Somme D(S) + D(T) > 0 ⇒ S est plus loin, on choisit T;
    • Somme D(S) + D(T) < 0 ⇒ T est plus loin, on choisit S;
    • Somme D(S) + D(T) = 0 ⇒ on choisit S (aussi).

Donc, en générale, D(S) + D(T) > 0 ⇒ choisir T =\left(x_c +1, y_c -1\right) et sinon choisir S =\left(x_c +1, y_c \right) .

Algorithme
cercle (R, couleur)
  {
    x=0; y=R; d=3 - 2*R;
    tant que (x =< y) faire
      { affichePixel(x,y, couleur);
        si (d < 0) alors d = d + 4*x + 6   /* S est choisi */
        sinon {d = d + 4*(x-y) +10; y=y-1;}
        x=x+1;
       }
    }
évolution de "d"

Pour un point donné, la somme

  • D(S)+D(T)=(x+1)^2 + y^2-R^2 + (x+1)^2 + (y-1)^2 - R^2
    • =2x^2 +2x +2y^2 -2y + 2 - 2R^2
  • Si le successeur au même niveau est choisi (choix S, y ne change pas) sa prochaine valeur sera
    • (x+2)^2 + y^2-R^2 + (x+2)^2 + (y-1)^2 - R^2
  • si S est choisi, l'incrément de d sera
    • \Delta_{S} = 2(x+2)^2 + y^2 + (y-1)^2 - 2R^2- \left(2(x+1)^2 + y^2 + (y-1)^2 -2 R^2\right)
    • = 2\left[ \left(x+2\right)^2 - \left(x+1\right)^2\right] = 2\left[ x^2 +4x +4 - x^2 + 2x +1\right]= 4x +6
  • sinon, si T est choisi, le successeur baisse de niveau et la valeur sera
    • (x+2)^2 + (y-1)^2-R^2 + (x+2)^2 + (y-2)^2 - R^2
  • si T est choisi, l'incrément de d sera
    • \Delta_{T} =2(x+2)^2 + (y-1)^2 + (y-2)^2 - 2R^2 - \left( 2 (x+1)^2 + y^2 + (y-1)^2 - 2R^2\right)
    • =2\left[(x+2)^2 - (x+1)^2\right] + (y-2)^2 -y^2 = 4x+6-4y+4=4\left(x-y\right)+10
Remarque

Il existe des points n'appartenant à aucun cercle de Bresenham.

reste à faire
  • généralisation à tout cercle (autre centre, R pas forcément entier, autres octants)
  • calculer l'incrément de manière incrémental avec des constantes
Cercle arithmétique

Un invention récente, de Eric Andrès, 1992.

Définition

Un cercle arithmétique C de rayon R entré en O passe par \left(x,y\right) \Leftrightarrow \left(R-\frac{1}{2}\right) \leq x^2 + y^2 \lt \left( R -\frac{1}{2}\right)

Tout point entier appartient à un cercle arithmétique de rayon R, et un seul.

Principe

Même contexte qu'avant (deuxième octant, etc.). Le prochain pixel est choisi parmi 3 candidats au lieu de deux (et on peut afficher deux pixels dans une colonne) avec deux règles:

  • on n'aura pas à la fois (x, y-1) et (x+1, y) sur le cercle
  • si ni (x, y-1) ni (x+1, y) n'est sur le cercle, (x+1, y-1) y est
cercle (x0, y0, couleur)
  {
    x=0; y=R; d=R-1;
    tantque (x =< y) faire
    {  affichePixel(x,y,couleur);
       si (d >= 2*x) alors {d=d-2x-1; x=x+1;}  // a
       sinon
         si (d < 2*(R-y)) alors {d=d+2*x -1; y=y-1;}  // b
         sinon {d=d-2*(y-x-1); x=x+1; y=y-1;}  // c
     }
   }
Exemples des Deux
Bresenham

FIXME attention ce tableau n'a pas été vérifié !

R d x y allumer traiter d traiter y traiter x
1 3-2=1 0 1 (0,1) 1+4*(0-1)+10 - 1 + 1
7 1 0 rien: x>y
2 3-4=-1 0 2 (0,2) -1+4*0+6 -0 +1
5 1 2 (1,2 ) 5 +4(1-2)+10 -1 +1
11 2 1 rien: x>y
3 -3 0 3 (0,3) -3+4*0+6 -0 + 1
3 1 3 (1,3) 3+4*(1-3)+10 -1 +1
5 2 2 (2,2) 5 + 4*(2-2)+10 -1 + 1
15 3 1 rien : x>y
4 -5 0 4 (0,4) -5+4*0+6 -0 +1
1 1 4 (1,4) 1 +4*(1-4)+10 -1 +1
-1 2 3 (2,3) -1+4*2+6 -0 +1
13 3 3 (3,3) 13 +4(3-3)+10 -1 +1
23 4 2 rien : x>y
arithmétiques

FIXME attention ce tableau n'a pas été vérifié !

R d x y allumer d >= 2*x d<2*(R-y) traiter d traiter y traiter x
1 0 0 1 (0,1) oui d=d-2x-1 -0- x← x+1
-1 1 1 (1,1) non oui d ← d+2x-1 y ← y-1 -0-
0 1 0 rien : x>y
2 1 0 2 (0,2) oui d←d-2x-1 -0- x ← x+1
0 1 2 (1,2) non non d ← d-2*(y-x-1) y←y-1 x← x+1
0 2 1 rien : x>y
3 2 0 3 (0,3) oui d ← 2 -2*0 - 1 -0- x ← x+1
1 1 3 (1,3) non non d ← d-2*(y-x-1) y←y-1 x← x+1
-1 2 2 (2,2) oui d ← d -2x-1 -0- x ← x+1
-6 3 2 rien : x>y
4 3 0 4 (0,4) oui d ← d-2*x -1 -0- x ← x+1
2 1 4 (1,4) oui d ← d-2*x -1 -0- x ← x+1
-1 2 4 (2,4) non oui d ← d+2x-1 y ← y-1 -0-
2 2 3 (2,3) non non d ← d+2x-1 y ← y-1 x ← x+1
5 3 2 rien: x>y
1) pour avoir 1 pixel par colonne
 
m1ilc/fain_2.txt · Dernière modification: 2009/11/03 17:06 par suitable
 
Sauf mention contraire, le contenu de ce wiki est placé sous la licence suivante :CC Attribution-Noncommercial-Share Alike 3.0 Unported
Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki