gpt4 book ai didi

scala - bresenham 的线算法错误

转载 作者:行者123 更新时间:2023-12-01 11:04:40 24 4
gpt4 key购买 nike

我有以下代码 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
我已经通过交换点来解决这个问题,但这显然是一个糟糕的解决方案。谁能帮我概括算法?

最佳答案

在失败的情况下,您正试图从 y0 = 3 开始至 y1 = 0 .所以步骤将为负,sy = -1 .继续hasNext的条件然后应该取决于 y >= y1而不是你写的(y <= y1)。

hasNext必须推广以处理任一方向。一个聪明的方法是,

def hasNext = (sx*x <= sx*x1 && sy*y <= sy*y1)

之所以有效,是因为 sxsy是非零的,它们的符号决定了步长的方向。

关于scala - bresenham 的线算法错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7082801/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com