POJ 3855 计算几何·多边形重心
Posted siriusren
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ 3855 计算几何·多边形重心相关的知识,希望对你有一定的参考价值。
思路:
多边形面积->任选一个点,把多边形拆成三角,叉积一下
三角形重心->(x1+x2+x3)/3,(y1+y2+y3)/3
多边形重心公式题目中有,套一下就好了
计算多边形重心方法:
(1)划分多边形为三角形:
以多边形的一个顶点V为源点(V可取输入的第一个顶点),作连结V与所有非相邻顶点的线段,即将原N边形或分为(N-2)个三角形;
(2)求每个三角形的重心和面积:
设某个三角形的重心为G(cx,cy),顶点坐标分别为A1(x1,y1),A2(x2,y2),A3(x3,y3),则有cx = (x1 + x2 + x3)/3.同理求得cy。求面积的方法是s = ( (x2 - x1) * (y3 - y1) - (x3 - x1) * (y2 - y1) ) / 2,当A1,A2,A3顺时针排列时取-,否则取正(此定理不证)。事实上,在求每个三角形时不需要辨别正负,之后有方法抵消负号,见下述。
(3)求原多边形的重心:
公式:cx = (∑ cx[i]*s[i]) / ∑s[i]; cy = (∑ cy[i]*s[i] ) / ∑s[i];其中(cx[i], cy[i]), s[i]分别是所划分的第i个三角形的重心坐标和面积。由题“ connect the points in the given order”知每个s[i]的正负号相同,故而∑ cx[i]*s[i]能与∑s[i]消号,所以根本不需要在第(2)步判断每个s[i]的正负。另外,在(2)中求每个重心坐标时要除以3,实际上不需要在求每个三角形坐标时都除以3,只需要求出∑ cx[i]*s[i]后一次性除以3即可。即是多边形重心坐标变为:cx = (∑ cx[i]*s[i]) / (3*∑s[i]); cy = (∑ cy[i]*s[i] ) / (3*∑s[i]);
https://blog.csdn.net/nhl19961226/article/details/68941585
//By SiriusRen #include <cstdio> #include <cstring> #include <algorithm> using namespace std; int n,cases;double S,ts; struct P{double x,y;}p[105],ans; P operator-(P a,P b){P c;c.x=a.x-b.x,c.y=a.y-b.y;return c;} double operator*(P a,P b){return a.x*b.y-a.y*b.x;} int main(){ while(scanf("%d",&n)&&n){ S=ans.x=ans.y=0; for(int i=0;i<n;i++)scanf("%lf%lf",&p[i].x,&p[i].y); for(int i=0;i<n;i++){ ts=p[i]*p[(i+1)%n];S+=ts; ans.x+=ts*(p[i].x+p[(i+1)%n].x)/3; ans.y+=ts*(p[i].y+p[(i+1)%n].y)/3; }printf("Stage #%d: %lf %lf ",++cases,ans.x/S,ans.y/S); } }
以上是关于POJ 3855 计算几何·多边形重心的主要内容,如果未能解决你的问题,请参考以下文章
POJ 1265 计算几何 多边形面积 内部格点数 边上格点数