商汤科技近日推出的 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是可以暴力枚举的,如果你能想到上面的证明

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

最新文章

  1. JS高程3.基本概念(5)语句
  2. flume 使用 spool source的时候字符集出错
  3. 第2章 面向对象的设计原则(SOLID):2_里氏替换原则(LSP)
  4. 使用shape设置只有部分边框有颜色
  5. 数据库设置表的check约束出现乱码
  6. 机器学习笔记1——Introduction
  7. 关于 从别人电脑上 高版本的 Xcode上拷贝过来的项目的 不能运行模拟器的 解决方法
  8. 检测页面的localstorage剩余容量
  9. Orchard 源码探索(Application_Start)之异步委托调用
  10. 已在Terminal安装了包,PyCharm却提示无法找到
  11. bzoj 2038 小z的袜子 莫队
  12. matplotlib的读书笔记
  13. Python终极coding
  14. How to identify safari in Mac?
  15. python日志,一个改版SMTPHandler
  16. Spring Boot 学习视频
  17. WebDriverAPI(4)
  18. oc消息转发:forwardInvocation、签名、参量个数、SEL 相关测试
  19. UOJ#347. 【WC2018】通道(边分治)
  20. CentOS下输入输出重定向

热门文章

  1. 基于 WebRTC 实现自定义编码分辨率发送
  2. PAT练习num3-跟奥巴马一起学编程
  3. Python_ 1生成器(上)初识生成器
  4. Object level permissions support
  5. 用好Java中的枚举真的没有那么简单
  6. 常见JVM面试题及答案整理
  7. Linux常用命令,目录解析,思维导图
  8. idea中将普通工程设置为maven项目
  9. KVM之XFS磁盘扩容
  10. JVM探究——转载