GUI程式優化演算法之矩形覆蓋

2021-09-07 22:52:14 字數 1351 閱讀 7384

在一些gui程式中,需要在乙個圖形容器中同時繪製若干個矩形區域的圖形,而且這些矩形區域可能相互覆蓋,這就類似於windows桌面

中各個矩形窗體的相互覆蓋,這時程式繪製這些矩形圖形時,應當不需要全部繪製(如圖1中的矩形b,c),甚至其中的某些被其他矩形完全覆蓋的矩形區域不需要全部繪製(如圖1中的矩形a),這樣就需要乙個演算法來進行判斷實際應繪製的區域。

大家知道,在windows控制項的paint事件中系統會傳送乙個實際需要的矩形繪製剪下區域,只有這個矩形區域是需要繪製的區域,一些情況下這個區域小於控制項全部的顯示區域,這樣可以利用這個矩形繪製區域可以進行初步的繪製優化。

在繪製某個矩形區域前,首先獲得所有可能覆蓋該矩形區域的所有其他矩形,然後將其他矩形乙個個進行判斷,獲得沒有被覆蓋的區域,然後將所有殘存的矩形區域處理下乙個覆蓋的矩形,小弟暫稱這種處理方法為矩形覆蓋,現在根據圖2對矩形覆蓋進行詳細說明。

首先考慮只有乙個覆蓋矩形且這個覆蓋矩形區域比較小的情況,圖2中的大矩形為當前要繪製的矩形圖形和剪下區域的交集座標和大小為(left1 , top1 , width1 , height1 , right1 , bottom1 ),而覆蓋矩形座標和大小為(left2 , top2 , width2 , height2 , right2 , bottom2 ),則覆蓋矩形覆蓋了大矩形,會形成4個小矩形,這4個小矩形的座標和大小分別為(left1 , top1 , left2 - left1 , height1 ),( left2 , top1 , right1 - left2 , top2 - top1 ), ( right2 , top2 , right1-right2 , bottom1-top2) , ( left2 , bottom2 , width2 , bottom1 - top2 )。

由於小矩形寬度和高度不可能小於0,因此根據覆蓋區域的位置和大小會生成0至4個的小矩形。當出現覆蓋矩形完全覆蓋原始矩形的極端情況時會生成0個小矩形,此時原始矩形在任何情況下就沒有必要進行繪製。若覆蓋矩形和原始矩形沒有交集則不需要進行覆蓋操作。

當有第二個覆蓋矩形時,根據已經分出的4個小矩形再跟第二個覆蓋矩形進行同樣的覆蓋矩形,理論上會在生成16個小矩形,同樣再處理其他的覆蓋矩形,若有n個覆蓋矩形,則理論上會生成4的n次方個小矩形,但實際上生成的小矩形數目會遠小於這個理論值。

進行覆蓋操作時,分解所得的小矩形越多,則根據這些小矩形進行繪製操作越複雜,因此需要控制小矩形的個數,若覆蓋矩形相對於原始矩形比較小時,則可以認為不需要進行覆蓋操作。因此提出覆蓋率的引數,當覆蓋矩形的面積和原始矩形的面積的比率小於覆蓋率時就可以認為不需要進行覆蓋操作。

根據覆蓋操作可以減少繪製區域,優化繪圖

程式,提高速度。

矩形覆蓋 演算法

題目描述 我們可以用21的小矩形橫著或者豎著去覆蓋更大的矩形。請問用n個21的小矩形無重疊地覆蓋乙個2 n的大矩形,總共有多少種方法?import org.junit.test 題目描述 我們可以用2 1的小矩形橫著或者豎著去覆蓋更大的矩形。請問用n個2 1的小矩形無重疊地覆蓋乙個2 n的大矩形,總...

劍指offer演算法 矩形覆蓋

演算法描述 我們可以用2 1的小矩形橫著或者豎著去覆蓋更大的矩形。請問用n個2 1的小矩形無重疊地覆蓋乙個2 n的大矩形,總共有多少種方法?分析與實現 由於是2 n的大矩形,同時這個矩形的長度不變,只有寬度n一直在變。經過分析會發現覆蓋的方法其實和佔滿寬度n的方式一樣。所以這個問題就變成了類似如下問...

劍指Offer之矩形覆蓋

題目描述 我們可以用2 1的小矩形橫著或者豎著去覆蓋更大的矩形。請問用n個2 1的小矩形無重疊地覆蓋乙個2 n的大矩形,總共有多少種方法?輸入 輸入可能包含多個測試樣例,對於每個測試案例,輸入包括乙個整數n 1 n 70 其中n為偶數。輸出 對應每個測試案例,輸出用n個2 1的小矩形無重疊地覆蓋乙個...