我有以下bresenham's algorithm代码,代表适用于 Scala Java代码。
def bresenham(x0: Int, y0: Int, x1: Int, y1: Int) = {
import scala.math.abs
val dx = abs(x1 - x0)
val dy = abs(y1 - y0)
val sx = if (x0 < x1) 1 else -1
val sy = if (y0 < y1) 1 else -1
new Iterator[(Int, Int)] {
var (x, y) = (x0, y0)
var err = dx - dy
def next = {
val omitted = (x, y)
val e2 = 2 * err
if (e2 > -dy) {
err -= dy
x += sx
}
if (e2 < dx) {
err += dx
y += sy
}
omitted
}
def hasNext = (x <= x1 && y <= y1)
}
}
对于几乎所有的线都很好,但是当我试图从上到下计算垂直线时(即(0,3) - &gt;(0,0))我'什么都没有。
我对自己感到愚蠢,因为问题并不那么困难,而且hasNext
在上面的案例中说 nope 。)
我通过交换点来解决这个问题,但这显然是一个糟糕的解决方案。
任何人都可以帮助我推广算法吗?
答案 0 :(得分:4)
在失败的情况下,您尝试从y0 = 3
转到y1 = 0
。因此,该步骤将为否定sy = -1
。继续hasNext
的条件应取决于y >= y1
,而不是您所写的内容(y <= y1
)。
hasNext
以处理任一方向。一个聪明的方法是,
def hasNext = (sx*x <= sx*x1 && sy*y <= sy*y1)
有效,因为sx
和sy
非零,并且它们的符号决定了步骤的方向。
答案 1 :(得分:2)
维基百科代码的相当字面翻译将是:
def hasNext = (!(x==x1 && y==y1))