nyoj 3 多边形重心问题
2016-01-24 15:17
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
注:题目来源 http://acm.nyist.net/JudgeOnline/problem.php?pid=3
//nyoj 3 多边形重心问题 #include<stdio.h> struct point { double x,y; }; int main() { int t,n,i,j,k; double area,pice; point ps[10003],wh; scanf("%d",&t); while(t--) { wh.x=wh.y=area=0; scanf("%d",&n); for(i=0;i<n;i++) scanf("%lf%lf",&ps[i].x,&ps[i].y); ps[i].x=ps[0].x,ps[i].y=ps[0].y; for(i=0;i<=n;i++) { pice=ps[i].x*ps[i+1].y-ps[i].y*ps[i+1].x; area+=pice; wh.x+=pice*(ps[i].x+ps[i+1].x); wh.y+=pice*(ps[i].y+ps[i+1].y); } if(area==0.0) printf("0.000 0.000\n"); else printf("%.3lf %.3lf\n",area>0? area/2.0:area/-2.0,(wh.x+wh.y)/area/3.0); } }
基础计算几何题,利用叉乘求得每个向量构成的面积(有正有负)最后组合成所求面积。
重心是面积的加权平均数。
相关文章推荐
- It’s Time to Move to a Four-Tier Application Architecture
- C#面向对象编程初步 :字段与属性
- IOS 小技巧
- 人脸识别的一些资源
- Max Sum(经典DP)
- 高级特性(2)- XML
- ZooKeeper使用
- 机器视觉会议以及牛人
- 【leetcode】94. Binary Tree Inorder Traversal------Morris Traversal
- 机器视觉会议以及牛人
- 转图像偏微分方程不适定问题
- poj_1000 A+B Problem 模拟
- Java数据类型和MySql数据类型对照表
- HDU 1026 Ignatius and the Princess I(BFS+记录路径)
- 转图像偏微分方程不适定问题
- JavaScript、jQuery与Ajax的关系
- angularjs 排序
- 浅析点对点(End-to-End)的场景文字识别(图片文字)
- 2014年第五届蓝桥杯C/C++程序设计本科B组省赛 啤酒和饮料(结果填空)
- 指针的概念