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

最近开发过程中遇到了这个问题,费了好大的劲才搞定,贴出来跟大家分享  
   
  假设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里都有现成的(特别是图形相关),用起来很方便。找算法往往又费劲,又得担心算法的正确性,不怎么好。    
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值