• 南阳理工 题目3:多边形重心问题(计算几何,求多边形面积+重心)


    多边形重心问题

    时间限制: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

      计算几何,求多边形重心+求多边形的面积

      多边形重心的横坐标 = 多边形每一个三角形的重心的横坐标 * 该三角形的权值(面积)/ 多边形总面积。
      多边形重心的纵坐标 = 多边形每一个三角形的重心的纵坐标 * 该三角形的权值(面积)/ 多边形总面积。

      由以上公式可求的多边形的重心。

      多边形的面积用每一个三角形的面积之和来求。

      代码:

     1 #include <stdio.h>
     2 #include <math.h>
     3 typedef struct {
     4     double x,y;
     5 }Point;
     6 double getS(Point a,Point b,Point c)    //返回三角形面积 
     7 {  
     8     return ((b.x - a.x) * (c.y - a.y) - (b.y - a.y)*(c.x - a.x))/2;  
     9 }
    10 double getPS(Point p[],int n)    //返回多边形面积。必须确保 n>=3,且多边形是凸多边形 
    11 {
    12     double sumS=0;
    13     for(int i=1;i<=n-1;i++){
    14         sumS+=getS(p[1],p[i],p[i+1]);
    15     }
    16     return sumS;
    17 }
    18 Point getPZ(Point p[],int n)    //返回多边形重心
    19 {
    20     Point z;
    21     double sumx = 0,sumy = 0;
    22     double sumS = 0;
    23     for(int i=2;i<=n-1;i++){
    24         double S = getS(p[1],p[i],p[i+1]);
    25         sumS += S;
    26         sumx += (p[1].x+p[i].x+p[i+1].x)*S;
    27         sumy += (p[1].y+p[i].y+p[i+1].y)*S;
    28     }
    29     if(sumS==0){
    30         z.x = 0,z.y = 0;
    31         return z;
    32     }
    33     z.x = sumx / (sumS );
    34     z.y = sumy / (sumS );
    35     return z;
    36 }
    37 Point p[1000001];
    38 int main()
    39 {
    40     int T;
    41     scanf("%d",&T);
    42     while(T--){
    43         int n;
    44         scanf("%d",&n);
    45         for(int i=1;i<=n;i++)
    46             scanf("%lf%lf",&p[i].x,&p[i].y);
    47         Point z = getPZ(p,n);
    48         printf("%.3lf %.3lf
    ",fabs(getPS(p,n)),(z.x+z.y)/3);
    49     }
    50     return 0;
    51 }

    Freecode : www.cnblogs.com/yym2013

  • 相关阅读:
    【构建二叉树】01根据前序和中序序列构造二叉树【Construct Binary Tree from Preorder and Inorder Traversal】
    PHP 语言需要避免的 10 大误区
    极客编程必备的五大PHP开发应用
    你听说过PHP 的面向方面编程吗?
    8个开发必备的PHP功能
    写给系统管理员的25个PHP安全实践
    PHP输出缓冲控制- Output Control 函数应用详解
    创建高安全性PHP网站的几个实用要点
    简化PHP开发的10个工具
    PHP文件下载原理
  • 原文地址:https://www.cnblogs.com/yym2013/p/3661331.html
Copyright © 2020-2023  润新知