旋轉卡殼 凸包的直徑

2021-05-28 09:53:01 字數 1535 閱讀 7857

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,三聲 點 如果過凸包上的兩個點可以畫一對平行直線,使凸包...