我将如何编写此函数?任何例子表示赞赏
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不同,首先检查点是否在直线上。为此,您只需要向量point1 -> currPoint和的“叉积” point1 -> point2。
point1
point2
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等于零时,您的观点才在线。
cross
if (cross != 0) return false;
现在,您知道该点确实在直线上,是时候检查它是否位于原始点 之间 了。这可以通过比较来容易地完成x坐标,如果行是“比垂直更水平的”,或y以其他方式坐标
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。
PS此算法绝对精确,这意味着它将拒绝非常靠近直线但不精确位于直线上的点。有时这不是必需的。但这是一个不同的故事。