如何在Haskell中使用Bresenham算法绘制一条线

时间:2018-09-25 03:14:31

标签: haskell bresenham

我在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的线条绘制算法”的网站:https://wiki.haskell.org/Bresenham%27s_line_drawing_algorithm

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

的确,就像Paul指出的那样,您似乎缺少了upstream adminer { server adminer; } server { listen 80; location /adminer/ { proxy_set_header X-Forwarded-Prefix "/adminer"; proxy_pass http://adminer/; } } 函数。有点“无耻的插件”,但让我包括两年前我尝试提高Haskell技能时编写的我的实现:https://github.com/Lucsanszky/soft-engine/commit/801e802f498bb9c19528cd074f169bc15cbd5191#diff-59f6fe8726905567287c68be078212a0R66

希望通过在稍有不同的环境中看到替代实现,您将对算法有更好的了解。