首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >bresenham直线算法误差

bresenham直线算法误差
EN

Stack Overflow用户
提问于 2011-08-16 18:02:29
回答 2查看 994关注 0票数 3

我有下面的bresenham算法代码,它表示适合Scala代码。

代码语言:javascript
复制
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上,上面的一个例子说不行)。

我用交换分数来解决这个问题,但这显然是个糟糕的解决方案。有人能帮我推广算法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-08-16 18:49:12

在失败的情况下,您正在尝试从y0 = 3转到y1 = 0。所以这一步将是负的,sy = -1。然后,继续使用hasNext的条件应该取决于y >= y1,而不是您编写的东西(y <= y1)。

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

代码语言:javascript
复制
def hasNext = (sx*x <= sx*x1 && sy*y <= sy*y1)

这是因为sxsy是非零的,而且它们的符号决定了步骤的方向。

票数 4
EN

Stack Overflow用户

发布于 2011-08-16 19:00:59

维基百科代码的直译应该是:

代码语言:javascript
复制
def hasNext = (!(x==x1 && y==y1))
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7082801

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档