知识都是环环相扣的, 在阅读这编文章之前, 要求懂两个知识点
1. 会求点到线段的最短距离 传送门
2. 会判断点与线段位置关系 传送门
如果上面两个知识点都懂, 那么就进入正题了
给出点A1、A2的坐标, 构成线段A1A2, 再给出点B1,B2的坐标, 构成线段B1B2, 求线段A1A2与线段B1B2的最短距离
两条线段的摆放有很多情况
(1) 两线段相交成 X 型
(2) 两线段相交成 T 型
(3) 两线段相交成 ^ 型, 其中有两点重合
(4) 四个点在一条直线上, 视为相交
(5) 两线段不相交
判断两线段是否相交
(1)(2)(3)(4)是两条线段相交的例子, 对于两线段相交的情况, 距离为0, 只要对[判断点与线段位置关系]加以应用, 就能轻松判断出两线段是否相交。
分别检查两条线段, 如果双方都符合"另一条线段的两个端点分别位于当前线段的顺时针方向和逆时针方向", 则两条线段相交。
判断线段A1A2与线段B1B2是否相交的程序可以像下面这样写
if (dir(A1, A2, B1)*dir(A1, A2, B2) <= 0 && dir(B1, B2, A1)*dir(B1, B2, A2) <= 0)
cout << "相交" << endl;
只要事先将 dir 返回值定义为
逆时针