Planche 1

Inf 431 -- Cours 16
Algorithmes


géométriques
http://jeanjacqueslevy.net
secrétariat de l'enseignement:
Catherine Bensoussan
cb@lix.polytechnique.fr
Aile 00, LIX,
01 69 33 34 67
http://www.enseignement.polytechnique.fr/informatique/IF

Planche 2

Plan

  1. Graphique bitmap
  2. Enveloppe convexe
  3. Recherche de points dans des intervalles
  4. Intersection de segments orthogonaux
  5. Intersection de segments
Bibliographie

J.D. Foley, A. van Dam, S.K. Feiner, J.F. Hugues, Computer Graphics, Principle and Practice, Addison Wesley, 1990.

D.E. Knuth, The Metafont book, Addison Wesley, 1986.

D.E. Knuth, Metafont: The Program, Addison Wesley, 1986.


Planche 3

Architecture de X-window


cf. Cours systèmes d'exploitation et réseaux en majeure 2
Planche 4

Graphique bitmap

Planche 5

Tracé de vecteur (1/4)

Planche 6

Tracé de vecteur (2/4)

Planche 7

Tracé de vecteur (3/4)

Si 2 em £ 0, on positionne le pixel nord-est et 2 e ¬ 2em - dx.
Sinon on positionne le pixel est; l'erreur devient 2 e ¬ 2e
m + dx.

D'où le programme quand la pente est positive et inférieure à 1.
static void vecteur (int x0, int y0, int x1, int y1) {
  int dx = x1 - x0, dy = y1 - y0;
  int e = 0;
  for (int x = x0, y = y0; x <= x1; ++x) {
    setPixel(x,y);
    int em = e - 2*dy + dx;
    if (em <= 0) {
      ++y;
      e = em + dx;
    } else
      e = em - dx;
  }
}

Si x0, y0, x1, y1 sont entiers, toutes les opérations sont des additions entières de constantes. [Bresenham]

Planche 8

Tracé de vecteur (4/4)

Exercice 1 Compléter le programme pour qu'il trace un vecteur de pente arbitraire.

Exercice 2 Trouver un algorithme genre Bresenham pour les tracés de cercles, ou d'ellipses.

Si on dessine le vecteur dans une fenêtre, on peut avoir à l'intersecter avec un rectangle (clipping). Par exemple avec le bord gauche x = x
min d'un rectangle. On calcule
y = y0 + ë (xmin-x0)
dy
dx
+ 0.5 û
et on démarre le tracé avec une erreur non nulle
2e = -2xmin dy + 2y dx + 2x0 dy - 2y0 dx

Planche 9

Remplissage de polygones

Planche 10

Bitblt

Planche 11

Dessin des lettres



Planche 12

Tracé d'une cubique de Bézier

Par Bresenham ou par dichotomie:

Planche 13

Ordre trigonométrique

On cherche à savoir si l'angle 0 £ P1P0P2 < p ?
Dans le cas où P
1P0P2 = 0, on exige alors P0P1 < P0P2.

En calculant le produit vectoriel P
0 P1 Ù P0 P2. Si l'angle est nul, par convention on compare les normes.
static int ordreTrigo (Point p0, Point p1, Point p2) {
  int dx1 = p1.x - p0.x; int dy1 = p1.y - p0.y;
  int dx2 = p2.x - p0.x; int dy2 = p2.y - p0.y;
  if (dx1 * dy2 > dy1 * dx2) return 1;
  else if (dx1 * dy2 < dy1 * dx2) return -1;
  else {
    if (dx1 * dx2 < 0 || dy1 * dy2 < 0) return -1;
    else if (dx1*dx1 + dy1*dy1 < dx2*dx2 + dy2*dy2) return 1;
    else if (dx1*dx1 + dy1*dy1 == dx2*dx2 + dy2*dy2) return 0;
    else return -1;
  }
}

Planche 14

Intersection de segments


static boolean intersection (Line l1, Line l2) {
  return  ordreTrigo (l1.p1, l1.p2, l2.p1)
        * ordreTrigo (l1.p1, l1.p2, l2.p2) <= 0
       && ordreTrigo (l2.p1, l2.p2, l1.p1)
        * ordreTrigo (l2.p1, l2.p2, l1.p2) <= 0;
}


