java - 检查投影到线段上的点是否不在线段之外

标签 java math geometry computational-geometry

illustration

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

最佳答案

使用内积可以简单统一的检查。两个 vector 之间的内积可以在几何上可视化为两个 vector 的长度乘以两者夹角的余弦的乘积,或者是其中一个 vector 的长度与(正交)投影长度的乘积另一个到由该 vector 确定的线上。

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

0 <= v·s <= s·s

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

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;
}

关于java - 检查投影到线段上的点是否不在线段之外,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17581738/

相关文章:

java - REST 中的 MIMEParsingException

python - 是否有与 Python 3.x 兼容的矩阵数学模块?

java - 为 int 值设置限制

c - 不使用除法运算符将数字除以 5

geometry - 将分割线分成相等的部分

java - 如何删除system.out.println中的最后一个标记?

java - Java中如何从一个字符串中获取多个变量集

java - 安卓 - java.lang.RuntimeException : Invalid double: "0,64"

html - 如何将不同的颜色应用于 SVG 圆中的 stroke-dashoffset?

Java - 使对象遵循绘制的线