1

I'm trying to implement the scanline algorithm in Javascript. It looks like my calculation of x is wrong as the lines are to short or to long.

These edges should be filled:

enter image description here

This is how my scanline code fills it:

enter image description here

My edge table has these fields:

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

The new X after every scanline is calculated this way:

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

What is wrong in this calculation?

Michael
  • 2,528
  • 3
  • 21
  • 54
  • The incremental value added to x on every scanline. My code doesn't calculate the absolute value of x. – Michael Apr 13 '16 at 08:57
  • 2
    Shouldn't `incr` be the other way round? You seem to be incrementing `x` for each `dy`, so you need `dx/dy`. That way, the condition to rule out lines with `dy` makes sense: you avoid dividing by zero. – M Oehm Apr 13 '16 at 09:03
  • Oh, thats much better (still not perfect). I thought: 1/m = 1/(dx/dy) = (1/1)/(dx/dy) = dy/dx ... – Michael Apr 13 '16 at 09:07

1 Answers1

3

You don't show the scanline algorithm proper, but is looks as if you wanted to treat all scanlines from Ymin to Ymax. y starts a Ymin and increases by one for each scanline.

Therefore, the x for each scanline should increase by dx/dy.

You probably don't need to adjust the sign. Instead, the sign of dy is either positive or negative:

m = dx / dy                               # slope of the line
x[y + 1] = x[y] + m * dy = x[y] + m       # dy == (y + 1) - y == 1
x[y - 1] = x[y] + m * dy = x[y] - m       # dy == (y - 1) - y == -1

You scan in x direction and hence rule out horizontal lines for which dy == 0. That also shows in your maths: You cannot divide by dy when dy == 0.

M Oehm
  • 28,726
  • 3
  • 31
  • 42