我写了一个小程序来找到点(x,y)相对于由点(px,py)定义的线和与x轴(在笛卡尔坐标系中)的角度(度)相关的位置.
toRadian deg = deg * (pi / 180) lineSlope deg = tan $ toRadian deg lineYintercept (x,y) deg = y - (x * lineSlope deg) relativePointPosition (px,py) deg (x,y) | s < 0 && deg>=0 && deg<90 = "Left" | s < 0 && deg>=90 && deg<180 = "Left" | s < 0 && deg>=180 && deg<270 = "Right" | s < 0 && deg>=270 && deg<360 = "Right" | s > 0 && deg>=0 && deg<90 = "Right" | s > 0 && deg>=90 && deg<180 = "Right" | s > 0 && deg>=180 && deg<270 = "Left" | s > 0 && deg>=270 && deg<360 = "Left" | s > 0 && deg==360 = "Right" | s < 0 && deg==360 = "Left" | otherwise = "On the line" where s = lineSlope deg * x + lineYintercept (px,py) deg - y
它对于远离线的点非常有效,但对于接近或在线上的点不太好.如何提高准确度?
棕褐色(90°)未定义,因此提高精度并不能真正帮助您.由于浮点数的性质(它是圆形的并且不能精确地表示π/ 2),调用tan(deg * pi / 180)
将给出非常大或非常小的数字,这取决于π/ 2的哪一侧的值被舍入.
确切的结果是NaN
,但这也无济于事.您将不得不单独处理这些有问题的情况,或使用不具有此类"特殊"情况的其他算法.