判断两段线段相交的流程

流程图

flowchart TD
    A(开始) --> B(计算两条线段的斜率)
    B --> C(判断斜率是否相等)
    C -- 是 --> D(判断两条直线是否重叠)
    D -- 是 --> E(判断两条直线是否在同一条直线上)
    E -- 是 --> F(判断两条直线是否平行)
    F -- 是 --> G(计算两条直线的交点)
    G -- 是 --> H(判断交点是否在两条线段上)
    H -- 是 --> I(线段相交)
    I -- 结束
    C -- 否 --> J(计算两条直线的截距)
    J -- 是 --> K(计算两条线段的截距)
    K -- 是 --> L(判断两条线段是否重叠)
    L -- 是 --> H
    L -- 否 --> M(判断两条线段是否在同一条直线上)
    M -- 是 --> F
    M -- 否 --> N(判断两条线段是否平行)
    N -- 是 --> 结束
    N -- 否 --> I

步骤

步骤 内容
步骤1 计算两条线段的斜率
步骤2 判断斜率是否相等
步骤3 若斜率相等,判断两条直线是否重叠
步骤4 若斜率相等且直线重叠,判断两条直线是否在同一条直线上
步骤5 若斜率相等且直线重叠且在同一条直线上,判断两条直线是否平行
步骤6 若斜率相等且直线重叠且在同一条直线上且平行,则计算两条直线的交点
步骤7 若计算出交点,判断交点是否在两条线段上
步骤8 若交点在两条线段上,则判断线段相交,否则线段不相交

代码实现

步骤1:计算两条线段的斜率

// 计算线段的斜率
public double calculateSlope(Point p1, Point p2) {
    if (p1.getX() == p2.getX()) {
        // 斜率不存在,垂直线段
        return Double.POSITIVE_INFINITY;
    } else {
        return (p2.getY() - p1.getY()) / (p2.getX() - p1.getX());
    }
}

步骤2:判断斜率是否相等

// 判断斜率是否相等
public boolean isSlopeEqual(double slope1, double slope2) {
    return Math.abs(slope1 - slope2) < 1e-6;
}

步骤3:判断两条直线是否重叠

// 判断两条直线是否重叠
public boolean isLinesOverlap(Point p1, Point p2, Point p3, Point p4) {
    // 判断两条线段的最大最小横坐标和纵坐标
    double max1X = Math.max(p1.getX(), p2.getX());
    double min1X = Math.min(p1.getX(), p2.getX());
    double max1Y = Math.max(p1.getY(), p2.getY());
    double min1Y = Math.min(p1.getY(), p2.getY());
    double max2X = Math.max(p3.getX(), p4.getX());
    double min2X = Math.min(p3.getX(), p4.getX());
    double max2Y = Math.max(p3.getY(), p4.getY());
    double min2Y = Math.min(p3.getY(), p4.getY());

    return max1X >= min2X && max1Y >= min2Y && max2X >= min1X && max2Y >= min1Y;
}

步骤4:判断两条直线是否在同一条直线上

// 判断两条直线是否在同一条直线上
public boolean isLinesOnSameLine(Point p1, Point p2, Point p3, Point p4) {
    double slope1 = calculateSlope(p1, p2);
    double slope2 = calculateSlope(p3, p4);

    return isS