首页 > 代码库 > UVA 10002 Center of Masses
UVA 10002 Center of Masses
题目链接:http://acm.uva.es/local/online_judge/search_uva.html
Problem:Find out the center of masses of a convex polygon.
Input:A series of convex polygons, defined as a number n () stating the number of points of the polygon, followed by n different pairs of integers (in no particular order), denoting the x and y coordinates of each point. The input is finished by a fake ``polygon" with m (m < 3) points, which should not be processed.
Output:For each polygon, a single line with the coordinates x and y of the center of masses of that polygon, rounded to three decimal digits.
解法:求多边形的重心。先求出其凸包,然后求重心。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cstdlib> 5 #include<cmath> 6 #include<algorithm> 7 #define inf 0x7fffffff 8 #define exp 1e-10 9 #define PI 3.14159265410 using namespace std;11 const int maxn=111;12 struct Point13 {14 double x,y;15 Point (double x=0,double y=0):x(x),y(y){}16 bool friend operator < (Point a,Point b)17 {18 if (a.x!=b.x) return a.x<b.x;19 return a.y<b.y;20 }21 }an[maxn],bn[maxn];22 typedef Point Vector;23 Vector operator + (Vector A,Vector B) {return Vector(A.x+B.x , A.y+B.y); }24 Vector operator - (Vector A,Vector B) {return Vector(A.x-B.x , A.y-B.y); }25 Vector operator * (Vector A,double p) {return Vector(A.x*p , A.y*p); }26 int dcmp(double x)27 {28 if (fabs(x)<exp) return 0;29 return x<0 ? -1 : 1;30 }31 double cross(Vector A,Vector B)32 {33 return A.x*B.y-B.x*A.y;34 }35 Point PolyGravity(Point *p,int n)36 {37 Point tmp,g=Point(0,0);38 double sumArea=0,area;39 for (int i=2 ;i<n ;i++)40 {41 area=cross(p[i-1]-p[0],p[i]-p[0]);42 sumArea += area;43 tmp.x=p[0].x+p[i-1].x+p[i].x;44 tmp.y=p[0].y+p[i-1].y+p[i].y;45 g.x += tmp.x*area;46 g.y += tmp.y*area;47 }48 g.x /= (sumArea*3.0);49 g.y /= (sumArea*3.0);50 return g;51 }52 int ConvexHull(Point *p,int n,Point *ch)53 {54 sort(p,p+n);55 int m=0;56 for (int i=0 ;i<n ;i++)57 {58 while (m>1 && dcmp(cross(ch[m-1]-ch[m-2],p[i]-ch[m-2]))<0) m--;59 ch[m++]=p[i];60 }61 int k=m;62 for (int i=n-2 ;i>=0 ;i--)63 {64 while (m>k && dcmp(cross(ch[m-1]-ch[m-2],p[i]-ch[m-2]))<0) m--;65 ch[m++]=p[i];66 }67 if (n>1) m--;68 return m;69 }70 int main()71 {72 int n;73 while (scanf("%d",&n)!=EOF)74 {75 if (n<3) break;76 for (int i=0 ;i<n ;i++)77 {78 scanf("%lf%lf",&an[i].x,&an[i].y);79 }80 int k=ConvexHull(an,n,bn);81 //cout<<"DEBUG\n";82 //for (int i=0 ;i<n ;i++) cout<<an[i].x<<" "<<an[i].y<<endl;83 Point ans=PolyGravity(bn,k);84 printf("%.3lf %.3lf\n",ans.x,ans.y);85 }86 return 0;87 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。