我试图在Javascript中实现扫描线算法。看起来我的x计算是错误的,因为线条要短或长。
应填写这些边缘:
这就是我的扫描线代码填充它的方式:
我的边缘表包含以下字段:
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
});
每条扫描线后的新X都是这样计算的:
// 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;
}
这个计算有什么问题?
答案 0 :(得分:3)
您无法正确显示扫描线算法,但看起来好像要将所有扫描线从Ymin
处理为Ymax
。 y
开始Ymin
,每个扫描线增加一个。
因此,每个扫描行的x
应增加dx/dy
。
您可能不需要调整标志。相反,dy
的标志是正面的还是负面的:
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
您在x
方向扫描,因此排除dy == 0
的水平线。这也显示在你的数学中:dy
时,你不能除以dy == 0
。