检查投影在线段上的点是否不在其外部

Xky*_*nar 10 java math geometry computational-geometry

插图

见上图; 基本上,我想要一个简单的测试来检查一个点是否在线段的范围内.我有的信息(或输入,如果您愿意)是点的坐标和线段终点的坐标.我想要的输出是一个简单的布尔值.我怎样才能以简单的方式检查这个?

Dan*_*her 12

如果使用内部产品,您可以进行简单统一的检查.两个矢量之间的内积可以几何可视化为两个矢量的长度乘以两者之间的角度的余弦的乘积,或者一个矢量的长度与(正交)投影的长度的乘积.另一个在由该向量确定的线上.

在您的情况下,如果将矢量v从段的一个端点投影到所考虑的点,则当且仅当投影落在s连接两个端点的段上时,该点位于允许的区域内.这相当于

0 <= v·s <= s·s
Run Code Online (Sandbox Code Playgroud)

(如果要通过端点排除垂直于线段的线,则严格不等式)

public static boolean inRange(double start_x, double start_y, double end_x, double end_y,
                              double point_x, double point_y) {
    double dx = end_x - start_x;
    double dy = end_y - start_y;
    double innerProduct = (point_x - start_x)*dx + (point_y - start_y)*dy;
    return 0 <= innerProduct && innerProduct <= dx*dx + dy*dy;
}
Run Code Online (Sandbox Code Playgroud)