Mindis(圆的反演变换)
来源:互联网 发布:刘怀 大数据 编辑:程序博客网 时间:2024/05/21 15:50
题意:
圆心 O 坐标(0, 0), 给定两点 P, Q(不在圆外),满足 PO = QO, 要在圆上找一点 D,使得 PD + QD 取到最小值。
官方题解:
做P点关于圆的反演点P',OPD与ODP'相似,相似比是|OP| : r。
Q点同理。
极小化PD+QD可以转化为极小化P'D+Q'D。
当P'Q'与圆有交点时,答案为两点距离,否则最优值在中垂线上取到。
时间复杂度
O(1)
反演的定义:
已知一圆C,圆心为O,半径为r,如果P与P’在过圆心O的直线上,且,则称P与P'关于O互为反演。
反演的性质:
除反演中心外,平面上的每一个点都只有唯一的反演点,且这种关系是对称的,位于反演圆上的点,保持在原处,位于
反演圆外部的点,变为圆内部的点,位于反演圆内部的点,变为圆外部的点。 举个最简单的例子,区间以1为反演
半径,那么反演后的区间就是,这就是一维反演,而圆的反演是二维反演。
P向圆反演后的到P',可以推出P'DO 与 PDO是相似三角形,那么PD的距离就可以通过P'D来算
Q点同理。
当 P'Q' 与圆有交点时:
不妨设交点为 O',若 D 不为 O',则 P'D + Q'D > P'Q'(三角形两边之和大于第三边);当且仅当 D 取 O' 时,P'Q + Q'D 取到最小值,即为 P'Q'。
当 P'Q' 与圆无交点时:
不妨将 P' 与 Q' 看成椭圆的两个焦点,当椭圆慢慢变大时,第一个碰到的圆上的点 D 即为使得 P'D + Q'D 最小的点;画个图就很显然了,第一个碰到的点即为 PQ 的中垂线与圆的交点。
至于判断有 P'Q' 与圆有没有交点,就是圆心到直线的距离与半径比较,又因为此处 P'O=Q'O,所以只需要比较 P'Q' 的中点到圆心的距离和半径的大小。
#include<bits/stdc++.h>#define eps 1e-6using namespace std;int main(){ //std::ios::sync_with_stdio(false); //std::cin.tie(0); double x1,y1,x2,y2,r,ans,dist; int t; scanf("%d",&t); while(t--) { scanf("%lf%lf%lf%lf%lf",&r,&x1,&y1,&x2,&y2); double d=sqrt(x1*x1 + y1*y1); if(d<eps) { printf("%.7lf\n",2*r); continue; } double k=(r*r)/(d*d); // Q这个点反演点与他到圆心的比例 double x3=x1*k,y3=y1*k,x4=x2*k,y4=y2*k; double ox=(x3+x4)/2,oy=(y3+y4)/2; //P,Q中点坐标 double dis=sqrt(ox*ox + oy*oy); if(dis <= r) { dist=sqrt((x3-x4)*(x3-x4) + (y3-y4)*(y3-y4)); ans=dist*d/r; printf("%.7lf\n",ans); } else { dis=dis-r; double temp=sqrt((x3-x4)*(x3-x4) + (y3-y4)*(y3-y4))/2; dist=sqrt(temp*temp + dis*dis ); ans=(dist +dist)*d/r; printf("%.7lf\n",ans); } }}
阅读全文
0 0
- Mindis(圆的反演变换)
- hdu6097 Mindis【圆的反演】
- HDU 6097 Mindis(圆的反演)
- 圆的反演变换
- 【圆的反演变换】hdu4773
- 圆的反演变换(*)
- hdu6097 Mindis 2017多校第六场1002 圆的反演
- HDU 6097 Mindis(反演)
- 【圆的反演变换+cdq分治】共点圆
- 圆的反演变换(HDU4773)
- hdu 4773 圆的反演变换
- HDU 2017 多校联合训练赛6 1002 6097 Mindis 反演变换 计算几何
- hdu 6097 Mindis (反演点)
- hdu 6097 Mindis(几何反演)
- 反演变换
- 反演变换
- HDU 6097 Mindis【计算几何+反演点】
- 离散变换和反演
- inline、block、inline-block的区别
- 51nod 1557(两个集合)
- OpenContrail架构浅析
- 【操作系统】存储器管理
- zabbix网站安装
- Mindis(圆的反演变换)
- Windows 下 Spark 安装和配置
- CDQZ Challenge 9
- Tomcat集群Cluster实现原理剖析
- 进制转换整理
- 冒泡排序(bubble sort)
- VGA GPU passthrough qemu虚拟桌面pci穿透
- 冒泡排序原理(java实现)
- 朱有鹏免费嵌入式,单片机视频