(五)建築物多邊形化簡系列 最小外接矩形的獲取

2022-03-11 22:19:15 字數 2757 閱讀 2081

最小外接矩形問題是在給出乙個多邊形(或一群點),求出面積最小且外接多邊形的矩形的問題。這個問題看起來並不難,但是具體實現並不簡單。除了呼叫現有的公開庫之外,這裡給出一種簡單且易理解的方法。

演算法的主要思想是:

(1)先實現多邊形的簡單外接矩形的演算法。簡單外接矩形是指邊平行於x軸或y軸的外接矩形。簡單外接矩形很有可能不是最小外接矩形,卻是非常容易求得的外接矩形,這為後面做鋪墊。

(2)實現平面上某一點繞固定點旋轉某一角度的演算法。數學基礎是,設平面上點(x1,y1)繞另一點(x0,y0)逆時針旋轉a角度後的點為(x2,y2),則有

x2 =(x1-x0)*cosa-(y1-y0)*sina+x0

y2 =(x1-x0)*sina+(y1-y0)*cosa+y0

順時針時,a改寫成-a即可。

(3)旋轉原始多邊形(迴圈,0-90°,間距設為1°),求旋轉每個度數後的多邊形的簡單外接矩形,記錄簡單外接矩形的面積、頂點座標以及此時旋轉的度數。

(4)比較在旋轉過程中多邊形求得的所有簡單外接矩形,得到面積最小的簡單外接矩形,獲取該簡單外接矩形的頂點座標和旋轉的角度。

(5)旋轉外接矩形。將上一步獲得面積最小的簡單外接矩形反方向(與第3步方向相反)旋轉相同的角度,即得最小外接矩形。

實現過程

(1)尋找多邊形的中心

多邊形的中心就是多邊形的重心,各個座標點之和求平均即可

cpoint* cgeopolygon::findcenter(vectorptsarray)

tempx = sumx/size;

tempy = sumy/size;

cpoint* pt = new

cpoint(tempx,tempy);

return

pt;}

(2)旋轉多邊形,針對每個點實現繞中心點旋轉

旋轉的演算法見下,注意角度要轉換成弧度。

//

某一點pt繞center旋轉theta角度,zf,0706

cpoint* cgeopolygon::rotate(cpoint* pt, cpoint* center, double

theta)

(3)多邊形旋轉後求簡單外接矩形,簡單外接矩形演算法見下

void cgeopolygon::findrectangle(vectorpts)

cpoint *pt1 = new cpoint(xmax,ymax); //

左上 cpoint *pt2 = new

cpoint(xmax,ymin);

cpoint *pt3 = new

cpoint(xmin,ymin);

cpoint *pt4 = new

cpoint(xmin,ymax);

rectanglearray.push_back(pt1);

rectanglearray.push_back(pt2);

rectanglearray.push_back(pt3);

rectanglearray.push_back(pt4);}}

這裡的rectanglearray是我自己工程的陣列,可以換成自己的。

上述三步為第一大步。

(4)儲存每個旋轉角度下多邊形的外接矩形,記錄外接矩形的頂點座標、面積和此時多邊形的旋轉角度

vectortemp = findrectangle(temparray); //

-----------2---------求旋轉後的外接矩形

if(temp.size() == 0

)                afxmessagebox(

"簡單外接矩形獲取失敗!");

else

(5)比較每個外接矩形,確定每個環面積最小的外接矩形。

//

------3-----------比較每個外接矩形,確定每個環面積最小的外接矩形

intfinalid;

double compare = 600000000

;

for(int num = 0;nummbr.size();num++)

}for(int num = 0;nummbr.size();num++)

}

(6)將外接矩形旋轉回來。外接矩形朝相反的方向旋轉相同度數。

//

----------4-------將外接矩形朝相反的方向旋轉相同度數

int finalangle = circles[i]->finalmbr.id;

for(int final = 0;finalfinalmbr.vertices.size();final++)

rectanglerotate.push_back(rotate(circles[i]->finalmbr.vertices[final],center,-finalangle)); //

!!!此處角度相反

id就是旋轉的角度。

最終效果:

簡單外接矩形

最小外接矩形

總結:理解演算法的思路很重要,我的**只是乙個例子。這個方法不需要旋轉外接矩形,只需要旋轉多邊形求簡單外接矩形,思路上更容易理解。

ps:很感謝我的室友楊某給我的幫助,此方法受他啟發。

(五)建築物多邊形化簡系列 最小外接矩形的獲取

最小外接矩形問題是在給出乙個多邊形 或一群點 求出面積最小且外接多邊形的矩形的問題。這個問題看起來並不難,但是具體實現並不簡單。除了呼叫現有的公開庫之外,這裡給出一種簡單且易理解的方法。演算法的主要思想是 1 先實現多邊形的簡單外接矩形的演算法。簡單外接矩形是指邊平行於x軸或y軸的外接矩形。簡單外接...

(三)建築物多邊形化簡系列 去除冗餘點

製圖綜合和建築物資料處理等都涉及到建築物多邊形的化簡。製圖綜合中,由於比例尺的變小,建築物在小比例尺地圖上所佔面積變小,這意味著建築物圖形的形狀精度也有一定的損失,為了更好地表示原有建築物的特徵 面積 圖形和方向 需要對建築物多邊形進行化簡。另外,從遙感影像提取的建築物向量資料需要經過圖形化簡等一系...

(一)建築物多邊形化簡系列 去除噪點環

由於本人最近在進行建築物資料處理的專案,遇到了較多的問題,同時也收穫了很多知識。所有打算寫乙個建築物處理的系列部落格。要處理建築物多邊形,首先得理解結構關係,這是所有實現處理的基礎。建築物多邊形是由一條條封閉的環 線狀 組成,環是由一組首尾相同的點組成,所以對建築物多邊形的處理實質是對環和點處理。實...