商汤科技近日推出的 SenseVideo 能够对视频监控中的对象进行识别与分析,包括行人检测等。在行人检测问题中,最重要的就是对行人移动的检测。由于往往是在视频监控数据中检测行人,我们将图像上的行人抽象为二维平面上若干个的点。那么,行人的移动就相当于二维平面上的变换。

在这道题中,我们将行人的移动过程抽象为 旋转、伸缩、平移,有 44 个 移动参数:\theta, scale, d_x,d_yθ,scale,d​x​​,d​y​​。每次行人的移动过程会将行人对应的 nn 个点全部依次应用旋转、伸缩、平移,对于平移前的点 (x, y)(x,y),进行每种操作后的坐标如下:

  • 旋转后的坐标为:(x \cos\theta - y \sin\theta, x \sin\theta + y \cos\theta)(xcosθ−ysinθ,xsinθ+ycosθ);
  • 伸缩后的坐标为:(x \times scale, y \times scale)(x×scale,y×scale);
  • 平移后的坐标为:(x + d_x, y + d_y)(x+d​x​​,y+d​y​​)。

由于行人移动的特殊性,我们可以确保 0 < scale \le 100<scale≤10。和简单版本不同的是,这道题处理的坐标为浮点数而非整数。

很显然,通过变换前后的正确坐标,很容易算出行人的移动参数,但问题没有这么简单。由于行人实际的移动并不会完全按照我们预想的方式进行,因此,会有一部分变换后的坐标结果不正确,但可以确保 结果不正确的坐标数量严格不超过一半。

你现在作为商汤科技的实习生,接手了这个有趣的挑战:算出行人的移动参数。如果不存在一组合法的移动参数,则随意输出一组参数;如果有多种合法的移动参数,输出其中任意一组合法的即可。

输入格式

第一行输入一个整数 nn,表示行人抽象出的点数。

接下来 nn 行,每行 44 个 浮点数。前两个数表示平移前的坐标,后两个数表示平移后的坐标。

坐标范围在 -10^9−10​9​​ 到 10^910​9​​ 之间,输入的坐标都保留到 66 位小数。

对于中等版本,1 \le n \le 5001≤n≤500;

对于困难版本,1 \le n \le 10^{5}1≤n≤10​5​​。

输出格式

第一行输出一个浮点数 \thetaθ,第二行输出一个浮点数 scalescale,第三行输出两个浮点数 d_x,d_yd​x​​,d​y​​。

建议输出保留到 1010 位小数或以上。我们会按照 10^{-3}10​−3​​ 的精度判断是否有超过一半的点变换后的坐标重合。

样例输入

5
0 0 -1 1
0 1 -2 1
1 0 -1 2
1 1 0 0
2 1 1 0

样例输出

1.5707963268
1
-1 1

解题思路: 
n^2枚举点对,然后根据这对点算出四个参数,然后重新跑一遍点,判断有多少个点的变换符合这个四个参数,超过一半就正确直接输出。 
具体的算法。 
scale 两个点之间的距离跟旋转和平移都没有关系,然后根据相似三角形可以知道两点之间距离的变化就是scale。

坐标旋转量θ:旋转坐标前两个点形成的直线向量A,和旋转坐标后的两个点形成的直线向量B,A,B的夹角就是θ,可以证明,这里就不说了,然后用一下公式cosθ=A*B/(|A|*|B|), 就能算出角度了。

dx,dy用scale和θ算出的坐标和题目给的坐标一减就出来了

。。真强。。。这位大佬高中数学肯定贼好。。数学弱只能感受一波了,原来利用任意两个点 本来->变化后,可以求出这么多东西,可以求出伸缩量,利用旧的两点距离和新的亮点距离成比例就好,还有就是角度,利用旧的线的旋转角度后变成新的线的角度(。。强。。然后就可以利用 A*B/(|A|*|B|) 求出角度了。。涨知识。。虽然不知道会记住多少。。加油加油)

A,B 都为两点相减。 
坑点:一定要输出10位以后,scanf一定要%lf 输出%lf 或者 %.11f 都可以

上面的证明我不会,问题其实还没有解决

原问题是:(x1,y1)=>(x2,y2),当然(x1,y1)依次经过旋转缩放和平移得到了(x2,y2)

如何求出旋转量theta,缩放比例和平移的横纵坐标呢

这.....想了很久,没想出来

但是题解是这么搞的,枚举变换的两对点对,根据每个点对变换前的点连线,和变换后的两个点连线,然后根据余弦定理算出角度,顺便算出缩放比例

然后返回去算下平移变化....

也就是说,相当于增加了方程变量的个数,它的意思是说,角度theta是可以暴力枚举的,如果你能想到上面的证明

于是我发现我的推理能力还是太弱了

