hdu 1115 计算机几何 多边形重心

说白了,题目就是给我们n个点,要求我们对这n个点围成的多边形求其重心,说实话一开始都没有接触过计算几何的东西,有些东西不理解啊..~~

当质量其中的顶点上的时候,设其顶点的质量为m

则对于n各点而言,n个点的重心为:

Focusx=∑( xi*mi ) / ∑mi;

Focusy=∑( yi*mi ) / ∑mi ;i0n

当这其中的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  

 

posted @ 2012-09-01 21:41  诺小J  阅读(183)  评论(0编辑  收藏  举报