[英]Is a point between two points?
经过谷歌搜索并在Stack上查看了很长时间后,我只是设法找到一个方法来确定一个点是否落在连接两个点的线上。 不幸的是,这不是我需要的。
请参阅此问题末尾的图像。 我提前为这张可怕的照片道歉,但它得到了重点(得到它?)。
我需要创建两条垂直线,连接点x和y。 它们需要在点x和y处与垂直线相交。 然后,我需要判断点z是否出现在这两行之间。
任何帮助表示赞赏。 谢谢你的时间!
计算角度xyz和yxz。 如果其中一个> 90,则它在外面。
既然你用java
标记了你的问题,那你就去:
import javafx.geometry.Point2D;
....
// is z between parallel lines
boolean betweenLines(Point2D x, Point2D y, Point2D z) {
return x.angle(y,z) < 90 && y.angle(x,z) < 90;
}
要查找Z点是否落在所需条带中,您可以确定Z到XY线的投影是否落在这些点之间。 定义向量v = Y - X和w = Z - X. 如果参数b落在0..1范围内,则投影位于XY段中。 非常简单的公式:
b = DotProduct( w,v )/ DotProduct( v,v )
JavaScript中的示例代码:
// JavaScript function to determine if infinite strip generated
// by x and y contains the point z
// point structure is:
// {
// double x;
// double y;
// }
// returns true or false
function stripContainsPoint(x, y, z) {
var distXZ = (x.x - z.x) * (x.x - z.x) + (x.y - z.y) * (x.y - z.y),
distXY = (x.x - y.x) * (x.x - y.x) + (x.y - y.y) * (x.y - y.y),
distYZ = (y.x - z.x) * (y.x - z.x) + (y.y - z.y) * (y.y - z.y);
// if triangle is right or acute, or obtuse with hypotenuse XY, returns true
return (distXZ + distXY >= distYZ) && (distYZ + distXY >= distXZ);
}
变量dist??
是误称,因为它们实际上是每个的距离平方。
因此,可以通过y = mx + b
来描述线。 让我们说你的第一行用y = 2x-1
。 然后对于任何点(u,v),你可以插入x=u
,使得y = 2u-1
。 这允许您确定线上x位置的y
。 因此,如果v>y
,那么你的点就在线之上。 否则,你的观点就在线下。
通过使用两条平行线进行此操作,您最终将从图片中看出三个案例:
编辑:
阅读你的帖子上的一些评论,听起来可能有比这更好的方法:)
基本上,这是一个数学问题而不是编程问题。 (换句话说,一旦你理解了数学,编程就变得微不足道了。)
我可以想到两种方法:
计算出穿过x和y的2条垂直线。 如果z高于x垂直线并低于y垂直线。
计算出yxz与xyz之间的角度之间的角度。 如果两个角度都小于90度,则z在线之间。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.