计蒜客 第四场 C 商汤科技的行人检测(中等)平面几何好题的更多相关文章

  1. 计蒜客-第五场初赛-第二题 UCloud 的安全秘钥(简单)

    每个 UCloud 用户会构造一个由数字序列组成的秘钥,用于对服务器进行各种操作.作为一家安全可信的云计算平台,秘钥的安全性至关重要.因此,UCloud 每年会对用户的秘钥进行安全性评估,具体的评估方 ...

  2. 计蒜客第五场 UCloud 的安全秘钥(中等) (尺取游标法

    每个 UCloud 用户会构造一个由数字序列组成的秘钥,用于对服务器进行各种操作.作为一家安全可信的云计算平台,秘钥的安全性至关重要.因此,UCloud 每年会对用户的秘钥进行安全性评估,具体的评估方 ...

  3. 计蒜客 31451 - Ka Chang - [DFS序+树状数组][2018ICPC沈阳网络预赛J题]

    题目链接:https://nanti.jisuanke.com/t/31451 Given a rooted tree ( the root is node $1$ ) of $N$ nodes. I ...

  4. 计蒜客 31436 - 提高水平 - [状压DP]

    题目链接:https://nanti.jisuanke.com/t/31436 作为一名车手,为了提高自身的姿势水平,平时的练习是必不可少的.小 J 每天的训练包含 $N$ 个训练项目,他会按照某个顺 ...

  5. 2019计蒜客信息学提高组赛前膜你赛 #2(TooYoung,TooSimple,Sometimes Naive

    计蒜客\(2019CSP\)比赛第二场 巧妙爆零这场比赛(我连背包都不会了\(QWQ\) \(T1\) \(Too\) \(Young\) 大学选课真的是一件很苦恼的事呢! \(Marco\):&qu ...

  6. 计蒜客模拟赛5 D2T1 成绩统计

    又到了一年一度的新生入学季了,清华和北大的计算机系同学都参加了同一场开学考试(因为两校兄弟情谊深厚嘛,来一场联考还是很正常的). 不幸的是,正当老师要统计大家的成绩时,世界上的所有计算机全部瘫痪了. ...

  7. 计蒜客 31434 - 广场车神 - [DP+前缀和]

    题目链接:https://nanti.jisuanke.com/t/31434 小 D 是一位著名的车手,他热衷于在广场上飙车.每年儿童节过后,小 D 都会在广场上举行一场别样的车技大赛. 小 D 所 ...

  8. 计蒜客 28449.算个欧拉函数给大家助助兴-大数的因子个数 (HDU5649.DZY Loves Sorting) ( ACM训练联盟周赛 G)

    ACM训练联盟周赛 这一场有几个数据结构的题,但是自己太菜,不会树套树,带插入的区间第K小-替罪羊套函数式线段树, 先立个flag,BZOJ3065: 带插入区间K小值 计蒜客 Zeratul与Xor ...

  9. 计蒜客 作弊揭发者(string的应用)

    鉴于我市拥堵的交通状况,市政交管部门经过听证决定在道路两侧安置自动停车收费系统.当车辆驶入车位,系统会通过配有的摄像头拍摄车辆画面,通过识别车牌上的数字.字母序列识别车牌,通过连接车管所车辆信息数据库 ...

随机推荐

  1. 善用tempfile库创建python进程中的临时文件

    技术背景 临时文件在python项目中时常会被使用到,其作用在于随机化的创建不重名的文件,路径一般都是放在Linux系统下的/tmp目录.如果项目中并不需要持久化的存储一个文件,就可以采用临时文件的形 ...

  2. Java语法糖详解

    语法糖 语法糖(Syntactic Sugar),也称糖衣语法,是由英国计算机学家 Peter.J.Landin 发明的一个术语,指在计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更 ...

  3. PE节表

  4. Kubernetes TensorFlow 默认 特定 集群管理器 虚拟化技术

    Our goal is to foster an ecosystem of components and tools that relieve the burden of running applic ...

  5. 进程的创建-multiprocessing

    multiprocessing模块就是跨平台版本的多进程模块,提供了一个Process类来代表一个进程对象,这个对象可以理解为是一个独立的进程,可以执行另外的事情 1. 2个while循环一起执行 # ...

  6. 济南学习D3T1__线性筛和阶乘质因数分解

    [问题描述] 从1− N中找一些数乘起来使得答案是一个完全平方数,求这个完全平方数最大可能是多少. [输入格式] 第一行一个数字N. [输出格式] 一行,一个整数代表答案对100000007取模之后的 ...

  7. 客户端,Scala:Spark查询Phoenix

    客户端,Scala:Spark查询Phoenix 1.pom.xml 2.配置文件 2.1config.properties 2.2MyConfig 3.entity实体(与phoenix中的tabl ...

  8. Linux环境Hive安装配置及使用

    Linux环境Hive安装配置及使用 一.Hive Hive环境前提 二.Hive架构原理解析 三.Hive-1.2.2单机安装流程 (1) 解压apache-hive-1.2.2-bin.tar.g ...

  9. 网络编程(socket简介)

    socket简介 Python 提供了两个基本的 socket 模块. 第一个是 Socket,它提供了标准的 BSD Sockets API. 第二个是 SocketServer, 它提供了服务器中 ...

  10. msf+cobaltstrike联动(一):把msf的session发给cobaltstrike

    前提:MFS已经获取到session,可以进入metepreter,现在需要使用cobaltstrike进行图形化管理或团队协作. cobaltstrike起一个beacon监听,如使用:window ...