您的位置:首页 > 其它

南阳理工-3-多边形重心问题

2013-08-12 22:11 183 查看

多边形重心问题

时间限制:3000 ms | 内存限制:65535 KB

难度:5

描述 在某个多边形上,取n个点,这n个点顺序给出,按照给出顺序将相邻的点用直线连接, (第一个和最后一个连接),所有线段不和其他线段相交,但是可以重合,可得到一个多边形或一条线段或一个多边形和一个线段的连接后的图形;

如果是一条线段,我们定义面积为0,重心坐标为(0,0).现在求给出的点集组成的图形的面积和重心横纵坐标的和;

输入第一行有一个整数0<n<11,表示有n组数据;

每组数据第一行有一个整数m<10000,表示有这个多边形有m个顶点;输出输出每个多边形的面积、重心横纵坐标的和,小数点后保留三位;样例输入
3
3
0 1
0 2
0 3
3
1 1
0 0
0 1
4
1 1
0 0
0 0.5
0 1

样例输出
0.000 0.000
0.500 1.000
0.500 1.000


žArea(A,B,C)= 1/2 * (↑AB) × (↑AC)                         =∣           ∣/2 特别注意:           以上得到是有向面积(有正负)


1:将有n个顶点的多边形以其中一个顶点划分成n-2个三角形


2:利用三角形的叉积求面积公式求得每个划分三角形的面积,同时与该三角形重心相乘


3:将2步骤所得的积数相加;


4:将3所得结果除以多边形面积总和可得多边形重心


#include<stdio.h>
#include<stdlib.h>
double si(double *x,double *y,int i){
return ((x[i+1]-x[1])*(y[i+2]-y[1])-(x[i+2]-x[1])*(y[i+1]-y[1]))/2;
}
int main()
{
int n,m,i;
double *x,*y,sum,GSx,GSy,t;
scanf("%d",&n);
while(n--){
scanf("%d",&m);
x=(double*)malloc((m+1)*sizeof(double));
y=(double*)malloc((m+1)*sizeof(double));
sum=0;//存储多边形的面积
GSx=0;
GSy=0;//统计每个划分三角形的面积与重心的总和
for(i=1;i<=m;i++)
{
scanf("%lf %lf",&x[i],&y[i]);
//printf("%.3f %.3f\n",x[i],y[i]);
}//for
for(i=1;i<=m-2;i++)
{
//printf("%.3f %.3f %.3f %.3f %.3f %.3f %.3f %.3f\n",x[i+1],x[1],y[i+2],y[1],x[i+2],x[1],y[i+1],y[1]);
t=((x[i+1]-x[1])*(y[i+2]-y[1])-(x[i+2]-x[1])*(y[i+1]-y[1]))/2;
GSx+=(x[1]+x[i+1]+x[i+2])/3*t;
GSy+=(y[1]+y[i+1]+y[i+2])/3*t;
sum+=t;
//printf("%.3f ",t);
}
if(sum==0)
printf("0.000 0.000\n");
else
printf("%.3f %.3f\n",-1*sum,(GSx+GSy)/sum);
}//while
//system("pause");
return 0;
}

[/code]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: