Ich versuche, den Scanline-Algorithmus in Javascript zu implementieren. Es sieht so aus, als ob meine Berechnung von x falsch ist, da die Linien zu kurz oder zu lang sind.Scanline-Algorithmus: x der Kanten berechnen
sollten Diese Kanten werden gefüllt:
Dies ist, wie mein Scanline-Code füllt es:
Meine Kantentabelle hat diese Felder:
et.push({
Ymin: Ymin, // minimum Y of the edge
Ymax: Ymax, // maximum Y
x: Xmin, // X value of Ymin point; updated for every scanline
dx: Xmax - Xmin, // Delta X
dy: Ymax - Ymin // Delta Y
});
Das neue X nach dem Abend ry scanline wird auf diese Weise berechnet:
// aet is active edge table
if (aet[i].dx != 0 && aet[i].dy != 0) {
// this is not a vertical edge
var incr = aet[i].dy/aet[i].dx; // =1/(dx/dy) ... dx/dy=m
if (aet[i].dy > 0) {
incr = incr;
} else {
incr = -incr;
}
aet[i].x += incr;
}
Was ist falsch in dieser Berechnung?
Was ist 'Incr'? – usr2564301
Der zu jeder Scanlinie hinzugefügte inkrementelle Wert für x. Mein Code berechnet nicht den absoluten Wert von x. – Michael
Sollte nicht "Incr" umgekehrt sein? Sie scheinen 'x' für jeden' dy' zu erhöhen, also brauchen Sie 'dx/dy'. Auf diese Weise macht die Bedingung, Zeilen mit "dy" auszuschließen, Sinn: Sie vermeiden, durch Null zu teilen. –