hdu1115(重力算法的多边形中心)

标题的含义:

给定一个n刚n顶点。这是获得n分众协调多边形。

http://acm.hdu.edu.cn/showproblem.php?

pid=1115

题目分析:

/**

*出处:http://blog.csdn.net/ysc504/article/details/8812339

*①质量集中在顶点上

*  n个顶点坐标为(xi,yi)。质量为mi,则重心

* X = ∑( xi×mi ) / ∑mi

* Y = ∑( yi×mi ) / ∑mi

* 特殊地。若每一个点的质量同样。则

* X = ∑xi / n

* Y = ∑yi / n

*②质量分布均匀

* 特殊地。质量均匀的三角形重心:

* X = ( x0 + x1 + x2 ) / 3

* Y = ( y0 + y1 + y2 ) / 3

*③三角形面积公式:S =  ( (x2 - x1) * (y3 - y1) - (x3 - x1) * (y2 - y1) ) / 2 ;

*做题步骤:1、将多边形切割成n-2个三角形。依据③公式求每一个三角形面积。

*            2、依据②求每一个三角形重心。

*            3、依据①求得多边形重心。

**/

如今根据此算法给出两种代码,一种是将n个点。以当中一个点为标准。分成n-2个三角形。再进行求重心。

还有一种是以原点为根据分成n+1个三角形,再进行求重心。

AC代码:

第一种代码:

#include<iostream>

#include<cmath>

#include<cstdio>

using namespace std;

struct Point{

double x,y;

};

double Area(Point p1,Point p2,Point p3){//叉乘求三角形面积

return ((p2.x-p1.x)*(p3.y-p1.y)-(p3.x-p1.x)*(p2.y-p1.y))/2;

}

int main()

{

int n,t;

scanf("%d",&t);

while(t--){

scanf("%d",&n);

Point p1,p2,p3;

double gx,gy,sumarea;

gx=gy=sumarea=0;

scanf("%lf%lf%lf%lf",&p1.x,&p1.y,&p2.x,&p2.y);

for(int i=2;i<n;i++){//分成n-2个三角形

scanf("%lf%lf",&p3.x,&p3.y);

double area=Area(p1,p2,p3);//单个三角的面积

gx+=(p1.x+p2.x+p3.x)*area;//重心乘以其权值(面积),由于每个都要除以3,所医院放在最后

gy+=(p1.y+p2.y+p3.y)*area;

sumarea+=area;//计算全部权值

p2=p3;//替换p2,计算下一个三角形

}

gx=gx/sumarea/3;//求的多边形重心

gy=gy/sumarea/3;

printf("%.2lf %.2lf\n",gx,gy);

}

return 0;

}

另外一种代码:

#include<iostream>

#include<cmath>

#include<cstdio>

using namespace std;

struct Point{

double x,y;

}p[10005];

double Area(Point p1,Point p2,Point p3){//叉乘求三角形面积

return ((p2.x-p1.x)*(p3.y-p1.y)-(p3.x-p1.x)*(p2.y-p1.y))/2.0;

}

int main()

{

int n,t;

Point p0;

p0.x=p0.y=0.0;

scanf("%d",&t);

while(t--){

scanf("%d",&n);

double gx,gy,sumarea,area;

gx=gy=sumarea=0;

for(int i = 0; i < n; ++i)

scanf("%lf%lf", &p[i].x, &p[i].y);

for(int i=1;i<=n;i++){

area=Area(p0,p[i%n],p[i-1]);//与原点单个三角的面积

gx+=(p[i%n].x+p[i-1].x)*area;//重心乘以其权值(面积),由于每个都要除以3,所医院放在最后

gy+=(p[i%n].y+p[i-1].y)*area;

sumarea+=area;//计算全部权值

}

gx=gx/(sumarea*3);//求的多边形重心

gy=gy/(sumarea*3);

printf("%.2lf %.2lf\n",gx,gy);

}

return 0;

}

版权声明:本文博主原创文章,博客,未经同意不得转载。

时间: 2024-12-19 08:46:50

hdu1115(重力算法的多边形中心)的相关文章

基于扫描种子线算法的多边形区域填充实现

本学期算法课上我们学习了计算几何的基础内容,在课后的深入了解学习中我发现,计算几何仅仅是算法世界一个重要分支——计算机图形学的基础部分之一,计算机图形学还有很多其他非常有趣的算法,例如直线生成.圆生成.椭圆生成.而在本学期进行java项目实践的过程中,我也遇到了一个和计算机图形学息息相关的问题,那就是如何实现windows自带画图软件中的工具油漆桶?网上的开源画图代码基本上均只实现了其他简单的绘制工具.为此,在查阅大量相关资料后,我学习到,种子填充算法可以很好地实现多边形区域填充,并用其中效果最

常用/常考算法总结

