转帖,自己看看对不对 const MaxPointNum = 65535; type PXY = ^TXY; TXY = record // 点的数据结构 x, y: single; end; XYArray = array[0..MaxPointNum] of TXY; PXYArray = ^XYArray; // 线/面的数据结构// 积分方法求多边形/面状图形的面积 // 多边形坐标在 xys 中,点数在 nn 中 function AreaOfPolygon(xys: PXYArray; nn: integer):single; var ii:integer; ss: single; begin ss := 0; for ii := 0 to nn-2 do ss := ss + (xys^[ii].y+xys^[ii+1].y) * (xys^[ii].x-xys^[ii+1].x) / 2; result := abs(ss); end;// 判别点(x,y)是否落在多边形内 // 多边形坐标在 xys 中,点数在 nn 中 function isPtInRegion(x, y: single; xys: PXYArray; nn: integer): boolean; var ii, ncross : integer; yt, x0, y0, x1, y1, x2, y2 : single; begin ncross := 0; x0 := x; y0 := y; for ii := 0 to nn-2 do begin x1 := xys^[ii].X; y1 := xys^[ii].Y; x2 := xys^[ii+1].X; y2 := xys^[ii+1].Y; if((x0>=x1) and (x0=x2) and (x00) and ((ncross mod 2) = 1)) then Result := True else Result := FALSE; end;
这里给您一个十分简洁的伪代码: var s:Real; i,N:Integer; //假设N是多边形顶点数,(x[0],y[0]),...,(x[N-1],y[N-1])是顶点坐标 s:=0; for i:=0 to N-1 do s:=s+x[i]*y[(i+N-1)mod N]-x[(i+N-1)mod N]*y[i]; 得到的s的绝对值就是面积。在学术期刊网上搜索下面论文 "图像不变矩的轮廓链快速算法" 华中科技大学学报(自然科学版) 2003年01期 能得到更详细解释。祝您好运!
你查查几何书吧, 解析几何中有的, 知道每个顶点的坐标当然能划分了, 可以任意划分
const MaxPointNum = 65535;
type
PXY = ^TXY;
TXY = record // 点的数据结构
x, y: single;
end;
XYArray = array[0..MaxPointNum] of TXY;
PXYArray = ^XYArray; // 线/面的数据结构// 积分方法求多边形/面状图形的面积
// 多边形坐标在 xys 中,点数在 nn 中
function AreaOfPolygon(xys: PXYArray; nn: integer):single;
var ii:integer;
ss: single;
begin
ss := 0;
for ii := 0 to nn-2 do
ss := ss + (xys^[ii].y+xys^[ii+1].y) * (xys^[ii].x-xys^[ii+1].x) / 2;
result := abs(ss);
end;// 判别点(x,y)是否落在多边形内
// 多边形坐标在 xys 中,点数在 nn 中
function isPtInRegion(x, y: single; xys: PXYArray; nn: integer): boolean;
var ii, ncross : integer;
yt, x0, y0, x1, y1, x2, y2 : single;
begin
ncross := 0;
x0 := x; y0 := y;
for ii := 0 to nn-2 do begin
x1 := xys^[ii].X; y1 := xys^[ii].Y;
x2 := xys^[ii+1].X; y2 := xys^[ii+1].Y;
if((x0>=x1) and (x0=x2) and (x00) and ((ncross mod 2) = 1)) then Result := True
else Result := FALSE;
end;
并不是所有的问题都必须要等到别人把代码写出来的, 可能楼主是没有思路, 给他个思路, 让他开阔一下思路, 也不是所有的人都有太多的代码, 也不是每个人都有太多的时间写代码. 什么叫废话? 像你那样JJWW/GGLL的说了半天才算是废话, 没功夫和你斗嘴我的格言: ★真诚每一天◆快乐每一天★
var s:Real; i,N:Integer;
//假设N是多边形顶点数,(x[0],y[0]),...,(x[N-1],y[N-1])是顶点坐标
s:=0;
for i:=0 to N-1 do
s:=s+x[i]*y[(i+N-1)mod N]-x[(i+N-1)mod N]*y[i];
得到的s的绝对值就是面积。在学术期刊网上搜索下面论文
"图像不变矩的轮廓链快速算法" 华中科技大学学报(自然科学版) 2003年01期
能得到更详细解释。祝您好运!
方法1:
用这个方法吧:
我们都知道已知A(x1,y1)B(x2,y2)C(x3,y3)三点的面积公式为
|x1 x2 x3|
S(A,B,C) = |y1 y2 y3| * 0.5 (当三点为逆时针时为正,顺时针则为负的)
|1 1 1 |对多边形A1A2A3、、、An(顺或逆时针都可以),设平面上有任意的一点P,则有:
S(A1,A2,A3,、、、,An)
= abs(S(P,A1,A2) + S(P,A2,A3)+、、、+S(P,An,A1))P是可以取任意的一点,用(0,0)就可以了。
还有一个方法:
任意一个简单多边形,当它的各个顶点位于网格的结点上时,它的面积数S=b/2+c+1
其中:b代表该多边形边界上的网络结点数目
c代表该多边形内的网络结点数目所以把整个图形以象素为单位可以把整个图形分成若干个部分,计算该图形边界上的点b和内部的点c就得到面积数S了,然后把S乘以一个象素的面积就是所求的面积了。
多边形面积的计算公式如下:设有n个点(x[1],y[1])(x[2],y[2]),...(x[n],y[n])围成一个没有边相交的多边形,则其围成的闭合多边形面积|S| 为:S=∑y[i] *(x[i+1]-x[i-1]), 其中i=1,2,...n,且当i与j除以n的余数相同的时候,x[i]=x[j],y[i]=y[j]。该公式用于凸凹多边形均可。
方法2:
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;
}