De la droite discrète

jj.up8.site/droites

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.

graph

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);
}
}

xxpxqxp=yypyqyp \frac{x-x_{p}}{x_{q} - x_{p}} = \frac{y - y_{p}}{y_{q} - y_{p}}
y=yp+(xxp)(yqyp)xqxp y = y_{p} + \frac{(x-x_{p})(y_{q} - y_{p})}{x_{q} - x_{p}}

xpx_p 10
ypy_{p} 12
xqx_{q} 12
yqy_{q} 36
x 10 11
y 12 34

De l’évidence à la référence

bresenham
yyn>y+1y2y++ |y-y_{n}| > |y+1 - y_{2}| \Rightarrow y++
y2=x×dydx y_{2} = \frac{x\times dy}{dx}
yx×dydxA>y+1x×dydxBy++ \underbrace{\left| y - \frac{x\times dy}{dx} \right|}_A > \underbrace{\left| y+1 - \frac{x\times dy}{dx} \right|}_B \Rightarrow y++
On a donc A>B0>A+BA > B \Rightarrow 0 > A+B

Il y ça aussi :
A+B<0y++ A + B < 0 \Rightarrow y++
2y+12x×dydx<0y++ 2y + 1 - \frac{2x\times dy}{dx} < 0 \Rightarrow y++
2y×dx+dx2x×dxdelta(x, y)<0y++ \underbrace{2y\times dx + dx - 2x \times dx}_{\text{delta(x, y)}} < 0 \Rightarrow y++

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.

Alors pour le pas de 2 :
delta(x+2,y)=2xdy+2ydx+4dydx\text{delta}(x+2, y) = 2xdy + 2ydx + 4dy - dx
delta(x+1,y)=delta(x+2,y)2dydelta(x+1, y) = delta(x + 2, y) - 2dy

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 x+3x+3, 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 y=x×dydxy = \frac{x \times dy}{dx}, ils se demandent si ils pourrait pas simplifier en calculant le PGCD, par exemple si y=226=113y = \frac{22}{6} = \frac{11}{3}.
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 :
chemin

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

Fraction continue
311=[0,3,1,2]\frac{3}{11}= [0, 3, 1, 2], ça peut s’écrire aussi comme ça : a+1b+1c+1d+1e+1f+1g+1h+1i+1j+1k+1a+\frac{1}{b+\frac{1}{c+\frac{1}{d+\frac{1}{e+\frac{1}{f+\frac{1}{g+\frac{1}{h+\frac{1}{i+\frac{1}{j+\frac{1}{k+\frac{1}{\dots}}}}}}}}}}},
Soit [a,b,c,d,e,f,g,h,i,j,k][a, b, c, d, e, f, g, h, i, j, k]

Plages (Spans)

\Rightarrow Symétrie interne
symétrie

Récapitulation et algorithme rapide