您的位置:首页 > 编程语言 > C语言/C++

HDU2036 多边形面积模板

2017-08-16 19:59 369 查看
利用向量叉乘:三角形ABC面积可以利用向量  (↑AB) ×(↑AC)*(1/2)得出,对于多边形,可以随意选取多边形某一点为源点然后一次计算.对于如下:

的多边形



我们可以以P1为扇面中心,连接P1Pi就得到N-2个三角形,由于凸性,保证这些三角形全在多边形内,那么,这个凸多边形的有向面积:

     A=sigma(Ai) 
(i=1…N-2)

[cpp]
view plain
copy

print?

#include <stdio.h>  
#include <math.h>  
typedef struct node  
{  
    double x,y;  
}node;  
node s[1001];  
  
double cal(node x,node y,node z)  
{  
    return (y.x-x.x)*(z.y-x.y)-(y.y-x.y)*(z.x-x.x);  
}  
int main()  
{  
    int n,i;  
    double res;  
    while(scanf("%d",&n)&&n)  
    {  
        res=0;  
        for(i=0;i<n;i++)  
            scanf("%lf%lf",&s[i].x,&s[i].y);  
        for(i=1;i<n-1;i++)  
            res+=cal(s[0],s[i],s[i+1]);  
        printf("%.1lf\n",res/2.0);  
    }  
    return 0;  
}  

#include <stdio.h>
#include <math.h>
typedef struct node
{
double x,y;
}node;
node s[1001];

double cal(node x,node y,node z)
{
return (y.x-x.x)*(z.y-x.y)-(y.y-x.y)*(z.x-x.x);
}
int main()
{
int n,i;
double res;
while(scanf("%d",&n)&&n)
{
res=0;
for(i=0;i<n;i++)
scanf("%lf%lf",&s[i].x,&s[i].y);
for(i=1;i<n-1;i++)
res+=cal(s[0],s[i],s[i+1]);
printf("%.1lf\n",res/2.0);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  acm HDU 题解 c语言 模板