Um Nicks Antwort ein wenig zu präzisieren: Das Kernkonzept des DDA-Algorithmus (der in drei Dimensionen genauso gut funktioniert) besteht darin, dass Sie für jede Achse Ihres Gitters den nächsten "Kreuzungspunkt" für diese Achse in Bezug auf Ihre verfolgen Zeilenparameter; Jeder Schritt des Algorithmus besteht darin, herauszufinden, welche Achse den nächsten Kreuzungspunkt hat (was ein einfacher Vergleich in zwei Dimensionen ist), den entsprechenden Schritt auszuführen und die Werte für die nächste Kreuzung für jede Achse zu aktualisieren.
Die Zeile hier kann geschrieben werden als '(x, y) = (x0, y0) + t * (m, n)', wobei m = x1-x0 und n = y1-y0. Wenn die Dimensionen einer Gitterzelle gx und gy sind, kann dx - der Abstand (in Bezug auf den t-Parameter), den zum Überqueren einer Gitterzelle benötigt wird - mit ein wenig schneller Algebra ermittelt werden: aus dem Gleichungspaar x = x0 + m t, (x + gx) = x0 + m (t + dx) erhalten wir gx = m * dx oder mit anderen Worten dx = gx / m. Ebenso ist dy = gy / n. Der Algorithmus verfolgt next_x (den Abstand zum nächsten roten Punkt entlang der Linie) und next_y (den Abstand zum nächsten blauen Punkt entlang der Linie) und aktualisiert sie jedes Mal, wenn er auf eine andere Kreuzung trifft, sodass die zentrale Schleife ungefähr so aussieht ::
while ( cur_t < t_max) {
if ( next_x < next_y ) {
cell_x++;
cur_t += next_x;
next_y -= next_x;
next_x = dx;
} else {
cell_y++;
cur_t += next_y;
next_x -= next_y;
next_y = dy;
}
// Process the cell (cell_x, cell_y)
}
Beachten Sie, dass in diesem Code viele Details fehlen - er sagt Ihnen beispielsweise nicht, wie Sie next_x und next_y initialisieren sollen. Es gibt Möglichkeiten, die meisten Teilungen zu beseitigen, um Sonderfälle wie vertikale und horizontale Linien einfacher behandeln zu können. Ob Sie cell_x und cell_y erhöhen oder verringern, hängt davon ab, in welchem Quadranten sich Ihre Zeile befindet. Beachten Sie, dass Sie für meine Beispielzeile cell_x tatsächlich mit jedem Tick verringern würden, da m (x1-x0) negativ ist. Sie müssen auch entscheiden, wie Sie Fälle behandeln möchten, in denen Ihre Linie genau durch die Ecke zwischen Zellen verläuft, anstatt an einer Kante zu wechseln. Es gibt viele kleine Details, die schief gehen können, und es sind viele Tests erforderlich. Hoffentlich erhalten Sie dadurch ein Bild von der Kernidee des Algorithmus.