转自tangjz的博客... 基础算法 模拟 搜索 广度优先搜索(BFS) 优化:双向BFS 深度优先搜索(DFS) 优化:折半DFS 迭代加深搜索(IDS) 启发式搜索(Astar) 优化:IDAstar 优化:剪枝.位运算 排序 冒泡排序/选择排序 基数排序/桶排序 计数排序 插入排序/希尔排序 快速排序 归并排序/求逆序对数 堆排序 贪心 分治 二分/三分/n分 cdq分治 倍增/ST 离散化 二分答案 快速幂/十进制快速幂 基础数学 数列求和 泰勒展开 矩阵 矩阵乘法 高斯消元 判断线性

旋转卡壳算法及应用 (参考论文)

多看论文开眼界! 转自:http://blog.csdn.net/acmaker/article/details/3188177 一.目录 一些历史: 1978年, M.I. Shamos's Ph.D. 的论文"Computational Geometry"标志着计算机科学的这一领域的诞生. 当时他发表成果的是一个寻找凸多边形直径的一个非常简单的算法, 即根据多边形的一对点距离的最大值来确定. 后来直径演化为由一对对踵点对来确定. Shamos提出了一个简单的 O(n) 时间的算法来

html5游戏-包围盒检测算法

矩形包围盒算法:检测2个矩形是否重叠,在这样情况下要判断2个矩形是否碰撞只需要比较两个矩形顶点的坐标即可.假设矩形A用(x1,y1)表示左上角,(x2,y2)表示右下角,矩形B用(x3,y3)表示左上角,(x4,y4)表示右下角,则满足下列条件则表示没有碰撞,反之则碰撞.没碰撞:x1>x4或者x2<x3.没碰撞:y1>y4或者y2<y3 var ABBox = function(tBox1,tBox2){ var x1 = tBox1.x, y1 = tBox1.y, x2 = t

opengl实现直线扫描算法和区域填充算法

总体介绍 1.   使用线性扫描算法画一条线,线性离散点 2.   利用区域填充算法画多边形区域,区域离散的点 开发环境VS2012+OpenGL 开发平台 Intel core i5,Intel HD Graphics Family 设计思路 一.直线扫描算法 1.数值微分法(DDA) 已知过端点P0 (x0, y0), P1(x1, y1)的直线段L:y = kx + b,easy得知直线斜率为:k = (y1-y0)/(x1-x0).(如果x1≠x0). 我们如果|k|≤1,这样x每添加1

?机器视觉算法与应用读书笔记(算法)

1.数据结构 2.图像增强 1. 灰度值变换 2. 辐射标定 3. 图像平滑 1. 时域去噪法 2. 空间域去噪法 均值滤波器 递归线性滤波器:将上次计算得到的值带入到下次的值中 缺点:噪声并不能被全部消除 高斯滤波器 高斯滤波器 4. 傅里叶变换 将函数h(x)从空间域转变到频率域 是一种可逆变换 3. 几何变换 1. 仿射变换 二维to二维之间的变换 对图像中的物体的尺寸进行修正(平移和旋转角度修正) 一般有一个2x2的线性部分和一个平移部分 2. 投影变换 高维to二维之间的变换 仿射变换

K-means聚类算法的三种改进(K-means++,ISODATA,Kernel K-means)介绍与对比

  一.概述 在本篇文章中将对四种聚类算法(K-means,K-means++,ISODATA和Kernel K-means)进行详细介绍,并利用数据集来真实地反映这四种算法之间的区别. 首先需要明确的是上述四种算法都属于"硬聚类"算法,即数据集中每一个样本都是被100%确定得分到某一个类别中.与之相对的"软聚类"可以理解为每个样本是以一定的概率被分到某一个类别中. 先简要阐述下上述四种算法之间的关系,已经了解过经典K-means算法的读者应该会有所体会.没有了解过

K-Means 算法(转载)

K-Means 算法 在数据挖掘中, k-Means 算法是一种 cluster analysis 的算法,其主要是来计算数据聚集的算法,主要通过不断地取离种子点最近均值的算法. 问题 K-Means算法主要解决的问题如下图所示.我们可以看到,在图的左边有一些点,我们用肉眼可以看出来有四个点群,但是我们怎么通过计算机程序找出这几个点群来呢?于是就出现了我们的K-Means算法(Wikipedia链接) K-Means 要解决的问题 算法概要 这个算法其实很简单,如下图所示: K-Means 算法

视觉机器学习------K-means算法

K-means(K均值)是基于数据划分的无监督聚类算法. 一.基本原理       聚类算法可以理解为无监督的分类方法,即样本集预先不知所属类别或标签,需要根据样本之间的距离或相似程度自动进行分类.聚类算法可以分为基于划分的方法.基于联通性的方法.基于概率分布模型的方法等,K-means属于基于划分的聚类方法. 基于划分的方法是将样本集组成的矢量空间划分为多个区域{Si}i=1k,每个区域都存在一个区域相关的表示{ci}i=1k,通常称为区域中心.对于每个样本,可以建立一种样本到区域中心的映射q