NYOJ 3(多边形重心)

简介:   多边形重心问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:5   描述在某个多边形上,取n个点,这n个点顺序给出,按照给出顺序将相邻的点用直线连接, (第一个和最后一个连接),所有线段不和其他线段相交,但是可以重合,可得到一个多边形或一条线段或一个多边形和一个线段的连接后的图形; 如果是一条线段,我们定义面积为0,重心坐标为(0,0).

 

多边形重心问题

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

//http://www.cnblogs.com/jbelial/archive/2011/08/08/2131165.html
//实际上没必要用结构体 
#include <cstdio>
#include <cmath>
#include <cstring>
using namespace std;
const int N = 10000;
const double cmp = 1e-8;
typedef struct Node
{
    double x,y;
}Node;
double area(double x1,double y1,double x2,double y2,double x3,double y3)//有向面积 
{//判断三点是否共线:有向面积为0 
    return 1.0/2*((x2-x1)*(y3-y1)-(x3-x1)*(y2-y1));
} 
Node ch[N];
int main()
{
    int i, j, T;
    scanf( "%d" , &T);
    while(T--)
    {
        int num;//既然是多边形,则num至少为3 
        memset(ch,0,sizeof(ch));
        scanf("%d", &num);
        scanf( "%lf %lf",&ch[1].x, &ch[1].y);
        scanf( "%lf %lf",&ch[2].x, &ch[2].y);
        int i;
        double sum_x=ch[1].x,sum_y=ch[1].y,sum_area=0;
        double gx,gy;//每个三角形重心坐标 
        double  sum_1x=0, sum_1y=0;  
        for(i=3;i<=num;i++)
        { 
            sum_x=ch[1].x,sum_y=ch[1].y;//必须在for内初始化 
            scanf( "%lf %lf",&ch[i].x, &ch[i].y);
            sum_x+=ch[i].x + ch[i-1].x;
            sum_y+=ch[i].y + ch[i-1].y;
            gx=sum_x/3.0;
            gy=sum_y/3.0;
            sum_area+=area(ch[1].x,ch[1].y,ch[i].x,ch[i].y,ch[i-1].x,ch[i-1].y);
            sum_1x+=gx*area(ch[1].x,ch[1].y,ch[i].x,ch[i].y,ch[i-1].x,ch[i-1].y);//横坐标分子 
            //sum_2x+=area(ch[1].x,ch[1].y,ch[i].x,ch[i].y,ch[i-1].x,ch[i-1].y);//横坐标分母 
            sum_1y+=gy*area(ch[1].x,ch[1].y,ch[i].x,ch[i].y,ch[i-1].x,ch[i-1].y);//纵坐标分子 
            //sum_2y+=area(ch[1].x,ch[1].y,ch[i].x,ch[i].y,ch[i-1].x,ch[i-1].y);//纵坐标分母
        }
        double sum=0;
        if(sum_area!=0) 
            sum=sum_1x/sum_area+sum_1y/sum_area; 
        if(fabs(sum_area-cmp)==0)
            printf( "0.000 0.000\n");
        else
            printf("%.3lf %.3lf\n",sum_area, sum);
    }
    return 0;
}
            
            
        
    

 

目录
相关文章
|
4月前
|
C++
C++代码来计算一个点围绕另一个点旋转45度后的坐标
C++代码来计算一个点围绕另一个点旋转45度后的坐标
101 0
|
4月前
|
算法 数据建模
平面中判断点在三角形内算法(重心法)
平面中判断点在三角形内算法(重心法)
49 0
|
4月前
|
算法 C++ Windows
空间射线与三角形相交算法的两种实现
空间射线与三角形相交算法的两种实现
48 0
|
6月前
技术经验解读:三维空间中直角坐标与球坐标的相互转换
技术经验解读:三维空间中直角坐标与球坐标的相互转换
195 0
|
7月前
|
算法
[Halcon&几何] 矩形顶点和对角连线角度计算
[Halcon&几何] 矩形顶点和对角连线角度计算
143 0
关于已知线段,如何求封闭图形轮廓的一些猜想
关于已知线段,如何求封闭图形轮廓的一些猜想
|
算法
秒懂算法 | 计算几何:圆
计算几何的基础是点积和叉积,它们定义了向量的大小和方向的关系,是其他计算几何概念和算法的出发点。在点积和叉积的基础上,本篇重点介绍圆覆盖。 计算几何题目的代码大多繁琐冗长,因此掌握模板代码是学习计算几何的关键。本篇精心组织了经典的几何模板
18133 1
秒懂算法 | 计算几何:圆
计算不规则多边形的面积、中心、重心
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/gisdoer/article/details/82222037 计算不规则多边形的...
9376 0
137.正六边形螺旋图案
137.正六边形螺旋图案
70 0