3 多边形重心问题
2016-03-22 11:47
225 查看
多边形重心问题
时间限制:3000 ms | 内存限制:65535 KB难度:5
描述在某个多边形上,取n个点,这n个点顺序给出,按照给出顺序将相邻的点用直线连接, (第一个和最后一个连接),所有线段不和其他线段相交,但是可以重合,可得到一个多边形或一条线段或一个多边形和一个线段的连接后的图形;
如果是一条线段,我们定义面积为0,重心坐标为(0,0).现在求给出的点集组成的图形的面积和重心横纵坐标的和;
输入第一行有一个整数0<n<11,表示有n组数据;
每组数据第一行有一个整数m<10000,表示有这个多边形有m个顶点;
输出输出每个多边形的面积、重心横纵坐标的和,小数点后保留三位;
样例输入
3 3 0 1 0 2 0 3 3 1 1 0 0 0 1 4 1 1 0 0 0 0.5 0 1
样例输出
0.000 0.000 0.500 1.000 0.500 1.000
#include<stdio.h>
#include<math.h>
typedef struct point
{
double x,y;
}point;
int main()
{
int hang=0;
struct point p[10001];
scanf("%d",&hang);
while(hang--)
{
int bian=0;
double zhongxin=0.0,sum_mianji=0.0;
double zhongxin_x=0.0,zhongxin_y=0.0;
int i=0;
scanf("%d",&bian);
for (i=0;i<bian;i++)
{
scanf("%lf%lf",&p[i].x,&p[i].y);
}
for ( i =1;i<=bian;i++)
{
double temp = (p[i%bian].x*p[i-1].y-p[i%bian].y*p[i-1].x)/2.0;
sum_mianji+=temp;
zhongxin_x+=temp*(p[i%bian].x+p[i-1].x);
zhongxin_y+=temp*(p[i%bian].y+p[i-1].y);
}
if (sum_mianji< 0.0000001&sum_mianji>-0.0000001)
{
printf("0.000 0.000\n");
continue;
}
zhongxin=(zhongxin_x+zhongxin_y)/(sum_mianji*3.0);
printf("%0.3f %0.3f\n",sum_mianji,zhongxin);
}
return 0;
}
相关文章推荐
- iOS 点空白处回收键盘
- My Dad said
- How to Bruteforce WPA/WPA2 with Pyrit (Tutorial)
- cocos2d-x 让小球滚动起来
- 第九天、希尔排序
- Android的Socket通信编程实例
- yarn is running beyond physical memory limits 问题解决
- SQL SERVER 2008 同表同列做差
- Spring Security(07)——缓存UserDetails
- .NET DateTime 显示格式
- 如何搭建SVN服务器,详细安装步骤。
- 详解如何用HTML5 Canvas API控制图片的缩放变换
- Dll注入技术之输入法注入
- 配置属于我自己的专属IDE工具VIM
- failed: dlopen failed: cannot locate symbol "rand" referenced by
- multiple build commands for output file
- 利用typedef定义函数指针
- Mysql事务使用总结
- Android使listview(GridView) 获取焦点时,选中上次失去焦点时的item,而不是就近的item
- (未完占坑)笔记:flask用户认证