公布計算任意多邊形相交部分的面積的方法

2021-04-12 20:56:58 字數 1846 閱讀 7659

最近開發過程中遇到了這個問題,費了好大的勁才搞定,貼出來跟大家分享  

假設lpvertex1裡存放著多邊形1的頂點,nvertexcount1為多邊形1的頂點數  

lpvertex2裡存放著多邊形2的頂點,nvertexcount2為多邊形2的頂點數  

//建立多邊形區域1  

crgn   poly1;  

poly1.createpolygonrgn(lpvertex1,nvertexcount1,alternate);  

delete   lpvertex1;  

//建立多邊形區域2  

crgn   poly2;  

poly2.createpolygonrgn(lpvertex2,nvertexcount2,alternate);  

delete   lpvertex2;  

//獲取相交的多邊形區域  

crgn   intersectrgn;  

intersectrgn.createrectrgn(0,0,0,0);  

int   nintersectresult   =   intersectrgn.combinergn(   &poly1,&poly2,rgn_and);  

if(nintersectresult==error)  

//沒有相交  

if(nintersectresult==nullregion)  

return   0;  

/***********精華部分到了************/    

//計算相交部分的面積  

region   intersectregion((hrgn)intersectrgn);  

matrix   matrix;  

rect*   rects   =   null;  

int   count   =   0;    

cclientdc   dc(this);  

graphics   graphics(   dc.getsafehdc()   );  

graphics.gettransform(&matrix);  

count   =   intersectregion.getregionscanscount(&matrix);  

rects   =   (rect*)malloc(count*sizeof(rect));  

intersectregion.getregionscans(&matrix,   rects,   &count);  

double   dbtotalarea=0;  

for(int   j   =   0;   j   <   count;   ++j)  

dbtotalarea +=(rects[j].getbottom()-rects[j].gettop())*   (rects[j].getright()-rects[j].getleft());  

free(rects);  

graphics.releasehdc(dc.getsafehdc());  

//返回面積值  

return   dbtotalarea;  

該方法不僅可以計算多邊形之間相交部分的面積,而且可以算圓和多邊形的相交面積,甚至是任意圖形相交部分的面積。  

在使用該方法的時候,用到了gdi+的相關類region,相關資料請檢視msdn。  

發現該演算法有漏洞,白編了,呵呵,組長叫我好好看看gdi的region類,結果給我找到了這個方法,所得:有些東西mfc裡都有現成的(特別是圖形相關),用起來很方便。找演算法往往又費勁,又得擔心演算法的正確性,不怎麼好。    

空間中任意多邊形相交演算法

public static string mypf function 不相交條件 if a 0 a 1 0 a 0 a 2 0 a 0 a 3 0 共面 if math.abs a 0 0.00000000000001 math.abs a 1 0.00000000000001 math.abs a...

任意多邊形面積計算

任意多邊形的面積可由任意一點與多邊形上依次兩點連線構成的三角形向量面積求和得出。向量面積 三角形兩邊向量的叉乘。如下圖 按定理,多邊形面積由p點與a g的各頂點連線所構成的三角形向量面積構成,假定多邊形頂點座標順序為a g,逆時針為正方向,則有如下結論 pab,pbc,pcd均為順時針,面積為負 p...

多邊形相交面積計算模版

型別 多邊形相交面積模板 include include include include includeusing namespace std define maxn 510 const double eps 1e 8 int sig double d struct point point doub...