圆的反演+计算几何 - hdu6097
2017-08-11 20:05
267 查看
Mindis
题意:圆心 O 坐标(0, 0), 给定两点 P, Q(不在圆外),满足 PO = QO,要在圆上找一点 D,使得 PD + QD 取到最小值。数据范围:
T≤500000
−100≤x,y≤100
1≤r≤100
思路:
根据圆的反演,构造一个相似三角形,可以转换问题。
如果求得的距离小于eps,说明近似于原点,距离为2*r;
然后就根据两个反演点的中点到原点的距离 和半径进行比较,小于等于有交点,大于没有交点。
因为反演点与原点构成一个等腰三角形,所以用中点的距离进行判断就行了。
关于图的反演,可以看看大神的分析:ACdreamers
如果是小于的情况,那么有交点,结果就是两个反演点的直线距离,再乘以相似比。
如果大于,说明没有交点,这种情况就应该在P,Q两个点的连线的中垂线上。
根据比例,求出在圆上的点D的坐标,已知两点坐标就能求出距离。
题解:http://blog.csdn.net/a7f650ebd327889c/article/details/77070942(这个有图会好理解点)
AC代码:
#include <iostream> #include <stdio.h> #include <math.h> #define eps 1e-8 using namespace std; int main() { int t; scanf("%d",&t); double r,x1,x2,y1,y2; while(t--) { scanf("%lf%lf%lf%lf%lf",&r,&x1,&y1,&x2,&y2); double d1=sqrt(x1*x1+y1*y1); if(d1<eps) { printf("%.7f\n",r*2); continue; } double k=r*r/(d1*d1); double x3,y3,x4,y4; x3=x1*k,y3=y1*k; x4=x2*k,y4=y2*k; double mx=(x3+x4)/2,my=(y3+y4)/2; double d=sqrt(mx*mx+my*my),ans; if(d<=r) { double dis=sqrt((x3-x4)*(x3-x4)+(y3-y4)*(y3-y4)); ans=dis*d1/r; } else { double kk=r/d; double mxx=mx*kk,myy=my*kk; ans=2*sqrt((mxx-x1)*(mxx-x1)+(myy-y1)*(myy-y1)); } printf("%.7f\n",ans); } return 0; }
相关文章推荐
- 【计算几何】【圆反演】hdu6097 Mindis
- HDU 6097 Mindis【计算几何+反演点】
- 【计算几何】【圆反演】计蒜客17314 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛 G. Finding the Radius for an Inserted Circle
- 2017多校第6场 HDU 6097 Mindis 计算几何,圆的反演
- Codeforces Round #284 (Div. 1) A. Crazy Town 计算几何
- 计算几何初步认识
- NYOJ3—多边形重心问题(计算几何)&&hdu1115 Lifting the Stone
- NYOJ-3 多边形重心问题【计算几何】
- sgu209:Areas(计算几何)
- POJ 2002 二分 计算几何
- 通过程序设计几何图形、矩形、圆形、正方形、几种类型,能过利用接口和多态性计算几何图形的面积和周长并显示出来
- hdu2948 简单计算几何 判断点在三角形 矩形 圆形内
- hrbust 1069 哈理工oj Bee Movie【计算几何】【学习叉乘】
- NYOJ squares(计算几何+区间覆盖)
- 2017 ACM-ICPC乌鲁木齐网络赛 B. Out-out-control cars【计算几何||判断射线与线段是否相交】
- POJ 1113 Wall(计算几何--凸包的周长)
- 计算几何 模板
- POJ 1696 Space Ant (计算几何 + 极角排序)
- bzoj1913[Apio2010]signaling 信号覆盖 计算几何