De la droite discrète
Attention, j’ai probablement fait des erreurs en recopiant, de toute façon le prof l’a noté en gros sur son site
Table des matières
Définition
En maths, une droite est un objet définie car il passe par 2 points et qu’il est infini dans les 2 sens.
En info, c’est un ensemble de pixels qui ont la qualité d’être proche de la droite réelle relativement proche de la droite réel (celle des maths), ces pixels forment un chemin biconnexe.
void droite (int x0, int y0, int x1, int y1) { for (int x = x0; x <= x1; x++) { flat yf = (float) (x - x0) * (y1 - y0); yf /= (x1 - x0); yf += y0; int y = (int) (yf + .5); affiche(x,y); } }
10 | |
---|---|
12 | |
12 | |
36 | |
x | 10 11 |
y | 12 34 |
De l’évidence à la référence
On a donc
Il y ça aussi :
Horizontal | Oblique |
---|---|
x++, y |
x++, y++ |
delta(x+1, y) = delta(x, y) - 2dy delta(x+1, y+1) = delta(x, y) - 2dy - 2dx
En C :
void droitebr(int dx, int dy) { int delta, incD, incH; incH = dy << 1; delta = incH - dx; incD = delta - dx; for (int x = 0, y = 0; x <= dx; ++x) { affiche(x, y); if (delta > 0) { y++; delta += incD; } else { delta = incH; } } }
Améliorations
Optimisation de l’algorithme en coupant en 2 le problème, et donc en faisant un pas de 2 dans la boucle-for. Pareil avec un pas de 3 et un pas de 4.
- Rappel pour la droitebr :
Alors pour le pas de 2 :
if (delta >= 0) { if (delta - 2dy >= 0) {
Pour le pas de 3, c’est toujours la même équation, on adapte juste l’équation avec un , par contre il peut pas avoir 2 partie oblique consécutives (conséquence de propriété, cf. plus bas dans le cours).
On fait *4 pour y parce que on a un pas de 2 pour x, donc x croit 2 fois plus vite, donc pour y il faut *2 aussi, donc *4
Il y a ensuite le pas adaptaif, le prof explique ça comme quand on monte une pente, on fait des plus grands pas quand on monte, bah là c’est pareil mais à l’envers. Dans notre cas de la droite, on regarde si la pente est importante, dans ce cas on fait des petits pas, et si la pente est petite genre plate, on fait des grands pas.
PGCD
Angel et Morrison disent qu’ils peuvent tout simplifier et aller plus vite.
Avec , ils se demandent si ils pourrait pas simplifier en calculant le PGCD, par exemple si .
Malheureusement 60% du temps on a un PGCD qui vaut 1, mais 40% du temps le PGCD c’est 10.
Chercher ailleurs et autrement
“Sous les pavés”
Citation de Wu
Sur 8 mouvements possible, seulement 2 sont utilisés
There are at most two basic directions and these ones can differ only by unity, modulo eight.
Sur ces 2 mouvements, l’un apparaît toujours de façon solitaire, l’autre apparaît de façon groupé (le prof appelle ça une plage)
One of these values always occurs “singly”.
Le pas solitaire est aussi bien répartie que possible, c’est à dire qu’ils peuvent pas être tous regroupés au même endroit, ils doivent être dispersés (autrement dit : les plages ont toutes la même longueur à 1 près)
Successive occurrences of the principal direction occurring singly are as uniformly spaced as possible.
Euclide et applications
Dulucq et Bourdin
Droite | Valeure |
---|---|
Horizontale | 0 |
Oblique | 1 |
Donc par exemple :
-
-
-
-
Nombre de plages =
-
Longue plages =
-
Seulement des plages courtes : 0 utilisés
Il en reste , qui est le nombre de plages longues -
, le nombre de plages courtes est
-
-
-
-
-
-
-
-
-
Green et Pitteway
droite (dx, dy) { dx -= dy; s = "0"; t = "1"; while (dx != dy) { if (dx > dy) { dx -= dy; t = s . t; } else { dy -= dx; s = s . t; } } return ( s . t ) ^ dx; }
Berstel
W = 00100010001 W' = 01000100010 W'' = 10010001000
C’est conjugés
- (dx)
- peut être égale à , , etc… le plus intéressant étant le plus petit, soit
Fraction continue
, ça peut s’écrire aussi comme ça : ,
Soit
-
-
-
-
-
, impair
-
, pair
-
-
-
-
Plages (Spans)
Symétrie interne
- sauf pour et (le premier et le dernier)
Récapitulation et algorithme rapide
- PGCD
- Pas de 2
- Symétrie interne
- Plage
- Partie basse de l’octant