Planche 15

Pente d'un vecteur


static float theta (Point p1, Point p2) {
  float t; int dx = p2.x - p1.x; int dy = p2.y - p1.y;
  if (dx == 0 && dy == 0) t = 0;
  else t = (float) dy / (Math.abs(dx) + Math.abs(dy));
  if (dx < 0) t = 2 - t;
  else if (dy < 0) t = 4 + t;
  return t * 90.f;
}

Cette fonction évite le long calcul de Math.atan(dy/dx).

Planche 16

Enveloppe convexe (1/4)

[Jarvis]

Planche 17

Enveloppe convexe (2/4)


static int enveloppe (Point[ ] p) {
  int m = 0, n = p.length;
  if (n > 0) {
    int iMin = 0;
    for (int i = 1; i < n; ++i) if (p[i].y < p[iMin].y) iMin =  i;
    float angleMin = 400;
    do {
      Point t = p[m]; p[m] = p[iMin]; p[iMin] = t;
      ++m; iMin = 0;
      for (int i = m; i < n; ++i) {
        float alpha = theta(p[m-1], p[i]);
        if (alpha < angleMin) { iMin = i; angleMin = alpha; }
      }
      angleMin = theta(p[iMin], p[0]);
    } while (iMin != 0);
  }
  return m;
}

Complexité = O(n2)

Planche 18

Enveloppe convexe (3/4)

[Graham]

Planche 19

Enveloppe convexe (3/4)

rier
static int enveloppe (Point[ ] p) {
  int n = p.length; if (n <= 2) return n;
  else {
    int iMin = 0;
    for (int i = 1; i < n; ++i)
      if (p[i].y < p[iMin].y || p[i].y == p[iMin].y && p[i].x > p[iMin].x)
        iMin =  i;
    Point t = p[0]; p[0] = p[iMin]; p[iMin] = t;
    trier(p); int m = 2;
    for (int i = 3; i < n; ++i) {
      while (ordreTrigo(p[m], p[m-1], p[i]) >= 0)
        --m;
      ++m;
      t = p[m]; p[m] = p[i]; p[i] = t;
    }
    return m+1;
  }
}

Exercice 3 Complexité = O(n logn)


Planche 20

Recherche dans des intervalles (1/3)

En dimension 1, représenter les points avec un arbre de recherche.
static void rechercher (Arbre a, intervalle i) {
  if (a != null) {
    boolean bg = i.x1 <= a.x, bd = a.x <= i.x2;
    if (bg) rechercher (a.gauche, i);
    if (bg && bd) System.out.print (a.x + " ");
    if (bd) rechercher (a.droite, i);
   }
}

Exercice 4 Complexité?

Planche 21

Recherche dans des intervalles (2/3)

En dimension 2, arbre de recherche en alternant le rangement sur x et y.
static void rechercher (Arbre a, Rect r, boolean d) {
  boolean b1, b2;
  if (a != null) {
    boolean bx1 = r.x1 <= a.p.x, bx2 = a.p.x <= r.x2;
    boolean by1 = r.y1 <= a.p.y, by2 = a.p.y <= r.y2;
    if (d) { b1 = bx1; b2 = bx2; }
    else { b1 = by1; b2 = by2; }
    if (b1)
       rechercher (a.gauche, r, !d);
    if (dansRect (a.p, r))
       System.out.print (a.p + " ");
    if (b2)
       rechercher (a.droite, r, !d);
   }
}

Exercice 5 Complexité?


Planche 22

Recherche dans des intervalles (3/3)

Graphiquement

Planche 23

Intersection de segments orthogonaux


Planche 24

Intersection de segments (1/3)

[Shamos-Hoey]

Recherche d'une intersection:
Planche 25

Intersection de segments (2/3)

[Bentley-Ottmann, 79]
Planche 26

Intersection de segments (3/3)

[Bentley-Ottmann, 79] (cf. l'appliquette)

La vision et la synthèse d'images sont enseignées en Majeure 1 et 2.



This document was translated from LATEX by HEVEA.