小女子急得焦头烂额,请各位高手进来看一眼(200分)

  • 主题发起人 主题发起人 xiya
  • 开始时间 开始时间
X

xiya

Unregistered / Unconfirmed
GUEST, unregistred user!
小女子本身是学经济的,对编程是一窍不通[:(] ,但是变态老师却给我一个编delphi
应用程序任务,我不幸拿到了 《计算任意多边形的面积 》这么一道题,惭愧的是数学都已
经好久不学了,所以敬请各位大哥高手帮忙。题目要求如下:
1,计算任意多边形的面积
2,并画出相应的图
3,一定要面向对象!要有封装,继承,多态性,,等
这个project 对我来说时间很短,又很重要,最晚要18号完成!
哪位高手愿意帮忙,感激不尽,支付费用不是问题。
我的信箱 : xiexiao0049@hotmail.com
 
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-2do
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-2do
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;

这里有你要的程序:http://www.easthot.net/default.asp
 
关注此题
 
真是有奇事,有奇人!
 
是等边多边形吗,不可能是不等边或任意的吧?那样的话难度可就大了
 
dawnsoft 的方法真简单,构思巧妙
 
因为是任意多边形,所以积分法是比较合适的.比如分割成三角形等,在比如凹字形状的多变形就受局限了
 
老大 你们老师是变态吗 ?? [:)]
 
哈哈,这个忙我愿意帮,把详细的题目要求发到我的邮箱里,我来看看。
地址是:m820126@163.com
 
英雄救妹妹
 
你们老师的脑子是不是进水了?
 
我很想救你,但我水平有限。呵呵
 
看到有这么多大哥这么热心的帮忙,真的是感动啊。。。
我都说了,老师是变态,我学经济的,数学都已经很久不学了,别说编程序了。。。
 
对了,忘了说了,要以边长为变量的
 
先别说老师变态,最要紧的是你理解老师的意图吗?
是为你好还是给你小鞋穿,不同的意图有不同的应对方法。
 
//主函数: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;
 
这个题目如果用上面那位朋友的解答, 那仅仅用了两个函数,[:D]
不知如何做到面向对象, 且体现封装, 继承, 多态...[:(]
 
是不是重点在画图...[:(!]
 
不能为了 面向对象而面向对象吧?
 
画图是一定要的,但重点应该在面向对象编程这一点上
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
后退
顶部