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

题目描述: 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. iOS——调试工具LLDB学习

    一.前言 LLDB是个开源的内置于XCode的具有REPL(read-eval-print-loop)特征的Debugger,其可以安装C++或者Python插件.在日常的开发和调试过程中给开发人员带 ...

  2. 【spring】静态资源的访问受限解决方法

    前言 我们知道在整合spring mvc框架的时候需要在web.xml中配置一个servlet 代码如下 <!--spring mvc 的DispatcherServlet--> < ...

  3. Python内置函数(62)——sum

    英文文档: sum(iterable[, start]) Sums start and the items of an iterable from left to right and returns ...

  4. Java8 新特性 | 如何风骚走位防止空指针异常

    文章整理翻译自 https://winterbe.com/posts/2015/03/15/avoid-null-checks-in-java/ 文章首发于个人网站: https://www.exce ...

  5. Vue API(directives) 自定义指令

    前言:除了vue的内置指令以外,我们可以定义自定义指令.内置指令表相见:https://www.cnblogs.com/ilovexiaoming/p/6840383.html 我们定义一个最简单的 ...

  6. asp.net core 系列 8 Razor框架路由(下)

    三.页面路由操作约定 接着上篇讲asp.net core 系列 7 Razor框架路由.在上篇继续第三节 "页面路由操作约定" 的最后一小节 AddPageRoute . 3.3. ...

  7. 【安卓本卓】Android系统源码篇之(一)源码获取、源码目录结构及源码阅读工具简介

    前言        古人常说,“熟读唐诗三百首,不会作诗也会吟”,说明了大量阅读诗歌名篇对学习作诗有非常大的帮助.做开发也一样,Android源码是全世界最优秀的Android工程师编写的代码,也是A ...

  8. JS 中 原生方法 (四) --- Object

    Javascript 中 str. arr.date.obj 等常见的原生方法总结 本文也说主要阐释了 Javascript 中的基础类型和 引用类型的自带方法,那么熟悉的同学又可以绕道了 总是绕道, ...

  9. [ SSH框架 ] Spring框架学习之三(AOP开发和注解的使用)

    一.Spring 使用 AspectJ 进行 AOP 的开发:注解的方式 1.1 引入相关的jar包 1.2 引入spring的配置文件 <?xml version="1.0" ...

  10. [Vue] vue跳转外部链接

    问题 vue 跳转外部链接问题,当跳转的时候会添加在当前地址后面 var url = 'www.baidu.com' //跳转1 window.localtion.href = url //跳转2 w ...