【发布时间】:2011-08-16 18:02:29
【问题描述】:
我有下面的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) -> (0,0) )我一无所获。
我觉得我自己很愚蠢,因为问题并不那么难,在于hasNext 上面的案例nope)。
我已经通过交换积分来解决这个问题,但这显然是一个糟糕的解决方案。
有人可以帮我概括算法吗?
【问题讨论】:
-
不幸的是,您的方法会导致 `ThrowableException: Java heap space`(这是因为
hasNext大多变为true,而实际上不应该这样,并且行会无限大)。 -
顺便说一句,我在这段代码中发现了另一个错误——相同点之间的线(例如 (0,0) -> (0,0))会产生无限循环