This question already has answers here:

Efficient maths algorithm to calculate intersections
(9个答案)
我有一个线段由两个点p1和p2组成,第二个线段由点p3和p4组成。我想知道它们是否相交,到目前为止,我还没有运气到目前为止这是我的代码:
public static double angle(Point p1, Point p2, Point p3) {
    double AB = length(p2, p1);
    double BC = length(p2, p3);
    double AC = length(p3, p1);
    return Math.acos((sqr(BC) + sqr(AB) - sqr(AC)) / (2 * BC * AB)) * (180 / Math.PI);
}

public static boolean doIntersect(Point p1, Point p2, Point p3, Point p4) {
    double a = angle(p4, p3, p2);
    double b = angle(p3, p2, p1);
    double c = 180 - b - a;

    System.out.println("a: " + a + ", b: " + b + ", c:" + c);

    if((length(p3, p2) * Math.sin(a)) / Math.sin(c) > length(p2, p1)) return false;
    if((length(p3, p2) * Math.sin(b)) / Math.sin(c) > length(p3, p4)) return false;
    return true;
}

public static double length(Point point1, Point point2) {
    return Math.sqrt(sqr(point1.x - point2.x) + sqr(point1.y - point2.y));
}

public static double sqr(double doub) {
    return Math.pow(doub, 2);
}

但这不管用。有时,角度“c”甚至会显示为负数。
另外,point是一个具有两个参数的自定义类:x和y。应该是相当自解释的。

最佳答案

我建议先提出一个数学解决方案,验证它,然后尝试将其迁移到计算机程序中。

10-07 17:00