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

题目描述: 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. Saiku嵌入系统使用时传参数访问saiku(十六)

    Saiku嵌入系统使用时传参数访问saiku Saiku通过iframe嵌入其他系统使用时,我们可以设定参数信息,然后根据url中参数对结果进行筛选哦. 这里我们实现的是根据日期字段进行范围查询,UR ...

  2. 46道史上最全Redis面试题,面试官能问的都被我找到了(含答案)

    Redis高性能缓存数据库 1.什么是 Redis?简述它的优缺点? Redis 的全称是:Remote Dictionary.Server,本质上是一个 Key-Value 类型的内存数据库,很像m ...

  3. java中子类继承父类程序执行顺序问题

    Java中,new一个类的对象,类里面的静态代码块.非静态代码.无参构造方法.有参构造方法.类的一般方法等部分,它们的执行顺序相对来说比较简单,用程序也很容易验证.比如新建一个测试父类. public ...

  4. Spring Boot @ControllerAdvice 处理全局异常,返回固定格式Json

    需求 在构建RestFul的今天,我们一般会限定好返回数据的格式比如: { "code": 0,  "data": {},  "msg": ...

  5. spark Could not write all entries

    使用 spark 将 dataFrame 储存到 elasticsearch 出现如下报错: Caused by: org.elasticsearch.hadoop.EsHadoopException ...

  6. 【offer收割机必备】我简历上的Java项目都好low,怎么办?

    这篇文章我们来聊一聊,在系统设计和项目经验这两块,应该如何充分的准备,才能拿出有技术含量的项目经验战胜跟你同台竞技的其他工程师,征服你的面试官,收获各种心仪的offer. (1)高级工程师必备:系统设 ...

  7. C++版 - UVa1585 Score - 题解

    C++版 - UVa1585 Score - 题解 <算法竞赛入门经典(第二版)> 习题3-1 得分(ACM/ICPC Seoul 2005,UVa1585) 问题描述: 给出一个由O和X ...

  8. Spring 完美配置跨域请求

    在SpringBoot2.0 上的跨域 用以下代码配置 即可完美解决你的前后端跨域请求问题 import org.springframework.context.annotation.Bean; im ...

  9. Chapter 5 Blood Type——11

    "I just wondered… if you could warn me beforehand the next time you decide to ignore me for my ...

  10. 基于 Zookeeper 的分布式锁实现

    1. 背景 最近在学习 Zookeeper,在刚开始接触 Zookeeper 的时候,完全不知道 Zookeeper 有什么用.且很多资料都是将 Zookeeper 描述成一个“类 Unix/Linu ...