您的位置:首页 > 其它

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

2007-04-04 10:23 351 查看
最近开发过程中遇到了这个问题,费了好大的劲才搞定,贴出来跟大家分享

假设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里都有现成的(特别是图形相关),用起来很方便。找算法往往又费劲,又得担心算法的正确性,不怎么好。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: