计算几何之多边形重心
啥叫重心?
我把它抽象的理解为几个顶点均分权重。三个点及以上才能构成一个简单的平面多边形,三角形是最简单的多边形。三角形的重心就是三个顶点均分权重。
三角形重心
通过一个三角形重心公式来看多边形重心公式,若一个三角形有三个点,分别为(x1,y1),(x2,y2),(x3,y3),那么三角形的重心公式为:
x=x1+x2+x33,y=y1+y2+y33x=\frac{x1+x2+x3}{3}, y=\frac{y1+y2+y3}{3}x=3x1+x2+x3,y=3y1+y2+y3
每个点的横权值相加除以3,每个纵权值相加除以3。
多边形重心
现在我们有一个五边形,有5个点,其中S1为三角形△ABC的面积,同理有S2,S3。
先给出它的重心公式:
x=(x1+x2+x3)s1+(x1+x3+x4)s2+(x1+x4+x5)s33(s1+s2+s3)x=\frac{(x1+x2+x3)s1+(x1+x3+x4)s2+(x1+x4+x5)s3}{3(s1+s2+s3)}x=3(s1+s2+s3)(x1+x2+x3)s1+(x1+x3+x4)s2+(x1+x4+x5)s3
y=(y1+y2+y3)s1+(y1+y3+y4)s2+(y1+y4+y5)s33(s1+s2+s3)y=\frac{(y1+y2+y3)s1+(y1+y3+y4)s2+(y1+y4+y5)s3}{3(s1+s2+s3)}y=3(s1+s2+s3)(y1+y2+y3)s1+(y1+y3+y4)s2+(y1+y4+y5)s3
相当于求出三个三角形的重心,再根据三角形的面积去均分权重。相同的道理,可以画一画六边形,七边形,是一样的道理。
所以给出n边形重心公式:
x=∑i=1n−2si∗(以si为面积的三个点横坐标之和)3∑i=1n−2six=\frac{ \sum_{i=1}^{n-2}s_i*(以s_i为面积的三个点横坐标之和) }{3\sum_{i=1}^{n-2}s_i}x=3∑i=1n−2si∑i=1n−2si∗(以si为面积的三个点横坐标之和)
y=∑i=1n−2si∗(以si为面积的三个点纵坐标之和)3∑i=1n−2siy=\frac{ \sum_{i=1}^{n-2}s_i*(以s_i为面积的三个点纵坐标之和) }{3\sum_{i=1}^{n-2}s_i}y=3∑i=1n−2si∑i=1n−2si∗(以si为面积的三个点纵坐标之和)
就是酱紫,是不是很好理解0.0
Tip:计算三角形面积最好使用叉积,海伦公式会损失太多精度。给一下三角形叉积求三角形的公式。但在计算叉积时取点要注意,一定要按逆时针连图,顺时针计算的结果是负的,友情提示,不要加绝对值(会损失精度)。假如三角形有三个点A(x1, y1), B(x2, y2), C(x3, y3),公式为 :
S=(x2−x1)(y3−y1)−(y2−y1)(x3−x1)2S=\frac{(x2-x1)(y3-y1) - (y2-y1)(x3-x1)}{2}S=2(x2−x1)(y3−y1)−(y2−y1)(x3−x1)
这个公式是要加绝对值的,但在计算重心时,别加。
贴个题目:
hdu1115 Lifting the Stone
这题就不能加绝对值…跟着公式敲就行
#include<bits/stdc++.h>
#define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define lson rt<<1, l, mid
#define rson rt<<1|1, mid+1, r
#define PI 3.1415926
using namespace std;
typedef long long ll;
//叉积求面积
double getarea(double x1, double y1, double x2, double y2, double x3, double y3) {return ((x2-x1)*(y3-y1) - (y2-y1)*(x3-x1)) / 2;
}
int main() {fioint t, n; cin >> t;double x1, y1, x2, y2, x3, y3, ansx, ansy, allarea, area; while(t--) {ansx = 0; ansy = 0; allarea = 0;cin >> n;cin >> x1 >> y1 >> x2 >> y2;for(int i = 2; i < n; ++i) {cin >> x3 >> y3;area = getarea(x1, y1, x2, y2, x3, y3);cout << area << endl;allarea += area;ansx += (x1+x2+x3) * area;ansy += (y1+y2+y3) * area;x2 = x3; y2 = y3;}printf("%.2lf %.2lf\n", ansx / allarea / 3.0, ansy / allarea / 3.0);}return 0;
}
计算几何之多边形重心相关推荐
- POJ 3855 计算几何·多边形重心
思路: 多边形面积->任选一个点,把多边形拆成三角,叉积一下 三角形重心->(x1+x2+x3)/3,(y1+y2+y3)/3 多边形重心公式题目中有,套一下就好了 计算多边形重心方法: ...
- HDOJ(1115)多边形重心
Lifting the Stone http://acm.hdu.edu.cn/showproblem.php?pid=1115 题目描述:输入n个顶点(整数),求它们围成的多边形的重心. 算法:以一 ...
- hdu 1115(多边形重心)
求多边形重心的题目大致有这么几种: 1.质量集中在顶点上 n个顶点坐标为(xi,yi),质量为mi,则重心 X = ∑( xi×mi ) / ∑mi Y = ∑( yi×mi ) / ...
- HDU 1115 Lifting the Stone(求多边形重心)
HDU 1115 大意:给你个n,有n个点,然后给你n个点的坐标,求这n个点形成的多边形的重心的坐标. 1 struct point 2 { 3 double x, y; 4 } P[1000010] ...
- NYOJ 3:多边形重心问题
多边形重心问题 时间限制:3000 ms | 内存限制:65535 KB 难度:5 描述 在某个多边形上,取n个点,这n个点顺序给出,按照给出顺序将相邻的点用直线连接, (第一个和最后一个连接), ...
- 不规则多边形重心求解
文章目录 一.不规则多边形重心求解 1.1 三角形重心计算方法 1.2 三角形面积计算方法 1.3 多边形面积的计算方法 1.4 不规则多边形的重心计算方法 一.不规则多边形重心求解 1.1 三角形重 ...
- java计算一个多边形的重心_多边形重心问题 java
多边形重心问题 java 看题目 点这里 题目描述: 描述 在某个多边形上,取n个点,这n个点顺序给出,按照给出顺序将相邻的点用直线连接, (第一个和最后一个连接),所有线段不和其他线段相交,但是可以 ...
- 南阳 3 多边形重心问题(数学几何)
多边形重心问题 时间限制:3000 ms | 内存限制:65535 KB 难度:5 描述 在某个多边形上,取n个点,这n个点顺序给出,按照给出顺序将相邻的点用直线连接, (第一个和最后一个连接), ...
- java计算一个多边形的重心_Java多边形重心计算
多边形重心计算 三角形重心 顶点为a,b,c的三角形重心为x = (xa + xb + xc) / 3,y = (ya + yb + yc) / 3 多边形重心 x = (x1w1 + x2w2 + ...
- 【JAVA】多边形重心计算
多边形重心计算 三角形重心 顶点为a,b,c的三角形重心为x = (xa + xb + xc) / 3,y = (ya + yb + yc) / 3 多边形重心 x = (x1w1 + x2w2 + ...
最新文章
- js移除某个样式_js中如何移除css样式?
- winform DataGrid排序、去掉第一的空白列
- linux实验目的能学会什么意思,Linux实验.doc
- pythonsort函数时间复杂度_合并排序算法——时间复杂度详解和python代码实现
- django CBV装饰器 自定义django中间件 csrf跨站请求伪造 auth认证模块
- python supervisor 日志_Supervisor使用详解
- 性能测试测试环境与生产环境_不在生产中测试? 在生产中进行测试!
- 极其良心的设计导航网站
- colgroup标签
- 用计算机计算勾股定理,勾股定理电脑计算器
- TTW WYSIWYG Editors
- 2022P气瓶充装判断题及在线模拟考试
- C语言-小黄鸭☞循环结构while
- 删除win10桌面IE浏览器图标
- Spring事务抛出Exception异常不回滚
- 毕设论文word撰写:如何实现公式居中,编号右对齐?其实非常简单!
- openstack core components use 总结
- rhino android js,android rhino
- (原创)分词的被动语态中现在式和过去式的区别
- 2019最新妙味课堂jquery源码分析 jquery源码逐行分析全套