Algorithm 版 (精华区)

发信人: Lerry (想不开·撞树), 信区: Algorithm
标  题: [合集]怎样快速准确地计算不规则封闭区域的面积
发信站: 哈工大紫丁香 (2002年07月26日23:36:21 星期五), 站内信件


────────────────────────────────────────
 Lerry (想不开·撞树)                 于 2002年07月20日09:26:11 星期六 说道:

主  题:  面积计算——怎样快速准确地计算不规则封闭区域的面积??
作  者:  lan_lan (lanlan)
等  级:
信 誉 值:  100
所属论坛:  数据算法
问题点数:  80
回复次数:  11
发表时间:  2001-8-15 11:22:16
比如说建筑物面积。
 回复人: windindance(风舞轻扬) (  ) 信誉:96  2001-8-15 11:57:30  得分:10
  我知道一种笨方法:
填充点,数点数。
Top
 回复人: tarkey(天星) (  ) 信誉:100  2001-8-15 12:09:49  得分:10
  有一种比较复杂的办法,
在每两两条夹角小于90度的直线之间做一条直线,计算三角型,计算到最后就是一个近
圆型的
一块地方了。
Top
 回复人: frman(自由无限) (  ) 信誉:100  2001-8-15 12:51:16  得分:40
  看看下面这个帖子
http://www.csdn.net/expert/Topic/214/214316.shtm
Top
 回复人: one_add_one()快给分给分_L2002:) (  ) 信誉:105  2001-8-15 14:25:4
8  得分:0
  为了方便你,我决定帮你把上面的帖子转贴过来:
1/2*¦( ¦x0 y0¦ + ¦x1 y1¦ + .... + &brvbar
;xn yn¦ )¦
  ¦ ¦x1 y1¦  ¦x2 y2¦      &brvb
ar;x0 y0¦  ¦
回复人: Arter() (2001-7-29 18:46:00)  得0分
1.把(xi,yi)按逆时针排好。(i=1,2,3,....n, x(n+1)=x1);
2.计算它的有向面积:
  (1)先看:(0,0),(xj,yj),(xk,yk)三点的面积S=
¦  0  0  1  ¦
¦  xj yj 1  ¦*(1/2) =(xj*yk-yj*xk)/2
¦  xk yk 1  ¦
  (2)多边形面积可以划分为三角形面积的和:
      S[(0,0),(x1,y1),(x2,y2)]+S[(0,0),(x2,y2),(x3,y3)]+...
    + S[(0,0),(x(n-1),y(n-1),(xn,yn)]+S[(0,0),(xn,yn),(x1,y1)]
    =((x1*y2-x2*y1)+(x2*y3-x3*y2)+...+(x(n-1)*yn-xn*y(n-1))+(xn*y1-x1*yn))/2
    =(x1*(y2-yn)+x2*(y3-y1)+x3*(y4-y2)+...+x(n-1)*(yn-y(n-2))+xn*(y1-y(n-1)
))/2
  (或:(y1*(xn-x2)+y2*(x1-x3)+y3*(x2-x4)+...+y(n-1)*(x(n-2)-xn)+yn*(x(n-1)-
x1))/2    )
回复人: starfish(海星) (2001-7-29 23:37:59)  得20分
/******************************************** *     *
*      计算多边形的面积     *
*     *
*    要求按照逆时针方向输入多边形顶点     *
*    可以是凸多边形或凹多边形     *
*     *
\********************************************/
float area_of_polygon(int vcount,float x[],float y[])
{
  int i;
  float s;
  if (vcount<3) return 0;
  s=y[0]*(x[vcount-1]-x[1]);
  for (i=1;i<vcount;i++)
    s+=y[i]*(x[(i-1)]-x[(i+1)%vcount]);
  return s/2;
  }
Top
 回复人: frman(自由无限) (  ) 信誉:100  2001-8-15 14:33:48  得分:0
  哈哈:)))
