CF_#478_Div.2_Hag's Khashba
做的正儿八经的计算几何题不多,慢慢来吧。
题目描述: http://codeforces.com/contest/975/problem/E
大意就是说给你一个凸多边形,一开始1,2两点有钉子固定在墙上,有两种操作,一种是拔掉某个已有钉子的点上的钉子,之后等待该多边形在重力作用下稳定之后固定在该操作中告诉你的另一个点上;另一种是问某个点,输出该点的坐标。
这道题只有从角度相对重心的角度和距离不变,从这儿入手,因此需要计算出一开始多边形的重心并在之后每一个拔钉插钉操作后进行更新,还有每个点与重心的角度和距离,之后可以进行计算坐标;可将多边形切割为多个三角形,因为每个三角形重心计算公式为三点坐标的平均值,之后代入重心计算公式即可;注意为了精度控制,需要将多边形移至原点进行计算,输出时再加上差值;
重心计算公式:X = ∑xi*mi / M;Y = ∑yi*mi / M;
将每个三角形面积和已知的重心坐标代入,计算即可;
代码:
#include "iostream"
#include "math.h"
#include "stdio.h"
#include "algorithm"
#include "stdlib.h"
#include "map"
using namespace std;
typedef long double ld;
typedef pair<ld, ld> point;
const ld PI = acosl(-);
point po[];
ld angle[], dist[];
int n, q;
point getCenterPos(){ //获取重心
ld area, tmp, rx, ry;
area = tmp = rx = ry = 0.0;
for(int i = ; i < n; i++){
tmp = po[i].first*po[(i+)%n].second - po[i].second*po[(i+)%n].first; //分割的三角形面积
area += tmp;
rx += tmp*(po[i].first + po[(i+)%n].first);
ry += tmp*(po[i].second + po[(i+)%n].second);
}
return point(rx/(*area), ry/(*area));
}
ld getdist(point a, point b){ //点与重心距离
return sqrtl((a.first - b.first)*(a.first - b.first) + (a.second - b.second)*(a.second - b.second));
}
point getPos(int pos, point center, ld addAng){ //获取点坐标
ld x, y;
x = center.first + dist[pos]*cosl(angle[pos] + addAng); ///重心坐标变化之后需要将记录的角度变化量加上
y = center.second + dist[pos]*sinl(angle[pos] + addAng);
return point(x, y);
}
int main(){
//freopen("test.txt", "r", stdin);////////////////
int i, t, op, a, b, one, two;
ld initX, initY, changeAng;
point centerPos, top;
while(cin>>n>>q){
for(i = ; i < n; i++) cin>>po[i].first>>po[i].second;
initX = po[].first, initY = po[].second;
for(i = ; i < n; i++) po[i].first -= initX, po[i].second -= initY; //以第一个点为原点
one = , two = ; //初始钉子位置
centerPos = getCenterPos(); //初始重心位置
changeAng = 0.0;
for(i = ; i < n; i++){
dist[i] = getdist(po[i], centerPos);
angle[i] = atan2l(po[i].second - centerPos.second, po[i].first - centerPos.first); //计算角度
}
while(q--){
cin>>op;
if(op == ){
cin>>a>>b;
a--, b--;
if(a == one){
one = b;
top = getPos(two, centerPos, changeAng); //获取本次旋转点的当前坐标
t = two;
}
else{
two = b;
top = getPos(one, centerPos, changeAng);
t = one;
}
//这里计算角度时和之前计算角度值的点顺序相反,画画角度就知道,这样的方式为角与补角的关系(atan2()参数及返回值)
changeAng += -PI/2.0 - atan2l(centerPos.second - top.second, centerPos.first - top.first); //记录变化角
while(changeAng > *PI) changeAng -= *PI;
while(changeAng < ) changeAng += *PI;
centerPos.first = top.first; //更新重心坐标
centerPos.second = top.second - dist[t];
}
else{
cin>>a;
top = getPos(a-, centerPos, changeAng);
printf("%.10lf %.10lf\n", (double)(top.first+initX), (double)(top.second+initY));
}
}
}
return ;
}
==!
CF_#478_Div.2_Hag's Khashba的更多相关文章
- oracle sql查询转义下划线
1,看以下结果 select * from test where login like '%CF_%'; LOGIN------------------------------------------ ...
- Oracle 11g 中恢复管理器RMAN介绍
这是我平时摘录的笔记,从管理艺术那本书上摘录出来的,放到这里 RMAN 可在数据库服务器的帮助下从数据库内备份数据文件,可构造数据文件映像副本.控制文件和控制文件映像.对当日志 SPFILE 和RMA ...
- RMAN数据库异机迁移步骤
--RMAN数据库异机迁移步骤----------------------------2013/09/28 测试环境:AIX+ora11g 一. source数据库准备. 1.获取数据文件编号 ...
- RMAN备份与恢复深入解<一>
一 数据库版本 SQL> select *from v$version; BANNER ----------------------------------------------------- ...
- 左右10g DG中间ORA-19527和ORA-00312错误解决演示示例
这些天大厦10g DG Windows 2008 R2测试环境,主要明天去给客户端,再建一个生产资源库DG,其中一些发现的问题.特此记录下来 因为将要部署到生产环境.所以考虑在线搭建DG的方案,即不停 ...
- 配置RMAN备份环境
关于配置RMAN备份环境你可以给每个目标数据库设置一些固定的配置,这些配置控制着RMAN多个方面的行为.例如,你可配置备份的保存策略.默认的备份目录.默认的备份设备类型等.你可以用show命令来查看配 ...
- 如何用kaldi做孤立词识别-初版
---------------------------------------------------------------------------------------------------- ...
- hdu 5667 BestCoder Round #80 矩阵快速幂
Sequence Accepts: 59 Submissions: 650 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536 ...
- mongodb备份还原脚本
同步 echo off ,%-%date:~,%-%date:~,% set bak_dir=mongo_na_world_svn2win_%time_dir% set fromdb=db_erago ...
随机推荐
- 使用jquery日期选择器flatpickr.js,使用js动态创建input元素时插件失效
最近写页面时需要用到,日期选择器,网上搜索了一些插件,最后使用了flatpickr.js.我是从npm 上拉下的依赖 npm install flatpickr --save 随后在页面中引入css ...
- 【Spark篇】---Spark资源调度和任务调度
一.前述 Spark的资源调度是个很重要的模块,只要搞懂原理,才能具体明白Spark是怎么执行的,所以尤其重要. 自愿申请的话,本文分粗粒度和细粒度模式分别介绍. 二.具体 Spark资源调度流程图: ...
- Python爬虫入门教程 27-100 微医挂号网专家团队数据抓取pyspider
1. 微医挂号网专家团队数据----写在前面 今天尝试使用一个新的爬虫库进行数据的爬取,这个库叫做pyspider,国人开发的,当然支持一下. github地址: https://github.com ...
- Lottie 动画里有图片怎么办?设计师小姐姐也能帮你减少开发量!
一.序 Hi,大家好,我是承香墨影! Lottie 是 Airbnb 开源的一套跨平台的完整解决方案,设计师只需要使用 After Effectes (之后简称 AE)设计出动画之后,使用 Lotti ...
- Chapter 4 Invitations——20
Well, that was fine. I could leave him alone. 行吧,但愿一切都好.我能让他一个人. I would leave him alone. 我也会让他一个人的. ...
- [一]FileDescriptor文件描述符 标准输入输出错误 文件描述符
文件描述符 当应用程序请求打开或者操作文件时,操作系统为应用程序设置一张文件列表,具体的实现形式此处不深入说明 操作系统会提供给你一个非负整数,作为一个索引号,它的作用就像地址或者说指针或者说偏移 ...
- eclipse导入别人工程项目后,出现红叉的各种情况
原文:http://www.cnblogs.com/mmzs/p/7662863.html 1.多半是因为jdk版本的原因,调整一下即可: 解决方法:Build Path ==> Configu ...
- CentOS 7 源码编译安装 NodeJS
1.安装 gcc.gcc-c++ yum -y install gcc gcc-c++ kernel-devel 2.下载源码 wget https://nodejs.org/dist/v8.11.3 ...
- 学JAVA第三天,JAVA第二章《JAVA数据类型》
---恢复内容开始--- <JAVA数据类型> 我们一般都用int类型,因为int类行一般的日常生活的数据都能满足了. 当然,想李嘉诚,马云这种有钱人,int类行就不能满足帮他记钱的了,像 ...
- 史上最全python面试题详解(四)(附带详细答案(关注、持续更新))
python高级进阶-网络编程和并发(?道题详解) 1.简述 OSI 七层协议. OSI是Open System Interconnection的缩写,意为开放式系统互联. OSI七层协议模型主要是: ...