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¦ + .... + ¦
;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毫秒