最小外接矩形問題是在給出乙個多邊形(或一群點),求出面積最小且外接多邊形的矩形的問題。這個問題看起來並不難,但是具體實現並不簡單。除了呼叫現有的公開庫之外,這裡給出一種簡單且易理解的方法。
演算法的主要思想是:
(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-----------比較每個外接矩形,確定每個環面積最小的外接矩形
int finalid;
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軸的外接矩形。簡單外接...
(三)建築物多邊形化簡系列 去除冗餘點
製圖綜合和建築物資料處理等都涉及到建築物多邊形的化簡。製圖綜合中,由於比例尺的變小,建築物在小比例尺地圖上所佔面積變小,這意味著建築物圖形的形狀精度也有一定的損失,為了更好地表示原有建築物的特徵 面積 圖形和方向 需要對建築物多邊形進行化簡。另外,從遙感影像提取的建築物向量資料需要經過圖形化簡等一系...
(一)建築物多邊形化簡系列 去除噪點環
由於本人最近在進行建築物資料處理的專案,遇到了較多的問題,同時也收穫了很多知識。所有打算寫乙個建築物處理的系列部落格。要處理建築物多邊形,首先得理解結構關係,這是所有實現處理的基礎。建築物多邊形是由一條條封閉的環 線狀 組成,環是由一組首尾相同的點組成,所以對建築物多邊形的處理實質是對環和點處理。實...