根据坐标计算面积的方法

ss7878520 2008-07-08 04:10:40
现有坐标一堆,首尾相连的坐标文本一个,要计算出这个坐标区域的面积。

希望能得到各位的帮助。
能有一个完整的算法就好了。
...全文
4099 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
aimeast 2008-07-11
  • 打赏
  • 举报
回复
用向量来做不就可以了。很简单的。

用向量的叉乘
格拉 2008-07-11
  • 打赏
  • 举报
回复
相信就用!也可以自己找几个容易计算出的不规则多边形试试,欢迎验证!
yatobiaf 2008-07-11
  • 打赏
  • 举报
回复
计算面积不应该用海伦公式,需要开根号,计算量大,应该用叉乘。
clxcxx的算法是正确的?看起来不像啊,能不能解释下?
cwb210 2008-07-10
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 gupiao175 的回复:]
帮顶了,回帖是一种美德!传说每天回帖即可获得 10 分可用分!
[/Quote]
phper530 2008-07-10
  • 打赏
  • 举报
回复
帮顶了,回帖是一种美德!传说每天回帖即可获得 10 分可用分!
hotmail_mk 2008-07-10
  • 打赏
  • 举报
回复
纯数学问题。LZ可以先去做一个通用公式出来就好办了
格拉 2008-07-10
  • 打赏
  • 举报
回复
/// <summary>
/// 多边形面积计算(不论凸凹)
/// </summary>
/// <param name="count">坐标点数</param>
/// <param name="X">坐标的横坐标集合</param>
/// <param name="Y">坐标的纵坐标集合</param>
/// <returns></returns>
private double Area(int count,double [] X,double [] Y)
{
double area;
if (count < 3)
return 0;
area= Y[0] * (X[count - 1] - X[1]);
for (int i = 1; i <count; i++)
area+= Y[i] * (X[(i - 1)] - X[(i + 1)%count]);
return area/2;
}

上面用凸凹多边形分别试了,正确!嘎嘎!
格拉 2008-07-10
  • 打赏
  • 举报
回复
上面这个算法要把起始点作为结束点才行
格拉 2008-07-10
  • 打赏
  • 举报
回复
/// <summary>
/// 计算多边形面积,应该取绝对值.顺时针时结果为负,反之为正
/// </summary>
/// <param name="count">点数</param>
/// <param name="X">代表横坐标集合</param>
/// <param name="Y">代表纵坐标集合</param>
/// <returns>返回多边形面积</returns>
private double areaDuoBianXing(int count,double[] X, double[] Y)
{
double area=0;
for (int i =0; i <count; i++)
area +=Y[i+1]*X[i] - X[i + 1]*Y[i];
return Math.Abs(area/2);
}

这样也是可以得出正确结果的.针对所有类型多边型.
metamatrix 2008-07-09
  • 打赏
  • 举报
回复
只要顺时针把所有外凸三角形面积相加,再计算内部剩余的外凸多边形(把其分成各相邻三点为顶点的三角形即可)。
判断外凸或内凹比较复杂,一种解决方法是先计算从起点经过折线转一圈回来的角度是顺时针还是逆时针,从而知道对于每条边来说,哪一侧构成其围面积的有效侧,如果两相邻边在其围面积的有效侧成角大于180度,则构成这两条边的三个点所围三角形为凹,否则为凸。

以上原理配合着向量计算三角形面积(不懂的话google下很方便的),应该不难解决问题。
ss7878520 2008-07-09
  • 打赏
  • 举报
回复
唉,要回去前翻书了。
GhostAdai 2008-07-09
  • 打赏
  • 举报
回复
把解析几何好好学一遍!
pigHead_chen 2008-07-09
  • 打赏
  • 举报
回复
我也不会,但试试这个

double area(CPoint loca[n])//数组保存定点坐标
{
double a,b,c;
double result=0;
double p;//
for(int i=2;i<n-1;i++)
{
a=sqrt((loca[i-1].x-loca[0].x)^2+(loca[i-1].y-loca[0].y)^2);//第一个边长
b=sqrt((loca[i].x-loca[i-1].x)^2+(loca[i].y-loca[i-1].y)^2);//第二个
c=sqrt((loca[i].x-loca[0].x)^2+(loca[i].y-loca[0].y)^2);//第三个
p=(a+b+c)/2;
result+=sqrt(p*(p-a)(p-b)(p-c));//海伦公式
}
return result;
}
地址:http://www.programfan.com/club/showpost.asp?id=101283&t=o
yagebu1983 2008-07-09
  • 打赏
  • 举报
回复
你把他们转换为三角形!!!
然后求三角形面积就可以了!!!(海伦公式)
yatobiaf 2008-07-09
  • 打赏
  • 举报
回复
我给楼主一点提示,用动态规划算法,

例如,有一个多边形ABCED,其面积
SABCDE = SABC+SACDE

至于一个三角型ABC的面积,矢量AB叉乘矢量BC得到,叉乘的公式可以上网去搜一下,

这就将复杂度为n的问题转换为了复杂度为n-1的问题。

从这个思路出发,相信楼主应该很容易解决这个问题吧,不过需要考虑的是,我上面这个算法只适用于凸多边形,凹多边形和有交叉的多边形不成立,需要分类讨论,比较复杂。
格拉 2008-07-09
  • 打赏
  • 举报
回复
研究下MATLAB,在那里面求解.
格拉 2008-07-09
  • 打赏
  • 举报
回复
刚把凸的面积搞定,还有凹的呢!
nodman 2008-07-09
  • 打赏
  • 举报
回复 1
很简单,别把积分想的太难
积分是一个高度抽象的东东,而具体到计算机领域,它就是一个求和的过程
因为计算机图形是离散的,积分中的dx,就是1像素

一个形状,不管这个形状有多么不规则,
他的面积就是所有形状内线段长度之和。

窗户纸捅破了,就这么简单。

你的原始坐标数字较大,可以相对化啊
选其中最小的坐标值作为原点,其他所有点减去这个最小坐标值。

然后所有线段求和就是面积,会了吗?
Feiin 2008-07-09
  • 打赏
  • 举报
回复
数学还是很重要的哈。。呵呵
Ador3 2008-07-09
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 ss7878520 的回复:]
数学很差啊,不知道怎么搞哦。
[/Quote]
数学
加载更多回复(8)

110,024

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