南阳理工-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]
相关文章推荐
- 南阳理工:多边形重心问题
- 南阳理工 题目3:多边形重心问题(计算几何,求多边形面积+重心)
- 多边形重心问题
- NYOJ多边形重心问题
- 谁能告诉我为什么sum_area输出总是0(多边形重心问题)
- nyistOJ-多边形重心问题(数学题)
- NYOJ3——多边形重心问题
- 多边形重心问题
- nyoj--3-多边形重心问题(计算几何)
- 多边形重心问题 NYOJ 3 思路+代码
- NYOJ 3 多边形重心问题
- nyoj 3 多边形重心问题
- 多边形重心问题
- 多边形重心问题
- 多边形面积和重心问题
- nyoj 3 多边形重心问题
- 多边形重心问题_nyoj_3(计算几何).java
- NYOJ 题目3多边形重心问题(数学几何)
- 3 多边形重心问题(未完成)
- 多边形重心问题