求多边形面积 怎样用VC求不规则多边形面积。我很急,谢谢!!! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 agree 回复人: hailong0108(汤姆) ( ) 信誉:111 2003-02-24 17:47:00 得分:0 用象素填充,计点拿一个多边形的外接矩形象素填充,看是否落在多边形内,计算点的个数 只要各边不交叉,绝对行。double dMj=0;//面积//n是点数加1,//x[0],y[0],x[1],y[1]...,x[n-1],y[n-1]分别是多边形按顺序排列的n个点的坐标。x[n] = x[0];//x[n]被赋值为x[0]是便于计算,x[n]并不是一个点的横坐标y[n] = y[0];for(int i=0; i<n; i++){ dMj += x[i]*y[i+1] - x[i+1]*y[i];}dMj = fabs(dMj)/2; 如果用象素填充法来算矢量图形的多边形面积,那可就惨了参考一下下面的:http://expert.csdn.net/Expert/topic/1025/1025922.xml?temp=.5344202用 xyw2278(启明星) 的方法也可以 不管多边形是什么样子的,它都是由一组直线封闭而成的,这样你就可以计算出所有这些端点里最左边的点的x坐标、最上边的点的y坐标、最右边的点的x坐标以及最下边的点的y坐标,这样这个多边形的外接矩形就知道了,然后用二次循环搜索所有在该矩形中的点是否也在这个多边形里,累计这些点就可以得到面积了,这个方法如同楼上萧遥的说法。 int CImageViewView::GetRgnArea(){ int area = 0; int i,j; CRect rect; CPoint* m_points; int m_nPoints; CImageViewDoc* pDoc = GetDocument(); m_nPoints = pDoc->m_aryRectPoint.GetSize(); m_points = new CPoint[m_nPoints]; for(i = 0; i<m_nPoints ; i++)//获得所有顶点的位置 { m_points[i] = pDoc->m_aryRectPoint[i]->m_ptPoint; } CRgn rgn; rgn.CreatePolygonRgn(m_points, m_nPoints, ALTERNATE); rgn.GetRgnBox(&rect);//获得一个包括该多边形的矩形 CPoint point;//计算矩形内的点落在多边形内的数量 for( i = rect.top ; i<rect.bottom;i++) for( j = rect.left; j<rect.right ; j++) { point.x = j; point.y = i; if(rgn.PtInRegion(point)) area ++; } delete[] m_points; return area;} ctl2008(ctl) :楼上的只计算了多边形内的点数而非面积数字化的图形和图象的面积就是象素数,还有其他的吗? 用GDI+可以计算任意多边形的面积,我以前碰到过这个问题,请看:http://expert.csdn.net/Expert/TopicView1.asp?id=1846493 有一种求任意封闭区域面积的算法,是用方向链码来实现的。 基本思想:边界跟踪得到区域边界点坐标及其方向链码;根据各点的方向码得到该点类型(左端点·右端点·尖点);逐行扫描,进行端点匹配。这样任意封闭区域面积都能算出。 以上只是介绍一种算法,对于任意多边形,则只要先获得各顶点坐标(用于构造多边形),用GetRgnBox得到一个外接矩形,逐行扫描,判断各点是否在多边形内,记下总数即为面积。 获取顶点坐标方法较多,可通过判断相邻3点的斜率;可通过线段长度来判断( if(AB+BC-AC<@) B不是顶点 //@是一个很小的正数);还可以判断相邻3点组成的三角形的面积是否为0; 求多边形的面积,看你是什么情况了!分两种情况:基于矢量图的,基于位图的,两种的算法是有区别的!但是可以相互转化的。参考:http://expert.csdn.net/Expert/topic/2246/2246139.xml?temp=.5281488 MFC程序怎么封装成DLL? 初学mfc,关于那个菜单有点不懂 单线程到多线程转换 Socket问题 学VC有些迷茫了 客户端使用CAsyncSocket类;服务器端使用CAsyncSocket类侦听,使用CSocket内接收数据,这样会有什么问题呢?! 怎样不规则图形内的位图象素数目 急急!!为什么GetFileSize的到的文件大小老是为0??? 重分酬谢:谁有断点续传方面的代码 VC中如何用ADO直接连接VFP数据库? 执行程序运行时收集硬件信息,然后改写执行程序本身,防止拷贝,具体如何实现??? 一段创建客户端端口的代码,各位帮我看看有什么问题
用象素填充,计点拿一个多边形的外接矩形
象素填充,看是否落在多边形内,计算点的个数
//n是点数加1,
//x[0],y[0],x[1],y[1]...,x[n-1],y[n-1]分别是多边形按顺序排列的n个点的坐标。
x[n] = x[0];//x[n]被赋值为x[0]是便于计算,x[n]并不是一个点的横坐标
y[n] = y[0];
for(int i=0; i<n; i++)
{
dMj += x[i]*y[i+1] - x[i+1]*y[i];
}
dMj = fabs(dMj)/2;
参考一下下面的:
http://expert.csdn.net/Expert/topic/1025/1025922.xml?temp=.5344202用 xyw2278(启明星) 的方法也可以
{
int area = 0;
int i,j;
CRect rect;
CPoint* m_points;
int m_nPoints;
CImageViewDoc* pDoc = GetDocument(); m_nPoints = pDoc->m_aryRectPoint.GetSize();
m_points = new CPoint[m_nPoints];
for(i = 0; i<m_nPoints ; i++)//获得所有顶点的位置
{
m_points[i] = pDoc->m_aryRectPoint[i]->m_ptPoint;
} CRgn rgn;
rgn.CreatePolygonRgn(m_points, m_nPoints, ALTERNATE);
rgn.GetRgnBox(&rect);//获得一个包括该多边形的矩形 CPoint point;//计算矩形内的点落在多边形内的数量
for( i = rect.top ; i<rect.bottom;i++)
for( j = rect.left; j<rect.right ; j++)
{
point.x = j; point.y = i;
if(rgn.PtInRegion(point))
area ++;
} delete[] m_points; return area;
}
http://expert.csdn.net/Expert/TopicView1.asp?id=1846493
基本思想:边界跟踪得到区域边界点坐标及其方向链码;根据各点的方向码得到该点类型(左端点·右端点·尖点);逐行扫描,进行端点匹配。这样任意封闭区域面积都能算出。 以上只是介绍一种算法,对于任意多边形,则只要先获得各顶点坐标(用于构造多边形),用GetRgnBox得到一个外接矩形,逐行扫描,判断各点是否在多边形内,记下总数即为面积。
获取顶点坐标方法较多,可通过判断相邻3点的斜率;可通过线段长度来判断( if(AB+BC-AC<@) B不是顶点 //@是一个很小的正数);还可以判断相邻3点组成的三角形的面积是否为0;
http://expert.csdn.net/Expert/topic/2246/2246139.xml?temp=.5281488