多边形交叉区域计算面积_公布计算任意多边形相交部分的面积的方法

最近开发过程中遇到了这个问题,费了好大的劲才搞定,贴出来跟大家分享         假设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)               {     AfxMessageBox("多边形求交出错");     return   0;               }           //没有相交           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里都有现成的(特别是图形相关),用起来很方便。找算法往往又费劲,又得担心算法的正确性,不怎么好。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值