NYOJ多边形重心问题
2016-04-08 18:00
239 查看
多边形重心问题
[b]描述在某个多边形上,取n个点,这n个点顺序给出,按照给出顺序将相邻的点用直线连接, (第一个和最后一个连接),所有线段不和其他线段相交,但是可以重合,可得到一个多边形或一条线段或一个多边形和一个线段的连接后的图形;
如果是一条线段,我们定义面积为0,重心坐标为(0,0).现在求给出的点集组成的图形的面积和重心横纵坐标的和;
输入
第一行有一个整数0<n<11,表示有n组数据;
每组数据第一行有一个整数m<10000,表示有这个多边形有m个顶点;
输出输出每个多边形的面积、重心横纵坐标的和,小数点后保留三位;
样例输入
330 10 21 10 33 40 0 0 1 0 0.51 1 0 0 0 1
样例输出
0.000 0.0000.500 1.0000.500 1.000
(1)求多边形面积:
将含有N个顶点的多边形分解成N-2个三角形,求每个三角形的面积,然后累加求和就能够得到多边形的面积
1.已知三角形的三个顶点是p0,p1,p2
那么这个三角形的面积Area(p0,p1,p2)=((p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y))/2的绝对值
2.求多边形面积
sumarea+=Area(p0,p1,p2);
p1=p2;
(2)求多边形的重心
<span style="font-weight: normal;">#include<iostream> using namespace std; struct Point{//坐标结构 double x;//横坐标 double y;//纵坐标 }; double Area(Point p0,Point p1,Point p2){//计算三角形面积 double sum; sum = (p1.x - p0.x)*(p2.y - p0.y) - (p2.x - p0.x)*(p1.y - p0.y); if (sum < 0) return -(sum / 2); return sum / 2; } void gravityCenter(){//算出多边形面积以及重心坐标 int num; cin >> num; //多边形的顶点数 Point p0; //这是一个定点,就是上面多边形分解示意图中的A1点 Point p1; Point p2; cin >> p0.x >> p0.y; cin >> p1.x >> p1.y; double sumx = 0; double sumy = 0; double sumarea = 0;//多边形面积 for (int i = 2; i < num; i++){ cin >> p2.x >> p2.y; sumarea += Area(p0, p1, p2);//计算分解出的小三角形的面积并累加,从而求多边形总面积 if (Area(p0, p1, p2) > 0){//排除不能组成多边形的情况,可以不加这个if条件语句 sumx += (p0.x + p1.x + p2.x) * Area(p0, p1, p2);//上述重心公式中分子的内容 sumy += (p0.y + p1.y + p2.y) * Area(p0, p1, p2); } else{ //这个是所有顶点都在一条直线上的情况 sumx += 0; sumy += 0; } p1 = p2; //关键步骤,实现按照一定的次序挨个遍历分解后的小三角形 } if (sumarea == 0) cout << sumarea << " " << "0" << endl; else cout<<sumarea<<" "<< (sumx / (3 * sumarea)) + (sumy / (3 * sumarea)) <<endl; } int main(){ int sumnum; cin >> sumnum; while (sumnum){ gravityCenter(); sumnum--; } return 0; }</span>
[/b]
相关文章推荐
- php冒泡排序
- ARC下需要注意的内存管理
- 【MongoDB】mongoimport and mongoexport of data (一)
- LeetCode之11---Container With Most Water
- 网页上传图片预览功能
- Gradle project sync failed. Please fix your project and try again解决方案
- asp.net 网页抓取内容
- 程序员及嵌入式的一些学习建议
- Dalvik Dex Code
- 面试准备,待补充
- hardware模块
- Android N Behavior Changes 笔记
- java并发与多线程教程
- Android开发常见异常与错误系列(一)
- docker 安装
- linux下统计当前文件夹中文件的数目以及如何查看文件夹的大小
- 常用Linux shell命令汇总
- A股,B股,ST股
- 关于java中几个CP的一点说明--stringBuilder和stringBuffer与hashTable和hashMap
- imx6 android4.4.2内核sd卡platform_device注册加载原理