【问题标题】:How to draw a line with Bresenham's algorithm in haskell如何在haskell中用布雷森汉姆算法画一条线
【发布时间】:2018-09-25 03:14:30
【问题描述】:

我在 Haskell wiki 中找到了“Bresenham 的线条绘制算法”的代码,但是我不太容易理解开头的部分,所以我重写了它。但是当斜率超过 1/2 时,我无法画线。 这是我的部分代码。

line :: Point -> Point -> [Point]
line (x0,y0) (x1,y1)
| abs (y1-y0) > abs(x1-x0)  = line (y0,x0) (y1,x1)
| x0 > x1                   = line (x1,y1) (x0,y0)
| otherwise                 = plotLine x0 y0 0
  where

在 where 子句中,我定义了 plotLine 函数,就像 Haskell wiki 中的“go”一样。由于我的其余代码与 Haskell wiki 中的代码几乎相同,所以我认为问题是从一开始的。但我无法弄清楚。谁能帮帮我?

顺便说一下,这里是Haskell wiki上“Bresenham's line drawing algorithm”的网站:https://wiki.haskell.org/Bresenham%27s_line_drawing_algorithm

【问题讨论】:

    标签: haskell bresenham


    【解决方案1】:

    您缺少的是maySwitch 函数。 Bresenham 算法仅适用于斜率介于 0 和 1 之间(即 45 度)的直线。对于更陡峭的线,您需要交换输入和输出上的 x 和 y 坐标。这就是maySwitch 函数的作用。您只在输入上交换了它们。

    【讨论】:

    • 哦,你是对的。我忘了把它们打开。
    【解决方案2】:

    确实,就像 Paul 指出的那样,您似乎缺少 maySwitch 函数。有点“无耻的插件”,但让我附上我两年前在尝试提高 Haskell 技能时编写的一个实现:https://github.com/Lucsanszky/soft-engine/commit/801e802f498bb9c19528cd074f169bc15cbd5191#diff-59f6fe8726905567287c68be078212a0R66

    希望通过在稍微不同的上下文中看到替代实现,您将对算法有更好的理解。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-21
      • 2017-04-02
      相关资源
      最近更新 更多