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

  • 主题发起人 主题发起人 mymy
  • 开始时间 开始时间
to mymy:
是这样的,如果边是交叉的话(您的情况属于这一类),这个多边形就复杂了.
因为图形内部一会而在一条边的左边, 一会又在右边.
我没有仔细研究过这种情况.
我记得了,您的哪个代码,用的那个公式,也不能解决这种情况.
比如(0,0)(0,1)(1,0)(1,1)四点,两种方法都是0而不是0.5的面积.
因为边交叉情况太难定义那里是多变形内部了,比如:
----------
/ // / /
// / / /
// / / / /
/ / / / /
----------------
请问上面这个图形是那一部分是属于多边形呢?
 
To DarwinZhang,
对哦,计算法向量来判断正负,我怎么就没想到呢?谢谢![:D]
 
to mymy:我想到了,您看到的那段程序利用的是梯形法,即从各个顶点向X轴做垂直线,
然后利用求梯形面积,多边形面积就可算出。
我将程序改进一下:
Type TPoints=Array of TPoint;
function AreaOfPolygon(xys: TPoints):single;
var ii,nn:integer;
ss: single;
begin
nn:=Length(xys);
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) ;
result := abs(ss/2);
end;
要想求 边是交叉的多边形 得先看Windows是如何填充的,这可比较麻烦,
实际中也不怎么用(实际上我没见过),我现在也不想去深入研究。
另外,
to seraph_q: "我们只需计算所有这种颜色点的数目即可"
原因是我不清楚这个颜色是写程序的人定义还是用户定义,
如果用户定义相同的颜色,又是第二次画图形,
并且两次图形有所重叠就不好用颜色法了。
当然,这不失为一种好办法。
 
谢谢各位,先给分吧
 
我觉得利用各位的方法,是算不出任意多个点组成的闭合图形的面积的,如:一条蛇盘成
的任意图形面积或任意地图面积,我倒有一个办法,不过牵涉到数学问题,不好描述。
如果有人需要可以给我地址,我给书面材料。或等我有空了,改为一个dll让各位调用,调用
格式如下,getarea(FileName:Pchar;dx:Real):Real;
其中 FileName:任意个点组成的文本文件,一个点占一行 x,y,中间用逗号分隔。
dx:微分的dx, 计算精度。
 
我意见是已知三边三角形的面积公式s=sqrt(c*(c-a)*(c-b)*(c-c))
 
后退
顶部