多边形重心问题
时间限制:
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; }
-
第一行有一个整数0<n<11,表示有n组数据;