多边形重心问题
2014-04-30 16:47
197 查看
多边形重心问题
时间限制: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
思路:
向量叉乘求多边形面积及重心。
计算几何中:
三角形的重心: x = (xa+xb+xc)/3, y = (ya+yb+yc)/3;
四边形的重心:作一对角线,将它分成两个三角形分别求出重心与面积 (x1,y1), s1;
(x2, y2), s2 则该四边形的重心为: x = (x1*s1+x2*s2)/(s1+s2), y = (y1*s1+y2*s2)/(s1+s2);
五边形则分为一个三角形与一个四边形……
任意多边形中直接取任一点(一般为原点)把多边形分为n-2个三角形 分别求重心
x=∑si*xi/∑si
y=∑si*yi/∑si
si为每块三角形的有向面积
#include <stdio.h> #include <math.h> typedef struct Node { double x; double y; }pos; pos pt[10001]; double det(pos b, pos c) //第三个点默认为0,0 { return c.x*b.y - c.y*b.x; } int main() { int t, n, i; double sum, area, temp; pos ans; //存储面积与x, y乘积之和 scanf("%d", &t); while(t--) { scanf("%d", &n); for(i = 0; i < n; i++) { scanf("%lf%lf", &pt[i].x, &pt[i].y); } ans.x = ans.y = sum = area = 0.0; for(i = 1; i <= n; i++) { temp = det(pt[i%n], pt[i-1])/2;67 sum += temp; //记录多边形面积 ans.x += temp * (pt[i%n].x+pt[i-1].x)/3; ans.y += temp * (pt[i%n].y+pt[i-1].y)/3; } if(fabs(sum) < 0.000001) //考虑除零情况 { printf("0.000 0.000\n"); } else { printf("%.3lf %.3lf\n", fabs(sum), (ans.x+ans.y)/sum); } } return 0; }
相关文章推荐
- jquery扩展例子
- 软考倒计时24天:熟记点
- C++的那些事:表达式与语句
- 我就马上,你,美女,美女
- CentOS 防火墙配置 80端口
- 一种使用QThread线程的新方法QObject::moveToThread
- 【超详细科普贴】wifi共享精灵抢先版怎么用?
- win32 字体变换与窗口同大同小
- Daily English words study
- 你爸妈凯旋门你,只能, 你,只能,的分离式
- js获取外层标签(排除标签里面的内容)
- Android 广播与服务
- Java 单例模式探讨
- HttpUrlConnection post方法传递中文乱码问题
- IOS 6 自动布局 入门-1(IOS中autolayout和之前版本autoresize的差异)
- Ruby 里的 %Q, %q, %W, %w, %x, %r, %s, %i (译)转
- WCF服务“*”有零个应用程序(非基础结构)终结点。这可能是因为未找到应用程序的配置文件,或者在配置文件中未找到与服务名称匹配的服务元素,或者服务元素中未定义终结点。
- HttpUrlConnection post方法传递中文乱码问题
- android Bitmap学习总结
- IBM 光纤交换机配置