Skip to content

Instantly share code, notes, and snippets.

@depy
Created October 30, 2013 19:56
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save depy/7239146 to your computer and use it in GitHub Desktop.
Save depy/7239146 to your computer and use it in GitHub Desktop.
Need to sort list of points depending on angle between each of them and another point and axis x.
import Data.Monoid
data Point = Point { x :: Float, y :: Float} deriving (Show, Eq)
data Dir = DL | DR | DS deriving (Show)
instance Ord Point where
compare (Point x y) (Point x' y') = mappend (compare y y') (compare x x')
distance :: Point -> Point -> Float
distance p0 p1 = sqrt ((x p0 - x p1)**2 + (y p0 - y p1)**2)
angle p0 p1 p2 = let a = Point (x p0 - x p1) (y p0 - y p1)
b = Point (x p0 - x p2) (y p0 - y p2)
f0 = (x a)*(x b)+(y a)*(y b)
f1 = sqrt ((x a)**2 + (y a)**2) * sqrt((x b)**2 + (y b)**2)
f = f0/f1
in (acos f) * 180 / pi
direction p0 p1 p2
| cross p0 p1 p2 < 0 = DR
| cross p0 p1 p2 > 0 = DL
| cross p0 p1 p2 == 0 = DS
where cross (Point x0 y0) (Point x1 y1) (Point x2 y2) =
(x1-x0) * (y2-y0) - (y1 - y0) * (x2 - x0)
dirList [] = []
dirList (a:b:[]) = []
dirList (p0:p1:p2:ps) = let d = direction p0 p1 p2
in d : dirList(p1:p2:ps)
lowestPoint ps = minimum ps
angleWithXaxis p0 p1 = angle p0 xAxisPoint p1
where xAxisPoint = Point ((x p0)-1) (y p0)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment