線段樹輔助——掃描線法計算矩形面積並


推薦技術公眾號:不愛睡覺的大豬

 

分析:

1.矩形比較多,坐標也很大,所以橫坐標需要離散化(縱坐標不需要),熟悉離散化后這個步驟不難,所以這里不詳細講解了,不明白的還請百度

2.重點:掃描線法:假想有一條掃描線,從左往右(從右往左),或者從下往上(從上往下)掃描過整個多邊形(或者說畸形。。多個矩形疊加后的那個圖形)。如果是豎直方向上掃描,則是離散化橫坐標,如果是水平方向上掃描,則是離散化縱坐標。下面的分析都是離散化橫坐標的,並且從下往上掃描的

   掃描之前還需要做一個工作,就是保存好所有矩形的上下邊,並且按照它們所處的高度進行排序,另外如果是上邊我們給他一個值-1,下邊給他一個值1,我們用一個結構體來保存所有的上下邊 

struct segment
{
double l,r,h;   //l,r表示這條上下邊的左右坐標,h是這條邊所處的高度
int f;   //所賦的值,1或-1
}

接着掃描線從下往上掃描,每遇到一條上下邊就停下來,將這條線段投影到總區間上(總區間就是整個多邊形橫跨的長度),這個投影對應的其實是個插入和刪除線段操作。還記得給他們賦的值1或-1嗎,下邊是1,掃描到下邊的話相當於往總區間插入一條線段,上邊-1,掃描到上邊相當於在總區間刪除一條線段(如果說插入刪除比較抽象,那么就直白說,掃描到下邊,投影到總區間,對應的那一段的值都要增1,掃描到上邊對應的那一段的值都要減1,如果總區間某一段的值為0,說明其實沒有線段覆蓋到它,為正數則有,那會不會為負數呢?是不可能的,可以自己思考一下)。

每掃描到一條上下邊后並投影到總區間后,就判斷總區間現在被覆蓋的總長度,然后用下一條邊的高度減去當前這條邊的高度,乘上總區間被覆蓋的長度,就能得到一塊面積,並依此做下去,就能得到最后的面積

(這個過程其實一點都不難,只是看文字較難體會,建議紙上畫圖,一畫即可明白,下面獻上一圖希望有幫組)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM