您的位置:首页 > 其它

nyoj 3 多边形重心问题

2016-01-24 15:17 225 查看


多边形重心问题

时间限制: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://acm.nyist.net/JudgeOnline/problem.php?pid=3
//nyoj 3 多边形重心问题
#include<stdio.h>
struct point
{
double x,y;
};
int main()
{
int t,n,i,j,k;
double area,pice;
point ps[10003],wh;
scanf("%d",&t);
while(t--)
{
wh.x=wh.y=area=0;
scanf("%d",&n);
for(i=0;i<n;i++) scanf("%lf%lf",&ps[i].x,&ps[i].y);
ps[i].x=ps[0].x,ps[i].y=ps[0].y;
for(i=0;i<=n;i++)
{
pice=ps[i].x*ps[i+1].y-ps[i].y*ps[i+1].x;
area+=pice;
wh.x+=pice*(ps[i].x+ps[i+1].x);
wh.y+=pice*(ps[i].y+ps[i+1].y);
}
if(area==0.0) printf("0.000 0.000\n");
else printf("%.3lf %.3lf\n",area>0? area/2.0:area/-2.0,(wh.x+wh.y)/area/3.0);
}
}


基础计算几何题,利用叉乘求得每个向量构成的面积(有正有负)最后组合成所求面积。

重心是面积的加权平均数。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: