实现java判断两个三角形是否相交

简介

本文将教会一位刚入行的小白如何使用Java编程语言来判断两个三角形是否相交。我们将按照以下步骤进行实现:

  1. 获取两个三角形的坐标
  2. 判断两个三角形是否存在共享的边
  3. 若存在共享的边,则判断两个三角形是否有交叉的边
  4. 若存在交叉的边,则判断两个三角形是否相交

步骤一:获取两个三角形的坐标

首先,我们需要获取两个三角形的坐标。可以定义一个Triangle类,并在其中定义三个点的坐标。

class Triangle {
    Point p1;
    Point p2;
    Point p3;
}

class Point {
    int x;
    int y;
}

步骤二:判断两个三角形是否存在共享的边

接下来,我们需要判断两个三角形是否存在共享的边。可以定义一个方法hasSharedEdge来实现该功能。

boolean hasSharedEdge(Triangle triangle1, Triangle triangle2) {
    if (hasEdge(triangle1.p1, triangle2) || hasEdge(triangle1.p2, triangle2) || hasEdge(triangle1.p3, triangle2)) {
        return true;
    }
    return false;
}

boolean hasEdge(Point point, Triangle triangle) {
    if (pointOnLine(point, triangle.p1, triangle.p2) || pointOnLine(point, triangle.p2, triangle.p3) || pointOnLine(point, triangle.p3, triangle.p1)) {
        return true;
    }
    return false;
}

boolean pointOnLine(Point point, Point lineStart, Point lineEnd) {
    int dxc = point.x - lineStart.x;
    int dyc = point.y - lineStart.y;
    int dxl = lineEnd.x - lineStart.x;
    int dyl = lineEnd.y - lineStart.y;

    int cross = dxc * dyl - dyc * dxl;

    if (cross != 0) {
        return false;
    }

    if (Math.abs(dxl) >= Math.abs(dyl)) {
        if (dxl > 0) {
            if (lineStart.x > point.x || point.x > lineEnd.x) {
                return false;
            }
        } else {
            if (lineEnd.x > point.x || point.x > lineStart.x) {
                return false;
            }
        }
    } else {
        if (dyl > 0) {
            if (lineStart.y > point.y || point.y > lineEnd.y) {
                return false;
            }
        } else {
            if (lineEnd.y > point.y || point.y > lineStart.y) {
                return false;
            }
        }
    }

    return true;
}

步骤三:判断两个三角形是否有交叉的边

接下来,我们需要判断两个三角形是否有交叉的边。可以定义一个方法hasCrossingEdge来实现该功能。

boolean hasCrossingEdge(Triangle triangle1, Triangle triangle2) {
    if (hasEdgeCrossing(triangle1.p1, triangle1.p2, triangle2) || hasEdgeCrossing(triangle1.p2, triangle1.p3, triangle2) || hasEdgeCrossing(triangle1.p3, triangle1.p1, triangle2)) {
        return true;
    }
    return false;
}

boolean hasEdgeCrossing(Point lineStart1, Point lineEnd1, Triangle triangle) {
    if (lineIntersectsLine(lineStart1, lineEnd1, triangle.p1, triangle.p2) || lineIntersectsLine(lineStart1, lineEnd1, triangle.p2, triangle.p3) || lineIntersectsLine(lineStart1, lineEnd1, triangle.p3, triangle.p1)) {
        return true;
    }
    return false;
}

boolean lineIntersectsLine(Point lineStart1, Point lineEnd1, Point lineStart2, Point lineEnd2) {
    int d1 = direction(lineStart2, lineEnd2, lineStart1);
    int d2 = direction(lineStart2, lineEnd2, lineEnd1);
    int d3 = direction(lineStart1, lineEnd1, lineStart2);
    int d4 = direction(lineStart1, lineEnd1, lineEnd2);

    if (((d1 > 0 && d2 < 0) || (d1 < 0 && d2 > 0)) && ((d3 > 0 && d4 < 0) || (d3 < 0 && d4 > 0))) {
        return true;
    } else if (d1 ==