吕
吕雪松
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)ouble;
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;
/////////////////////////////////////////////////////////
//参数: 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)ouble;
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;