判断两段线段相交的流程
流程图
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