| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2543 人关注过本帖, 2 人收藏
标题:数学渣渣,不晓得怎么处理很多个点,以知坐标求面积,看到题目就晕了,
只看楼主 加入收藏
domoke
Rank: 2
等 级:论坛游民
帖 子:36
专家分:71
注 册:2013-9-11
收藏
得分:0 
回复 16楼 pangshch
x = (int *)malloc((p+1) * sizeof *x);     
y = (int *)malloc((p+1) * sizeof *y);

大神,求教这两条语句是怎样实现将第一个点复制到最后的。
刚才百度了一下malloc,大概明白是什么意思,但是一般在什么情况下应用呢?
2013-11-20 16:38
qunxingw
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:贵宾
威 望:24
帖 子:1676
专家分:7295
注 册:2011-6-30
收藏
得分:0 
如果凹多边形,相同点位围成的区域不是唯一的。如三个点组成的三角形区域内再加一点,则可组成三个不同的凹四边形。

www.qunxingw.wang
2013-11-20 16:44
pangshch
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:2
帖 子:443
专家分:1966
注 册:2013-4-9
收藏
得分:0 
回复 21楼 domoke
那两句只是分配内存, 我是说,分配的内存要比你输入的点的个数要多一个, 用多的那个保存第一个点.
x[i] = x[0];                    // 复制第一个点
y[i] = y[0];
这里才是复制.
大神是版主,

2013-11-20 17:01
pangshch
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:2
帖 子:443
专家分:1966
注 册:2013-4-9
收藏
得分:0 
回复 20楼 beyondyf
版主, 你这是要我把线性代数给学了吗?
我现在只知道那个公式是用二维向量组的行列式展开得到的.

可是我只知其一, 不知其二, 我知道它展开可以得到, 为什么这么算, 我就不知道了.

好吧, 我看书去了, 那分....不用等我了.
2013-11-20 17:31
confused_01
Rank: 2
等 级:论坛游民
帖 子:12
专家分:25
注 册:2013-11-7
收藏
得分:0 
回复 20楼 beyondyf
这个好证明。
不太好画图,就简单说一下
先证明三角形的面积公式。
可以想象的出,任意一个三角形的面积,总可以用一个直角梯形(或矩形)和两个直角三角形面积的和差来表示。
那么利用这一点,然后化简面积差 会得到
三角形三顶点坐标分别为A(x1,y1),B(x2,y2),C(x3,y3),那么这个三角形的面积为
S=1/2(x1y2+x2y3+x3y1-y3x1-y1x2-y1x3)/2

然后对于任意的多边形,在它的内部任取一点O,那么它的面积就是A1A2O + A2A3O+ A3A4O+ ...
然后就是那个公式了
2013-11-20 18:06
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
以下是引用beyondyf在2013-11-18 21:00:22的发言:

差点忘了这个贴子。怎么?没人做的出来么?还是嫌分少?

这个题目不难,而且实用性很高,大量的应用中需要计算多边形的面积。

如果我再悬赏100专家分能不能激发大家的兴趣呢?
   我就知道把一个多边形分解成N个三角形 然后用海伦公式计算多边形面积  
   还有其他方式吗

DO IT YOURSELF !
2013-11-22 10:04
mskeheng
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:48
专家分:179
注 册:2013-3-13
收藏
得分:0 
图片附件: 游客没有浏览图片的权限,请 登录注册
虽然应经结贴了,我还是来凑下热闹
数学上对于n个点(x1,y1),(x2,y2),,,,,,(xn,yn)它的面积是这样计算的S=1/2*(x1*y2-x2*y1)+1/2*(x2*y3-x3*y2)+1/2*(x3*y4-x4*y3)+……+1/2*(xn-1*yn-xn*yn-1)+1/2*(xn*y1-x1
程序代码:
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
typedef struct ///////////存放点的坐标
{
    double x;
    double y;
}dot;
double cal_area(dot  *a,int n)////////由n个点计算面积/////////
{
    int i;
    double result=0;
    for(i=0;i<n-1;i++)
        result+=a[i].x*a[i+1].y-a[i+1].x*a[i].y;
    result+=a[n-1].x*a[0].y-a[0].x*a[n-1].y;
    return fabs(result/2);
}
int main()
{
    int i,n;
    dot *a;
    printf("请输入点个数");
    scanf("%d",&n);
    a=(dot*)malloc(sizeof(dot)*n);
    printf("请输入坐标\n");
    for(i=0;i<n;++i)
        scanf("%lf%lf",&a[i].x,&a[i].y);
    printf("%lf\n",cal_area(a,n));
    free(a);
    return 0;
}


*yn);
代码如下:

2013-11-22 15:36
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:0 


[fly]存在即是合理[/fly]
2013-11-22 23:52
czz5242199
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:4
帖 子:660
专家分:2400
注 册:2011-10-26
收藏
得分:0 
首先两个向量n1(x1,y1),n2(x2,y2)组成的三角形面积为他们的叉积的1/2的绝对值:1/2*abs(x1y2-x2y1) ,其中取绝对值之前的正负有两个向量的相对位置决定 (这个在计算机中的计算几何中属于基本公式之一,证明也不难)

然后对于有n个点的多边形,有两种情况:

1、如果包含了原点,比如图中4个顶点,就划分为4个三角形,由于顶点是按照顺时针或者逆时针顺序的,所以所有(xk*yk+1-xk+1*yk)都是同正负,所以1/2*SUM(xk*yk+1-xk+1*yk)最后取绝对值就是整个面积。
图片附件: 游客没有浏览图片的权限,请 登录注册


2、如果不包含原点,如图。
由于C在A的右边,B在C的右边,所以对ACB三个点计算之后得出的答案是负数,即代表了OACB面积的负数,而D在B,E在D,A在E的左边,所以对B,D,E,A计算后得到的是OAEDB的面积的正数,相加之后就是整个面积了。当然也有可能前面一步得到的是面积的正值,后一步得到负值,相加之后还要取一次绝对值。
图片附件: 游客没有浏览图片的权限,请 登录注册


两种不同情况的区别就在于第一种情况不会涉及到向量相对位置的变化,而后一种会涉及到。所以前一种情况所有数都是同正负,加起来取绝对值就得到了面积。后一种情况加起来刚好是两个面积相减,取绝对值之后也是多边形的面积。

同时由以上证明过程可以看出:
1、这个算法可以适用于凹多边形。如果用将多边形分解成多个三角形的方法只适用于凸多边形。
2、顶点输入一定要有序,如果无序的话需要自己预先处理。
2013-11-23 16:51
柚子123
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2013-5-3
收藏
得分:0 
新手呵呵了
2013-11-24 21:54
快速回复:数学渣渣,不晓得怎么处理很多个点,以知坐标求面积,看到题目就晕了, ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.020632 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved