下面是一段任意多边形的代码,请问面积如何求?(100分)

  • 主题发起人 主题发起人 mymy
  • 开始时间 开始时间
M

mymy

Unregistered / Unconfirmed
GUEST, unregistred user!
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
i,area:integer;
begin
area:=0;
if _end=false then
begin
if button=mbleft then//是否是鼠标左键按下
begin
SetLength(headpoint,pointcount);//动态分配数组的大小
headpoint[pointcount-1]:=point(x,y);
if pointcount=1 then //移动画笔的初始点
Canvas.MoveTo(headpoint[0].x,headpoint[0].y)
else
Canvas.MoveTo(headpoint[pointcount-2].x,headpoint[pointcount-2].y);
Canvas.Pen.Color:=clred;//画笔颜色
Canvas.LineTo(x,y); //绘制直线
inc(pointcount); //增加顶点个数
end
else begin //右键按下
headpoint[pointcount]:=headpoint[0];//形成封闭的多边形
Canvas.Polyline(headpoint);//绘制边线
Canvas.Polygon(headpoint); //填充多边形
_end:=true;//停止绘制
end;
end;
end;
// pointcount是顶点的个数,headpoint:array of Tpoint;

 
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1268352
 
请高手关注一下我的问题
 
扫描每一行,将每一行的点数加起来!!
 
楼上的,能否具体点
 
哪位高手,可以帮一下小弟?
 
第1,2,3; 1,3,4; ....; 1,n-1,n 个顶点组成了n-2个三角形,
利用三角形面积公式将n-2个三角形面积相加就可以了.
 
to DarwinZhang,
我觉得这个方法有点行不通,我的多边形是随意画的,如果是凹的,就不是都相加的了。
还有任意三角形的面积不知道高,怎么算?
 
在图形学里面凹多边形一向是比较复杂的问题。
倒是那个数点数的方法蛮有意思的,虽然误差很大[:)]
就是一行一行的scan Canvas.Pixels[x,y],根据点的颜色确定它是否属于这个多边形,加以计数。
 
利用积分的原理,小时候学的数学不是告诉我们么,把你的整个图形放在xy坐标的
x>0 y>0里面,然后根据你的每条线,来把x分成很小,也就是dx啦,y*dx就是这个
小矩形的面积,相加,ok.当然实际会复杂点,
 
请各位帮我看一下这样算对不对.
var
ss:single;
i:integer;
begin
ss:=0 ;
for i:=0 to pointcount-2 do
begin
ss:=ss+(headpoint[i+1].y+headpoint.y)*(headpoint[i+1].x-headpoint.x)/2;
ss:=abs(ss);
end;



 
好想不大对噢。我看到有段代码,
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;
但我不知道在我的多边形的代码中,xys用什么来代替。

有了答案我回再送分的
 
凹多边形中有些三角形的面积是负数,求三角形的公式我忘记了,回家再找找看。
 
数点数的可倒是可以,就是得判断点是否在多变形内,复杂程度比较高。
参考http://www.delphibbs.com/delphibbs/dispq.asp?lid=1277180
要提高精度可以令在边界上的点取半点的办法,但不见得能有多少提高。
 
求个多边形面积不算什么,
我做个求任意点组成不规则图形面积(如:任意地图面积),这个问题把一个计算机研究生
折腾了3个月没有解决,我一个星期就敲定了,可我什么都不是。
有兴趣联系:
liyunhong2002@yahoo.com.cn
 
To LiGen,
不知你的不规则图形是如何描述的?我想不外乎两种:以函数
来描述边界,或者是以多边形拟合。如果是函数描述边界,则
通过积分可计算(如果函数可以积分的话);如果是多边形拟
合,则和上面楼主碰到的其实是一类问题。

在离散化的情况下求面积确实是很简单的。
DarwinZhang所说的判断点是否在多边形内的问题其实可以回避。
因为看源代码可知这个多边形是填充了的。如果小心选择填充颜
色使之没有歧义,我们只需计算所有这种颜色点的数目即可。

如果是按照图形学里的方法,在连续的意义下求面积就比较麻烦
了,恐怕只能分解成三角形来做。期待DarwinZhang的凹多边形
面积求法,因为我不知道 [:)]
 
气死了,搞了2小时,原来的简单求法推不出来,只好拿那个初中生的公式来了。

type
TPoints=Array of Record //改成TPoints=Array of TPoint就可以用,请重新定义var headpoint:TPoints
X,Y:Double;
end;

function GetTrgArea(const x1,y1,x2,y2,x3,y3:Double):Double; //三角形面积
var
a,b,c,CosV:Double;
begin
a:=Sqrt(Sqr(x1-x2)+Sqr(y1-y2));
b:=Sqrt(Sqr(x1-x3)+Sqr(y1-y3));
c:=Sqrt(Sqr(x2-x3)+Sqr(y2-y3));
if (a=0)or(b=0) then begin Result:=0; exit; end;
CosV:=(sqr(a)+Sqr(b)-Sqr(c))/2/a/b;
Result:=a*b*Sqrt(1-Sqr(CosV))/2;
end;
function GetSign(const x1,y1,x2,y2,x3,y3:Double):Double; //用顺时针判断正负
var
dx1,dx2,dy1,dy2:Double;
begin
dx1:=x2-x1; dy1:=y2-y1;
dx2:=x3-x1; dy2:=y3-y1;
if dx1*dy2-dx2*dy1>0
then Result:=-1
else Result:=1;
end;

function GetRgnArea(Points:TPoints):Double;
var
s:Double;
i:Integer;
begin
s:=0;
for i:=1 to High(Points)-1 do
s:=s +GetTrgArea(Points[0].X,Points[0].Y,
Points.X,Points.Y,
Points[i+1].X,Points[i+1].Y )
*GetSign(Points[0].X,Points[0].Y,
Points.X,Points.Y,
Points[i+1].X,Points[i+1].Y);
Result:=Abs(S);
end;

用GetRgnArea求面积。还好,效率还说得过去。
 
to DarwinZhang
谢谢你的代码,非常感谢。我会另给分。
但还有点问题,就像我如果画了类似这样的图形 X(两个对顶的三角,不知我的描述
对不对),得出的面积很小,好像是两三角形的面积差。
 
后退
顶部