NYOJ3(多边形重心)

题目意思:
在某个多边形上,取n个点,这n个点顺序给出,按照给出顺序将相邻的点用直线连接, (第一个和最后一个连接),所有线段不和其他线段相交,但是可以重合,可得到一个多边形或一条线段或一个多边形和一个线段的连接后的图形;

如果是一条线段,我们定义面积为0,重心坐标为(0,0).现在求给出的点集组成的图形的面积和重心横纵坐标的和。

http://acm.nyist.net/JudgeOnline/problem.php?pid=3

输入
第一行有一个整数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
题目分析:

此题是一个多边形重心问题,直接上模板进行了,只是不知道为什么将多边形分成在n个点中任选一个点分成n-2个三角形求解问什么过不了,最后以原点为中心进行划分反而过了?下面贴上AC代码。


AC代码:

/**
 *①质量集中在顶点上
 *  n个顶点坐标为(xi,yi),质量为mi,则重心
 * X = ∑( xi×mi ) / ∑mi
 * Y = ∑( yi×mi ) / ∑mi
 * 特殊地,若每个点的质量相同,则
 * X = ∑xi / n
 * Y = ∑yi / n
 *②质量分布均匀
 * 特殊地,质量均匀的三角形重心:
 * X = ( x0 + x1 + x2 ) / 3
 * Y = ( y0 + y1 + y2 ) / 3
 *③三角形面积公式:S =  ( (x2 - x1) * (y3 - y1) - (x3 - x1) * (y2 - y1) ) / 2 ;
 *做题步骤:1、将多边形分割成n-2个三角形,根据③公式求每个三角形面积。
 *            2、根据②求每个三角形重心。
 *            3、根据①求得多边形重心。
**/
#include<iostream>
#include<cmath>
#include<cstdio>
using namespace std;
struct Point{
 double x,y;
}p[10005];
double Area(Point p1,Point p2,Point p3){//叉乘求三角形面积
    return ((p2.x-p1.x)*(p3.y-p1.y)-(p3.x-p1.x)*(p2.y-p1.y))/2.0;
}
int main()
{
    int n,t;
    Point p0;
    p0.x=p0.y=0.0;
    scanf("%d",&t);
    while(t--){
        scanf("%d",&n);
        double gx,gy,sumarea,area;
        gx=gy=sumarea=0;
        for(int i = 0; i < n; ++i)
            scanf("%lf%lf", &p[i].x, &p[i].y);
        for(int i=1;i<=n;i++){
            area=Area(p0,p[i%n],p[i-1]);//与原点单个三角的面积
            gx+=(p[i%n].x+p[i-1].x)*area;//重心乘以其权值(面积),因为每一个都要除以3,所医院放在最后
            gy+=(p[i%n].y+p[i-1].y)*area;
            sumarea+=area;//计算所有权值
        }

        if(sumarea < 0.0000001 && sumarea >-0.0000001){
            printf("0.000 0.000\n");
            continue;
        }
        /**
        gx=gx/(sumarea*3);//求的多边形重心
        gy=gy/(sumarea*3);
        **/
        printf("%.3lf %.3lf\n",sumarea,(gx+gy)/(sumarea*3));
        //printf("%.2lf %.2lf\n",gx,gy);
    }
    return 0;
}


x1y2 x2y3 x3y1-x1y3-x2y1-x3y2 是计算三角形面积的公式中的一部分。 在这个公式中,x1、x2、x3分别表示三角形的三个顶点的x坐标,y1、y2、y3分别表示三角形的三个顶点的y坐标。通过计算这个表达式的值,可以得到三角形的面积。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [TetraCluster:使用并行Java 2库的Java并行程序。 该程序在群集并行计算机上运行,​​以从给定的点集中找到...](https://download.csdn.net/download/weixin_42171208/18283141)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [线性代数有个题,求正交变换x=Qy,化二次型f(x1,x2,x3)=8x1x2+8x1x3+8x2x3为标准型求出特征值](https://blog.csdn.net/weixin_39956182/article/details/115882118)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [nyoj-67-三角形面积(S=(1/2)*(x1y2+x2y3+x3y1-x1y3-x2y1-x3y2))](https://blog.csdn.net/weixin_30492601/article/details/99541033)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值