Matlab中判断两点定义的两条直线是否存在交点的实现方法
两点定义直线的相交判断实现方法
核心判断原理
这里区分无限直线和线段两种场景的判断逻辑,可根据实际需求选择:
场景1:判断无限直线是否相交
直线通用表达式为 Ax + By + C = 0,通过两点坐标可直接算出对应系数,再通过系数判断直线关系:
- 提取两条直线的端点坐标:
% 第一条直线端点 x1 = FPX(1); y1 = FPY(1); x2 = FPX(2); y2 = FPY(2); % 第二条直线端点 x3 = SPX(1); y3 = SPY(1); x4 = SPX(2); y4 = SPY(2); - 计算两条直线的一般式系数:
A1 = y2 - y1; B1 = x1 - x2; C1 = x2*y1 - x1*y2; A2 = y4 - y3; B2 = x3 - x4; C2 = x4*y3 - x3*y4; - 计算判别式
D:D = A1 * B2 - A2 * B1; - 结果判断:
- 若
abs(D) > 1e-8(适配浮点计算误差的精度阈值,可自行调整):两条直线不平行,存在唯一交点 - 若
abs(D) <= 1e-8:两条直线平行或重合,此时代入其中一条直线的端点到另一条直线的表达式:% 取第二条直线的端点代入第一条直线方程 val = A1 * x3 + B1 * y3 + C1;- 若
abs(val) < 1e-8:两条直线完全重合,存在无数交点,属于相交 - 否则:两条直线平行无交点
- 若
- 若
场景2:判断线段是否相交
如果实际需求是判断两个线段是否相交,在上述无限直线判断的基础上,补充跨立验证即可:
- 先判断两条线段对应的无限直线是否相交,不相交直接返回否
- 若直线相交,计算交点坐标:
x = (B1*C2 - B2*C1) / D; y = (A2*C1 - A1*C2) / D; - 判断交点是否同时落在两条线段的坐标区间内,满足则线段相交。
完整判断代码示例(Matlab)
function isIntersect = checkLineIntersect(FPX, FPY, SPX, SPY) % 精度阈值,适配浮点计算误差 eps = 1e-8; x1 = FPX(1); y1 = FPY(1); x2 = FPX(2); y2 = FPY(2); x3 = SPX(1); y3 = SPY(1); x4 = SPX(2); y4 = SPY(2); A1 = y2 - y1; B1 = x1 - x2; C1 = x2*y1 - x1*y2; A2 = y4 - y3; B2 = x3 - x4; C2 = x4*y3 - x3*y4; D = A1 * B2 - A2 * B1; if abs(D) > eps % 不平行,存在交点 isIntersect = true; else % 平行,判断是否重合 val = A1 * x3 + B1 * y3 + C1; isIntersect = abs(val) < eps; end end
内容的提问来源于stack exchange,提问作者Michaelo
相关产品推荐
相关产品推荐

