poj 2187 直接求直徑ok多邊形的直徑被定義為多邊形上任意兩點間的最大距離的值。 在多邊形上,決定直徑的點可能不止一對。 事實上,如果乙個多邊形含有n個頂點,那麼就最多有 n 對「直徑點對」在。
上圖所示的是乙個簡單的多邊形直徑的例項。 直徑點對在圖中是被平行的切線(用紅色表示)穿過的黑點. 直徑是用淡藍色高亮表示的。
很明顯, 確定凸多邊形 p 直徑的點對不可能在多邊形 p 內部。 所以搜尋應該在邊界上進行。 事實上, 由於直徑是多邊形的平行切線的最遠距離, 所以我們只需要查詢對踵點。 shamos (1978) 提供了乙個 簡單的 時間複雜度為o(n) 的計算凸包對踵點對的演算法。這個演算法是通過遍歷這些點的列表, 得到最大距離即直徑,然後輸出這個點對。 下面是shamos 演算法的偽**,2023年在 preparata 和 shamos 文章中進行發表。
輸入是乙個多邊形 p=
begin
p0:=pn;
q:=next[p];
while (area(p,next[p],next[q]) > area(p,next[p],q)) do
q:=next[q];
q0:=q;
while (q != p0) do
begin
p:=next[p];
print(p,q);
while (area(p,next[p],next[q]) > area(p,next[p],q) do
begin
q:=next[q];
if ((p,q) != (q0,p0)) then print(p,q)
else return
end;
if (area(p,next[p],next[q]) = area(p,next[p],q)) then
if ((p,q) != (q0,p0)) then print(p,next[q])
else print(next[p],q)
endend.
注意 print(p,q) 表示將 (p,q) 作為乙個對踵點對輸出, area(p,q,r) 表示三角形 pqr 的有向面積。
雖然直覺看這個過程與常規旋轉卡殼演算法不同, 但從本質上看是相同的, 並且避免了任何角度的計算。
下面試是乙個比較直觀的演算法:
1、計算出多邊形 y 方向上的端點。 設為 ymin 和 ymax 。雖然上述的過程(給出的偽**)變得非常有用, 但是我們仍可以從對踵點對中得到其他的資訊, 如多邊形的寬度 。2、通過 ymin 和 ymax 構造兩條水平切線。 由於他們已經是一對對踵點, 計算他們之間的距離並維護為乙個當前最大值。
3、同時旋轉兩條線直到其中一條與多邊形的一條邊重合。
4、一對新的對踵點對此時產生。 計算新的距離, 並和當前最大值比較, 大於當前最大值則更新。
5、重複步驟3和步驟4的過程直到再次產生對踵點對 (ymin,ymax) 。
6、輸出確定最大直徑的對踵點對。
旋轉卡殼求凸包直徑
直徑即最長的兩點的距離 列舉凸包上的所有邊,對每一條邊找出凸包上離該邊最遠的頂點 用叉積 計算這個頂點到該邊兩個端點的距離,並記錄最大的值。但是注意到當我們逆時針列舉邊的時候,最遠點的變化也是逆時針的,這樣就可以不用從頭計算最遠點,而可以緊接著上一次的最遠點繼續計算。於是我們得到了o n 的演算法。...
LA 4728凸包演算法 旋轉卡殼的直徑
1 la 4728 2凸包演算法 旋轉卡殼的直徑 3沒有其他技巧,可作為模板運用 4注意operator 中精度的處理,不然會出錯5 6 include 7 include 8 include 9 include 10 include 11 include 12 include 13 include...
凸包問題 旋轉卡殼
1978年,m.i.shamos在 computational ceometry 中介紹了一種尋找凸多邊形直徑的線性演算法。1.支撐線 如果一條直線l,通過凸多邊形p的乙個頂點,且多邊形在這條直線的一側,稱l是p的支撐線。2.對踵 zhong,三聲 點 如果過凸包上的兩個點可以畫一對平行直線,使凸包...