我将如何编写此函数?任何例子表示赞赏
function isPointBetweenPoints(currPoint, point1, point2):Boolean {
var currX = currPoint.x;
var currY = currPoint.y;
var p1X = point1.x;
var p1y = point1.y;
var p2X = point2.x;
var p2y = point2.y;
//here I'm stuck
}
最佳答案
假设point1
和point2
不同,则首先检查该点是否在直线上。为此,您只需要 vector point1 -> currPoint
和point1 -> point2
的“叉积”。
dxc = currPoint.x - point1.x;
dyc = currPoint.y - point1.y;
dxl = point2.x - point1.x;
dyl = point2.y - point1.y;
cross = dxc * dyl - dyc * dxl;
当且仅当
cross
等于零时,您的观点才对。if (cross != 0)
return false;
现在,您知道该点确实在直线上,是时候检查它是否位于原始点之间了。通过比较
x
坐标(如果该行“比水平更垂直”)或其他y
坐标,可以轻松完成此操作if (abs(dxl) >= abs(dyl))
return dxl > 0 ?
point1.x <= currPoint.x && currPoint.x <= point2.x :
point2.x <= currPoint.x && currPoint.x <= point1.x;
else
return dyl > 0 ?
point1.y <= currPoint.y && currPoint.y <= point2.y :
point2.y <= currPoint.y && currPoint.y <= point1.y;
注意,如果输入数据是整数,则上述算法如果是完全积分的,即,对于整数输入,它不需要浮点计算。不过,在计算
cross
时要当心潜在的溢出。附言该算法绝对精确,这意味着它将拒绝非常靠近直线但不精确位于直线上的点。有时这不是必需的。但这是一个不同的故事。