hdu 1115 计算机几何 多边形重心
说白了,题目就是给我们n个点,要求我们对这n个点围成的多边形求其重心,说实话一开始都没有接触过计算几何的东西,有些东西不理解啊..~~
当质量其中的顶点上的时候,设其顶点的质量为m
则对于n各点而言,n个点的重心为:
Focusx=∑( xi*mi ) / ∑mi;
Focusy=∑( yi*mi ) / ∑mi ;i从0到n
当这其中的n个点的质量平均的时候,那么
Focusx=∑xi/ n;
Focusy=∑yi / n ;
对于三角形而言,给你三个坐标点,重心的坐标就是三个坐标点之和除3。
那么这个题目如果按照对n个点求和除n的话,精度太低,所以会wa,这是我最初的想法,悲催~~
正确的思路应该是将这n个点分解成n-2个三角形求其重心。
代码如下:
View Code
1 #include<iostream> 2 #include<stdio.h> 3 using namespace std; 4 double function(double x1,double y1,double x2,double y2,double x3,double y3) 5 { 6 return (x2-x1)*(y3-y1)-(y2-y1)*(x3-x1);//求面积,实际上这个是两个这样的三角形组成的四边形的面积,但因为这儿只要求得到一个比例,所以少一个二分之一没问题。叉乘如果不知道的话,上网查查吧。。 我当时也蛋痛了,自己画个直角坐标系,应该很容易懂的。。 7 } 8 int main() 9 { 10 int t,n; 11 double x1,x2,x3,y1,y2,y3,area,sumarea,focusx,focusy; 12 scanf("%d",&t); 13 while(t--) 14 { 15 sumarea=focusx=focusy=0.0; 16 scanf("%d",&n); 17 scanf("%lf%lf",&x1,&y1); 18 scanf("%lf%lf",&x2,&y2); 19 for(int i=2;i<n;i++) 20 { 21 scanf("%lf%lf",&x3,&y3); 22 area=function(x1,y1,x2,y2,x3,y3); 23 sumarea+=area; 24 focusx+=(x1+x2+x3)*area; 25 focusy+=(y1+y2+y3)*area; 26 x2=x3,y2=y3; 27 } 28 printf("%.2lf %.2lf\n",focusx/(sumarea*3),focusy/(sumarea*3)); 29 } 30 return 0; 31 } 32