Difference between revisions of "Bresenham's line drawing algorithm"

From HaskellWiki
Jump to navigation Jump to search
 
Line 1: Line 1:
 
 
<haskell>
 
<haskell>
  +
  +
import List (sort,unfoldr)
  +
  +
type Point = (Integer,Integer)
  +
 
line :: Point -> Point -> [Point]
 
line :: Point -> Point -> [Point]
 
line pa@(xa,ya) pb@(xb,yb) = map maySwitch . unfoldr go $ (x1,y1,0)
 
line pa@(xa,ya) pb@(xb,yb) = map maySwitch . unfoldr go $ (x1,y1,0)
Line 21: Line 25:
 
</haskell>
 
</haskell>
   
Thanks to Cheddai Fouche for the above implementation
+
Thanks to Cheddai Fouche for the above implementation.
  +
  +
The core logic is in the "go" function which is passed to unfoldr.

Revision as of 05:48, 2 August 2009

import List (sort,unfoldr)

type Point = (Integer,Integer)

line :: Point -> Point -> [Point]
line pa@(xa,ya) pb@(xb,yb) = map maySwitch . unfoldr go $ (x1,y1,0)
  where
    steep = abs (yb - ya) > abs (xb - xa)
    maySwitch = if steep then (\(x,y) -> (y,x)) else id
    [(x1,y1),(x2,y2)] = sort [maySwitch pa, maySwitch pb]
    deltax = x2 - x1
    deltay = abs (y2 - y1)
    ystep = if y1 < y2 then 1 else -1
    go (xTemp, yTemp, error)
        | xTemp > x2 = Nothing
        | otherwise  = Just ((xTemp, yTemp), (xTemp + 1, newY, newError))
        where
          tempError = error + deltay
          (newY, newError) = if (2*tempError) >= deltax
                            then (yTemp+ystep,tempError-deltax)
                            else (yTemp,tempError)

Thanks to Cheddai Fouche for the above implementation.

The core logic is in the "go" function which is passed to unfoldr.