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

來源:互聯網
上載者:User

在一些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次方個小矩形,但實際上產生的小矩形數目會遠小於這個理論值。

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

根據覆蓋操作可以減少繪製地區,最佳化繪圖程式,提高速度。

根據這種演算法,小弟編製了一個示範程式。程式使用者介面如圖3,點擊下載 /Files/xdesigner/RectOverride.rar

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.