<ACM>求多边形重心和面积问题

来源:互联网 发布:嘉霖集团 知乎 编辑:程序博客网 时间:2024/05/18 00:19

描述
在某个多边形上,取n个点,这n个点顺序给出,按照给出顺序将相邻的点用直线连接, (第一个和最后一个连接),所有线段不和其他线段相交,但是可以重合,可得到一个多边形或一条线段或一个多边形和一个线段的连接后的图形; 
如果是一条线段,我们定义面积为0,重心坐标为(0,0).现在求给出的点集组成的图形的面积和重心横纵坐标的和;
输入
第一行有一个整数0<n<11,表示有n组数据;
每组数据第一行有一个整数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

原题链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=3

思路:
求多边形面积:将n边形分割为n-2个三角形,分别求三角形面积,又因为已知顶点坐标,所以可以根据向量来求,原点
某顶点的确定的向量就是这个顶点的坐标,设顶点为 p1, p2, ..., pk, 则面积s

具体证明见链接:http://blog.csdn.net/hemmingway/article/details/7814494

对于重心, 设每个三角形面积为st, 对应向量为(x1, y1), (x2, y2), 那么x方向:(x1+x2)/3, y方向: (y1+y2)/3,假设总面积为s, 那么每个三角形权重为st/s, 那么

重心坐标为各个三角形重心乘以其面积求和后除以s,

具体证明见链接:http://blog.sina.com.cn/s/blog_6bc4930c01011xcd.html


代码:

#include<stdio.h>#include<math.h>#define M 10010#define INF 0.0001typedef struct Node{double x;double y;}Node;int main(){Node m[M];int T, t;double temp, s, gra_x, gra_y; scanf("%d", &T);while(T--){s = 0.0; gra_x = 0.0; gra_y = 0.0;scanf("%d", &t);for(int i = 0; i < t; i++){scanf("%lf%lf", &m[i].x, &m[i].y);}for(int i = 1; i <= t; i++){temp = (m[i%t].x*m[i-1].y - m[i%t].y*m[i-1].x)/2.0;s += temp;gra_x += temp*(m[i%t].x + m[i-1].x)/3.0;gra_y += temp*(m[i%t].y + m[i-1].y)/3.0;} if(s > -INF && s < INF){printf("0.000 0.000\n"); continue;}printf("%0.3f %0.3f\n", s, (gra_x+gra_y)/s); } return 0;}


原创粉丝点击