大佬部落格直通車
根據凸包上的邊的最遠點隨著邊逆時針轉動,一起逆時針轉動的性質,使用計算幾何的一些方法進行旋轉遍歷。
例題1:二維平面上有若干個點,求該平面上最遠的兩個點的距離
首先,這兩個點一定凸包上。
很容易想到個o(n2)的演算法,暴力列舉凸包上的每兩點即可,想想更好的演算法。
乙個我證明不來的定理:
距離某個點最遠的點一定在距離某個點最遠的邊的兩端點上
所以我們迴圈找距離每條邊上最遠的點,求兩次dis(邊上的端點)即可
我們發現,還是o(n2)
但是畫圖我們可以發現,隨著逆時針取邊,其邊所對應的最遠的點也在逆時針的旋轉,這就可以實現o(n)的遍歷了,但是求凸包還有個o(nlogn)的過程,所以總體時間複雜度是o(nlogn)
1.求凸包
2.迴圈遍歷凸包上的每條邊,找到其最遠點,並求兩次dis
如何找到最遠點?
叉積!!!
對於s[i],s[i+1],p[j]形成的三角形,因為叉積正比於三角形面積,而底邊s[i],s[i+1]固定不變,叉積越大三角形面積越大,三角形的高越大,點到直線s[i],s[i+1]的距離越遠
迴圈判斷下乙個點是否比當前點更遠,如果更遠就再找下乙個點,直到找到為止
**如下(求凸包過程省略)
long
long
getdiameter()
return ans;
}
例題2:求最小矩陣覆蓋
首先,覆蓋所有點等價於覆蓋凸包點
其次,目標矩陣的某一條邊一定與凸包上的一條邊共線
迴圈遍歷邊找以這些邊作為矩陣的底邊找矩陣的上左右邊即可
如何找上邊?
上邊就是最遠點所在的平行邊,旋轉卡殼找即可
如何找左右邊?
左邊就是以該底邊為x軸的最左邊點所在的垂直邊,可以用點積判角度找
同樣的,底邊逆時針轉動,其對應的最左邊的點也在逆時針轉動
也用旋轉卡殼找即可
步驟:用點積判斷兩個向量角度,從而判斷下乙個是否比當前點更靠左,如果更靠左,就再找下乙個點,直到找到最做點為止
計算幾何學習筆記之旋轉卡殼
旋轉卡殼的用途太廣太廣了,而且每種用途 都大同小異,這裡只簡單介紹一下 畢竟我也沒怎麼寫過 什麼是旋轉卡殼?可以想象成有一雙筷子 筷子是平行的 把凸多邊形夾了起來,然後不停地旋轉,旋轉。旋轉中筷子要麼是緊貼多邊形的邊要麼就是緊貼多邊形的頂點。旋轉卡殼簡介 計算凸多邊形上的最遠點對 又叫直徑 這樣考慮...
計算幾何之向量旋轉
實際做題中我們可能會遇到很多有關及計算幾何的問題,其中有一類問題就是向量的旋轉問題,下面我們來具體 一下有關旋轉的問題。首先我們先把問題簡化一下,我們先研究乙個點繞另乙個點旋轉一定角度的問題。已知a點座標 x1,y1 b 點座標 x2,y2 我們需要求得 a點繞著 b點旋轉 度後的位置。a點繞b點旋...
《模板》《計算幾何》凸包 旋轉卡殼最小面積外接矩形
今天做uva 10173時遇到的問題,網上各位大牛的 和思想實在無法理解,請教學長後理解了乙個演算法。學長 下面貼一下學長的模板,圖和注釋是我加上的。注 淺褐色為凸包,紅色為待求矩形。include include include include define min x,y x using nam...