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 返回值定義為
逆時針 返回 -1
順時針 返回 1
反向延長線上 返回 -2
延長線上 返回 2
線段上 返回 0
dir(a1,a2,b1)*dir(a1,a2,b2) 在b1、b2位於不同側時就會得出 -1,b1或b2位於線段a1a2上時得出0。點a1、a2相對於線段b1b2的位置也是同理。接下來, 只要線段a1a2、b1b2的判斷均小於等於0, 即可確定他們相交。
若不相交, 求兩線段最短距離
在了解如何求點到線段的最短距離, 這就好辦了
線段a1a2與線段b1b2的距離為以下四個距離中最小的乙個
1.點a1到線段b1b2的距離
2.點a2到線段b1b2的距離
3.點b1到線段a1a2的距離
4.點b2到線段a1a2的距離
#include#include#includeusing namespace std;
typedef struct node
point, vector;
double cross(point a, point b, point p) //向量ab與向量ap的外積(叉積)
; vector ap = ;
return ab.x*ap.y - ab.y*ap.x;
}double dot(point a, point b, point p) //向量ab與向量ap的內積(點積)
; vector ap = ;
return ab.x*ap.x + ab.y*ap.y;
}double dis2(point a, point b) //點a、b距離的平方
int dir(point a, point b, point p) //點p與線段ab位置關係
}double dismin(point a, point b, point p) //點p到線段ab的最短距離
}int main()
參考書籍: 挑戰程式設計競賽2 線段間最短距離
計算平面上兩條線段之間的最短距離 兩線段用其端點s1 p1a,p1b s2 p2a,p2b 表示 s1,s2上距離最近的兩點之間的距離d s1,s2 定義為。分為三種情況討論。a.若兩線段有交點,距離d為0 b.計算兩線段端點到對方線段所在直線l1,l2的距離。d p1a,l2 d p1b,l2 d...
1208 兩陣列最短距離
兩陣列最短距離 time limit 1000ms memory limit 65536k total submit 62 accepted 50 description 已知元素未排序的兩個陣列x和y,請寫出乙個程式算出兩個陣列彼此之間差的絕對值中最大的乙個,這叫做陣列的距離。input 第一行為...
二維平面最短距離(分治)
題目描述 有一天,小明得到了二維平面上的若干個點,他現在想知道這些點中距離最近的兩個點之間的距離是多少?輸入 第一行輸入乙個整數t,共有t組測試資料 t 30 每組輸入資料第一行輸入乙個n,表示有n個點。第二行有n 2的數字,相鄰兩個數代表乙個點的x,y座標。1輸出輸出有t行,每行包括乙個整數,代表...