做的正儿八经的计算几何题不多,慢慢来吧。

题目描述: 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的更多相关文章

  1. oracle sql查询转义下划线

    1,看以下结果 select * from test where login like '%CF_%'; LOGIN------------------------------------------ ...

  2. Oracle 11g 中恢复管理器RMAN介绍

    这是我平时摘录的笔记,从管理艺术那本书上摘录出来的,放到这里 RMAN 可在数据库服务器的帮助下从数据库内备份数据文件,可构造数据文件映像副本.控制文件和控制文件映像.对当日志 SPFILE 和RMA ...

  3. RMAN数据库异机迁移步骤

    --RMAN数据库异机迁移步骤----------------------------2013/09/28 测试环境:AIX+ora11g   一. source数据库准备.   1.获取数据文件编号 ...

  4. RMAN备份与恢复深入解<一>

    一 数据库版本 SQL> select *from v$version; BANNER ----------------------------------------------------- ...

  5. 左右10g DG中间ORA-19527和ORA-00312错误解决演示示例

    这些天大厦10g DG Windows 2008 R2测试环境,主要明天去给客户端,再建一个生产资源库DG,其中一些发现的问题.特此记录下来 因为将要部署到生产环境.所以考虑在线搭建DG的方案,即不停 ...

  6. 配置RMAN备份环境

    关于配置RMAN备份环境你可以给每个目标数据库设置一些固定的配置,这些配置控制着RMAN多个方面的行为.例如,你可配置备份的保存策略.默认的备份目录.默认的备份设备类型等.你可以用show命令来查看配 ...

  7. 如何用kaldi做孤立词识别-初版

    ---------------------------------------------------------------------------------------------------- ...

  8. hdu 5667 BestCoder Round #80 矩阵快速幂

    Sequence  Accepts: 59  Submissions: 650  Time Limit: 2000/1000 MS (Java/Others)  Memory Limit: 65536 ...

  9. mongodb备份还原脚本

    同步 echo off ,%-%date:~,%-%date:~,% set bak_dir=mongo_na_world_svn2win_%time_dir% set fromdb=db_erago ...

随机推荐

  1. 记录一次安装OpenGL的漫长过程

    尝试codeblock和Dev-C++ 这学期新开了一门计算机图形图像的课,里面涉及到openGL,中午跑到图书馆开始倒腾OpenGL. 因为电脑里本来有codeblock,于是就想不用教材里面所说的 ...

  2. Json数组转换字符串、字符串转换原数组......

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  3. Java 11新功能抢先了解

    目前 Oracle 已经发布了 Java Development Kit 10,下个版本 JDK 11 也即将发布.本文介绍 Java 11 的新功能. 根据Oracle新出台的每6个月发布一次Jav ...

  4. 【SQL进阶】03.执行计划之旅1 - 初探

    听到大牛们说执行计划,总是很惶恐,是对知识的缺乏的惶恐,所以必须得学习执行计划,以减少对这一块知识的惶恐,下面是对执行计划的第一讲-理解执行计划. 本系列[T-SQL]主要是针对T-SQL的总结. S ...

  5. Zabbix通过IPMI监控HPE服务器硬件

    IPMI是智能型平台管理接口(Intelligent Platform Management Interface)的缩写,是管理基于 Intel结构的企业系统中所使用的外围设备采用的一种工业标准,该标 ...

  6. 『骑士精神 IDA*』

    骑士精神(SCOI2005) Description 在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个空位.在任何时候一个骑士都能按照骑 士的走法(它可以走到和它横坐标相差为1,纵 ...

  7. WebSocket刨根问底(二)

    上篇文章[WebSocket刨根问底(一)]中我们对WebSocket的一些基本理论进行了介绍,但是并没有过多的涉及到一些实战的内容,今天我希望能够用几个简单的案例来向小伙伴们展示下WebSocket ...

  8. PWA的探索与应用

    本文由云+社区发表 PWA(Progressive Web App)起源背景 传统的Web网页存在以下几个问题: 进入一个页面必须要记住它的url或者加入书签,入口不便捷: 没网络就没响应,不具备离线 ...

  9. springmvc 项目完整示例07 设置配置整合springmvc springmvc所需jar包springmvc web.xml文件配置

    前面主要是后台代码,spring以及mybatis的整合 下面主要是springmvc用来处理请求转发,展现层的处理 之前所有做到的,完成了后台,业务层和持久层的开发完成了 接下来就是展现层了 有很多 ...

  10. 【Node.js】通过mongoose得到模型,不能新添字段的问题

    问题描述 通过node.js为查询到的json对象添加新的字段,对象成功保存到数据库中,但新增字段却没保存. 前几天用vue+node.js+mongodb技术做一个购物车功能的网页,发现node.j ...