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 ...
随机推荐
- Linux 遭入侵,挖矿进程被隐藏排查记录
今天来给大家分享下这两天遇到的一个问题,服务器被挖矿了,把我的排查记录分享下,希望能帮到有需要的同学. 问题原因 多台服务器持续告警CPU过高,服务器为K8s的应用节点,正常情况下CPU使用率都挺低的 ...
- Ceres Solver 在win8+vs2013环境下的安装
参考博文:https://blog.csdn.net/wzheng92/article/details/79504709
- android 垃圾回收机制
1.垃圾收集算法的核心思想 java语言提供了自动的GC机制,系统会经常检查内存,采用对象引用计数的方式,将引用次数为0的对象回收.这样可以防止两个危险:(1)防止无用对象占用内存资源 (2)防止有用 ...
- Net Configuration Agent
提出Configuration Agent这样一个东西可能会让人感到奇怪,对于配置信息读取什么还需要一个Agent;那Agent的作用是什么,能达到一个怎样的目的,下面讲解为何需要Agent和其重要性 ...
- 不在models.py中的models
概述 如何让你定义的model不在models.py中 在app的models目录中的models 你新建一个app后这个models.py就会自动建立,里面只有几行代码.那么如果是一个中大型项目,每 ...
- Linux服务器时间相关命令记录
前言 以往安装服务器时间都是正常,但是最近服务器的时间经常出现问题,所以在安装配置完成服务器之后需要对服务器的时间进行测试,如果服务器时间异常,那么当程序去取系统时间的时候就会出现问题. 时间相关命令 ...
- 15分钟在阿里云Kubernetes服务上快速建立Jenkins X Platform并运用GitOps管理应用发布
本文主要介绍如何在阿里云容器服务Kubernetes上快速安装部署Jenkins X Platform并结合demo实践演示GitOps的操作流程. 注意:本文中使用的jx工具.cloud-envir ...
- linux集群自动化搭建(生成密钥对+分发公钥+远程批量执行脚本)
之前介绍过ansible的使用,通过ssh授权批量控制服务器集群 但是生成密钥和分发公钥的时候都是需要确认密码的,这一步也是可以自动化的,利用ssh + expect + scp就可以实现,其实只用这 ...
- 痞子衡嵌入式:语音处理工具Jays-PySPEECH诞生记(5)- 语音识别实现(SpeechRecognition, PocketSphinx0.1.15)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是语音处理工具Jays-PySPEECH诞生之语音识别实现. 语音识别是Jays-PySPEECH的核心功能,Jays-PySPEECH借 ...
- MySQL/MariaDB系列文章目录
以下是本系列文章的大纲,此页博文完全原创,花费了作者本人的极大心血,如转载,请务必标明原文链接. 如果觉得文章不错,还请帮忙点下"推荐",各位的支持,能激发和鼓励我更大的写作热情. ...