NYOJ--3--多边形重心问题
int abs(int i); // 处理int类型的取绝对值
double fabs(double i); //处理double类型的取绝对值
float fabsf(float i); /处理float类型的取绝对值
多边形重心问题
链接:click here
时间限制:3000 ms | 内存限制:65535
难度:5
描述
在某个多边形上,取n个点,这n个点顺序给出,按照给出顺序将相邻的点用直线连接, (第一个和最后一个连接),所有线段不和其他线段相交,但是可以重合,可得到一个多边形或一条线段或一个多边形和一个线段的连接后的图形;
如果是一条线段,我们定义面积为0,重心坐标为(0,0).现在求给出的点集组成的图形的面积和重心横纵坐标的和;
输入
第一行有一个整数0每组数据第一行有一个整数m<10000,表示有这个多边形有m个顶点;
输出
输出每个多边形的面积、重心横纵坐标的和,小数点后保留三位;
样例输入
330 10 20 331 10 00 141 10 00 0.50 1
样例输出
0.000 0.0000.500 1.0000.500 1.000
代码:
#include#include#include#include#include#include#include#include#include#includeusing namespace std;#define Max(a,b) a>b?a:b#define Min(a,b) a>b?b:a#define mem(a,b) memset(a,b,sizeof(a))int dir[4][2]= {{0,-1},{-1,0},{0,1},{1,0}};const double Pi = acos(-1.0);const double EPS = 1e-10;struct Point{ double x,y;};//叉积求面积double Area(const Point p0,const Point p1,const Point p2){ // 另外在求解的过程中,不需要考虑点的输入顺序是顺时针还是逆时针,相除后就抵消了。 return (p0.x*p1.y+p1.x*p2.y+p2.x*p0.y-p1.x*p0.y-p2.x*p1.y-p0.x*p2.y)/2.0;}int main(){ int T,n; scanf("%d",&T); while(T--) { Point p0,p1,p2; double area = 0,suma = 0,sumx = 0,sumy = 0; scanf("%d",&n); scanf("%lf%lf",&p0.x,&p0.y); scanf("%lf%lf",&p1.x,&p1.y); for(int i = 2; i < n; ++i) { scanf("%lf%lf",&p2.x,&p2.y); area = Area(p0,p1,p2); suma += area; sumx += (p0.x+p1.x+p2.x)*area; sumy += (p0.y+p1.y+p2.y)*area; p1 = p2; } if(fabs(suma) <= EPS) { printf("0.000 0.000\n"); continue; } printf("%.3lf %.3lf\n",fabs(suma),(sumx+sumy)/suma/3.0); } return 0;}
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
暂时没有评论,来抢沙发吧~