1+1,俺服了你了:))
Top
 回复人: starfish(海星) (  ) 信誉:103  2001-8-15 15:33:09  得分:10
  哎呀,今天来迟了
Top
 回复人: frman(自由无限) (  ) 信誉:100  2001-8-15 20:06:30  得分:0
  哈哈:))
海星大哥,看来你的帖子会帮我们挣很多分啊:))
Top
 回复人: lan_lan(lanlan) (  ) 信誉:100  2001-8-18 13:33:59  得分:0
  up
Top
 回复人: lan_lan(lanlan) (  ) 信誉:100  2001-8-18 13:34:14  得分:0
  up
Top
 回复人: lins(*有为青年*) (  ) 信誉:92  2001-8-18 21:29:36  得分:10
  是不是几何图形学的内容啊!!
Top
 回复人: sptbo(努力成为高手) (  ) 信誉:97  2002-1-29 21:02:08  得分:0
  积分

────────────────────────────────────────
 GREnTOFEL (Crazy Plucking)           于 2002年07月20日15:52:33 星期六 说道:

这是好东西,sino应该把他收藏起来

────────────────────────────────────────
 Lerry (想不开·撞树)                 于 2002年07月21日22:27:08 星期天 说道:

有什么好收藏的,
其实最好的方法是积分,
而且得到结果的效率最高,
最容易实现,
代码最短

────────────────────────────────────────
 GREnTOFEL (Crazy Plucking)           于 2002年07月22日07:35:47 星期一 说道:

你做一个出来让大家欣赏一下?

────────────────────────────────────────
 Lerry (想不开·撞树)                 于 2002年07月22日13:13:25 星期一 说道:

只要沿着曲线一直积分就可以了
有什么好写的

────────────────────────────────────────
 GREnTOFEL (Crazy Plucking)           于 2002年07月22日17:28:35 星期一 说道:

我给你n个点的坐标,你给我算出曲线来?
你能在一个小时内完成这个程序吗?
只要沿着曲线一直积分就可以了


────────────────────────────────────────
 fobcaesar (温泉企鹅)                 于 2002年07月22日21:06:55 星期一 说道:

对点先拟合


────────────────────────────────────────
 Lerry (想不开·撞树)                 于 2002年07月22日21:10:53 星期一 说道:

拟合得到的并不一定是原来的图形
有时候也许会相差很多,
这类问题基本上应该是首先知道了图形然后求面积

────────────────────────────────────────
 GREnTOFEL (Crazy Plucking)           于 2002年07月22日21:41:36 星期一 说道:

多边形,输入n以及n个点,多边形不一定是凸的,输入格式自定,输出
面积。

────────────────────────────────────────
 GREnTOFEL (Crazy Plucking)           于 2002年07月22日21:41:58 星期一 说道:

怎样拟和?

────────────────────────────────────────
 Lerry (想不开·撞树)                 于 2002年07月22日21:47:34 星期一 说道:

差不多计算机图形学的书上都有

────────────────────────────────────────
 Lerry (想不开·撞树)                 于 2002年07月23日20:29:39 星期二 说道:

我刚才写了一个,不到十分钟,呵呵,离你的一个小时还有一段距离
不知道符不符合你的要求,你先测试一下,不行我还有机会改
输入文件第一个数为顶点总数,其它依次是各个点的坐标(空格或者回车分隔)
可以是顺时针或着逆时针顺序的任意多边形(无内交点)
void main(void)
{
    FILE * fp=fopen("input.txt","r");
    float  s=0,x1,y1,x2,y2,i=0,mount;
    fscanf(fp,"%f %f %f",&mount,&x2,&y2);
    for(;x1=x2,y1=y2,++i!=mount;s+=(x2-x1)*(y1+y2))
        fscanf(fp,"%f %f",&x2,&y2);
    printf("Area:%f\n",s>0?s/2:-s/2);
}

────────────────────────────────────────
--
※ 修改:·Lerry 於 07月26日23:37:31 修改本文·[FROM: 天外飞仙]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:2.540毫秒