nyoj 3 多边形重心问题
2012-09-06 16:58
225 查看
思路:把多边形分解为多个三角形,计算每个三角形的重心即((x1+x2+x3)/3,(y1+y2+y3)/3),把每个三角形的面积当做重心的权值,然后把重心合并,即多边形的重心
核心公式:X=(x1*s1+x2*s2+x3*s3)/(s1+s2+s3) s1、s2、s3分别为三角形的面积,x1、x2、x3分别为三角重心的x坐标,X为多边形重心x坐标,Y同理
第一种解法,把第一个点当基点划分三角形
第二种方法,把原点当基点,这样可以减少计算
最后求得的三角形面积,与之前求得的三角形面积符号相反,这样相加到最后求得的面积正好为多边形的面积
核心公式:X=(x1*s1+x2*s2+x3*s3)/(s1+s2+s3) s1、s2、s3分别为三角形的面积,x1、x2、x3分别为三角重心的x坐标,X为多边形重心x坐标,Y同理
第一种解法,把第一个点当基点划分三角形
#include<stdio.h> #include<math.h> struct point { double x,y; }p[10005]; int m; double area; //多边形的面积 double find() { int i; double ans; point center; //多边形的重心 center.x=0;center.y=0; for(i=1;i<m-1;i++) { area+=((p[i].x-p[0].x)*(p[i+1].y-p[0].y)-(p[i+1].x-p[0].x)*(p[i].y-p[0].y))/2.0; center.x+=((p[i].x-p[0].x)*(p[i+1].y-p[0].y)-(p[i+1].x-p[0].x)*(p[i].y-p[0].y))*(p[0].x+p[i].x+p[i+1].x)/6.0; center.y+=((p[i].x-p[0].x)*(p[i+1].y-p[0].y)-(p[i+1].x-p[0].x)*(p[i].y-p[0].y))*(p[i+1].y+p[i].y+p[0].y)/6.0; } if(area==0) ans=0; else ans=(center.x+center.y)/area; return ans; } int main() { int n,i; double ans; scanf("%d",&n); while(n--) { scanf("%d",&m); for(i=0;i<m;i++) { scanf("%lf%lf",&p[i].x,&p[i].y); } area=0; ans=find(); printf("%.3lf %.3lf\n",fabs(area),ans); } return 0; }
第二种方法,把原点当基点,这样可以减少计算
最后求得的三角形面积,与之前求得的三角形面积符号相反,这样相加到最后求得的面积正好为多边形的面积
#include<stdio.h> #include<math.h> struct point { double x,y; }p[10005]; int m; double area; double find() { int i; double ans; point center; center.x=0;center.y=0; for(i=0;i<m-1;i++) { area+=(p[i].x*p[i+1].y-p[i+1].x*p[i].y)/2.0; center.x+=(p[i].x*p[i+1].y-p[i+1].x*p[i].y)*(p[i].x+p[i+1].x)/6.0; center.y+=(p[i].x*p[i+1].y-p[i+1].x*p[i].y)*(p[i+1].y+p[i].y)/6.0; } area+=(p[m-1].x*p[0].y-p[m-1].y*p[0].x)/2.0; center.x+=(p[m-1].x*p[0].y-p[m-1].y*p[0].x)*(p[m-1].x+p[0].x)/6.0; center.y+=(p[m-1].x*p[0].y-p[m-1].y*p[0].x)*(p[m-1].y+p[0].y)/6.0; if(area==0) ans=0; else ans=(center.x+center.y)/area; return ans; } int main() { int n,i; double ans; scanf("%d",&n); while(n--) { scanf("%d",&m); for(i=0;i<m;i++) { scanf("%lf%lf",&p[i].x,&p[i].y); } area=0; ans=find(); printf("%.3lf %.3lf\n",fabs(area),ans); } return 0; }
相关文章推荐
- nyoj 3 多边形重心问题
- nyoj 3 多边形重心问题
- NYOJ - 多边形重心问题
- NYOJ 3 多边形重心问题
- NYOJ 题目3多边形重心问题(数学几何)
- NYOJ-----3---多边形重心问题
- 多边形重心问题(nyoj 3)
- nyoj-3-多边形重心问题
- NYOJ 题目3 多边形重心问题
- nyoj-3-多边形重心问题
- NYOJ--3--多边形重心问题
- NYOJ-3 多边形重心问题
- NYOJ 3 多边形重心问题 【计算几何】
- nyoj 3 多边形重心问题
- nyoj 3:多边形重心问题(计算几何)
- NYOJ 3 多边形重心问题 (求多面性重心及面积)
- NYOJ 3:多边形重心问题
- NYOJ-多边形重心问题(计算几何)
- 多边心重心[nyoj 3 多边形重心问题, hdu 1115 Lifting the Stone]
- NYOJ3—多边形重心问题(计算几何)&&hdu1115 Lifting the Stone