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

mac2022-06-30  19

说白了,题目就是给我们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  

 

转载于:https://www.cnblogs.com/nuoyan2010/archive/2012/09/01/2667097.html

最新回复(0)