现有坐标一堆,首尾相连的坐标文本一个,要计算出这个坐标区域的面积。希望能得到各位的帮助。
能有一个完整的算法就好了。
能有一个完整的算法就好了。
解决方案 »
- 请问事务上该如何解决sql多进程update时的lock问题
- “/网上订餐xin”应用程序中的服务器错误。用户 '2C18\ASPNET' 登录失败。原因
- Duwamish效率质疑(或说Web控件的效率质疑)
- 一个问题,我解决不了了,希望大腕进来看看,小M这厢有礼了。
- SQL Server中Image类型字段的数据存储,谢谢!!!
- winform中如何实现在调用用户控件Button时,更改buttion的背景和字体?
- WPF,这个属性怎么重写?
- 能帮我把这一小段VB代码转换成c#吗?我改了,可是不知道哪里错了。谢谢
- C#中类之间如何进行通信?
- 求救!!!读写ini文件出错。
- winform如何关闭隐藏窗体
- 如何把image存在Dataset中
J002,1,3260209.997,38419967.610
J003,1,3260213.022,38419976.208
J004,1,3260228.200,38419989.232
J005,1,3260246.108,38419999.082
J006,1,3260258.634,38420015.190
J007,1,3260274.274,38420027.676
J008,1,3260289.569,38420040.565
·······
SABCDE = SABC+SACDE至于一个三角型ABC的面积,矢量AB叉乘矢量BC得到,叉乘的公式可以上网去搜一下,这就将复杂度为n的问题转换为了复杂度为n-1的问题。从这个思路出发,相信楼主应该很容易解决这个问题吧,不过需要考虑的是,我上面这个算法只适用于凸多边形,凹多边形和有交叉的多边形不成立,需要分类讨论,比较复杂。
{
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
判断外凸或内凹比较复杂,一种解决方法是先计算从起点经过折线转一圈回来的角度是顺时针还是逆时针,从而知道对于每条边来说,哪一侧构成其围面积的有效侧,如果两相邻边在其围面积的有效侧成角大于180度,则构成这两条边的三个点所围三角形为凹,否则为凸。以上原理配合着向量计算三角形面积(不懂的话google下很方便的),应该不难解决问题。
/// 多边形面积计算(不论凸凹)
/// </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;
}
上面用凸凹多边形分别试了,正确!嘎嘎!
/// 计算多边形面积,应该取绝对值.顺时针时结果为负,反之为正
/// </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);
}
这样也是可以得出正确结果的.针对所有类型多边型.
clxcxx的算法是正确的?看起来不像啊,能不能解释下?