zoukankan      html  css  js  c++  java
  • 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  
  • 相关阅读:
    binary and out mode to open a file
    ADV7482&TP2825开发之总结
    C++ 操作符重载
    OpenCV学习(一)基础篇
    Linux设备驱动程序 第三版 读书笔记(一)
    My First Linux Module
    Bitmap每个像素值由指定的掩码决定
    C++ File Binary
    Bitmap RGB24 4字节对齐
    查看binlog的简单方法!
  • 原文地址:https://www.cnblogs.com/nuoyan2010/p/2667097.html
Copyright © 2011-2022 走看看