计算任意边数的不规则多边形面积的函数,供收藏 (0分)

  • 主题发起人 主题发起人 吕雪松
  • 开始时间 开始时间

吕雪松

Unregistered / Unconfirmed
GUEST, unregistred user!
//主函数:GetPolygonArea,其它几个函数和结构是子函数
/////////////////////////////////////////////////////////
//参数: Points -- 点的链表 TGeoPoint类型的指针(参见TGeoPoint结构)
// GeoRect-- 整个多边形的最大,最小的坐标值(包络矩形,参见TGeoRect结构)
//返回值:多边形的面积,double类型
//////////////////////////////////////////////////////////
function GetPolygonArea(Points : TList;GeoRect : TGeoRect) :do
uble;
var
I : integer;
Pt1,Pt2 : TGeoPoint;
Angle :do
uble;
Area :do
uble;
begin

Area := 0;
for I := 0 to Points.Count - 2do
begin

Pt1 := PGeoPoint(Points.Items)^;
Pt2 := PGeoPoint(Points.Items[I + 1])^;
//得到弧度(1-4象限)
Angle := GetDirection(Pt1.X,Pt2.Y,Pt2.X,Pt2.Y);
Area := Area + Abs(Abs(Pt1.y - GeoRect.Top) + Abs(Pt2.Y - GeoRect.Top)*(Pt1.x - Pt2.x)/2);
end;

result := Abs(Area);
end;


///////////////////////////////////////////////////
// 计算点X1,Y1到点NX,NY的角度,返回值为弧度
//////////////////////////////////////////////////
function GetDirection(X1,Y1,NX,NY :do
uble):Double;
var
BufLen,Direction :do
uble;
begin

BufLen := Sqrt(Sqr(X1-NX)+Sqr(Y1-NY));
if (Abs(NX-X1)< 10e-300) then
begin

if (Abs(Y1-NX)< 10e-300) then
begin

//等于没有移动}
end
else
begin

if (Y1-NY)>0 then
Direction := PI/2
else
Direction := 3*PI/2;
end;

end
else
begin

if ArcTan((Y1-NY)/(NX-X1))>0 then
begin

if (Sin((Y1-NY)/BufLen)>0) then

Direction := ArcTan((Y1-NY)/(NX-X1))
else

Direction := ArcTan((Y1-NY)/(NX-X1))+PI;
end
else
begin

if (Sin((Y1-NY)/BufLen)>0) then

Direction := ArcTan((Y1-NY)/(NX-X1))+PI
else

Direction := ArcTan((Y1-NY)/(NX-X1));
end;

end;

Result := Direction;
end;



/////////////////////////////////////////
TGeoRect = record
case Integer of
0 : (Left, Top, Right, Bottom :do
uble);
1 : (TopLeft,BottomRight : TGeoPoint)
end;



/////////////////////////////////////////
TGeoPoint = record
X,Y :do
uble;
end;

 
是凹多边形时,以上算法似乎有问题
http://www.truevcl.com
 
这个函数到底应该怎么用,有人用过吗?怎么做!
 
函数只对凸边形有效,对于凹变形等复杂的复合图形失效。
 
算出来的结果不对呀,大了!
 
我的产品中有计算多边形面积的算法,大家可以一试,不过没有源代码,抱歉.
http://www.chinadicom.com/html/tdicomcad.html
 
用我这个公式看看:
N-1
1/2 ∑ [Y(i+1)+Y(i)]*[X(i+1)-X(i)]-1/2[Y(N)+Y(1)]*[X(N)-X(1)]
i=1
其中X(i),Y(i)为第i个点的坐标,N为多边形的结点数。
 
我算得的结果也不正确,三角形正确,但简单的一个平行四边和矩形的面积都不正确
 
惭愧!居然把错误的程序到处散布,我会及时修改,谢谢大家。
先请大家注意:不要用上面的程序,待修改完成后,我再标注清楚。

(魅力指数直线下降!)
 

http://homepages.borland.com/efg2lab/Graphics/PolygonArea.ZIP
 
还是照传统的用扫描积分做比较好
 
后退
顶部