Вы можете использовать тот факт, что ваша строка, заданная angle (px,py)
, может быть задана эквациональным определением в форме a*x+b*y+c=0
, где a,b,c
дано как
sin angle*(x-px) - cos angle*(y-py) = 0
Таким образом, вы можетепросто определите
lineF angle (px,py) = \ (x,y) -> (sin angle)*(x-px)-(cos angle)*(y-py)
и используйте это в таком тесте, как этот
lineTest angle (px,py) (x,y)
| f (x,y) < -eps = "Left"
| f (x,y) > eps = "Right"
| otherwise = "On the line"
where
f = lineF angle (px,py)
eps = 1e-9 -- confidence interval as Neil Brown specified.
По сути, функция, определяющая линию в ее наиболее общем виде, дает вам функцию, которая будет вычислять расстояние отлиния, которую вы можете использовать, чтобы проверить, где вещи тоже находятся.Возможно, вам понадобится немного поработать, чтобы выяснить, что на самом деле "Left"
и "Right"
означают по отношению к общей строке.