给你一个中心在原点的圆,再给你俩在圆内且到原点距离相等的点P,Q,让你在圆上求一点D,最小化DP+DQ。

http://blog.csdn.net/qq_34845082/article/details/77099332

附:过反演中心的圆反演后变成一条和该圆正交的直线。

不过反演中心的圆反演后是一个与原圆关于反演中心位似的圆。

不过反演中心的直线反演后变成一个过反演中心且与其正交的圆。

#include<cstdio>
#include<cmath>
using namespace std;
const double EPS=0.0000000001;
struct Point{
double x,y;
Point(){}
Point(const double &x,const double &y){
this->x=x;
this->y=y;
}
double length(){
return sqrt(x*x+y*y);
}
void read(){
scanf("%lf%lf",&x,&y);
}
}p,q;
double R;
typedef Point Vector;
Vector unit(Vector v){
double l=v.length();
return Vector(v.x/l,v.y/l);
}
Point CalcMid(const Point &a,const Point &b){
return Point((a.x+b.x)*0.5,(a.y+b.y)*0.5);
}
double sqr(const double &x){
return x*x;
}
Vector operator - (const Point &a,const Point &b){
return Vector(a.x-b.x,a.y-b.y);
}
Vector operator * (const double &K,const Vector &v){
return Vector(K*v.x,K*v.y);
}
int T;
int main(){
scanf("%d",&T);
for(;T;--T){
scanf("%lf",&R);
p.read();
q.read();
if(fabs(p.x)<EPS && fabs(p.y)<EPS){
printf("%.10lf\n",2.0*R);
continue;
}
Point mp=CalcMid(p,q);
Point P=Point((p-mp).length(),sqrt(sqr(p.length())-sqr((p-mp).length())));
Point Pp=R*R/P.length()*unit(P);
if(Pp.y-R>EPS){
printf("%.10lf\n",P.length()/R*2.0*(Pp-Point(0.0,R)).length());
}
else{
printf("%.10lf\n",P.length()/R*2.0*Pp.x);
}
}
return 0;
}

最新文章

  1. 学习git与github的二三bug
  2. php : Warning: strftime(): It is not safe to rely on the system&#39;s timezone settings.
  3. 表单验证插件 - formValidator
  4. DOM扩展之Selectors API
  5. winform 开发之Control.InvokeRequired
  6. delphi 默认字体修改
  7. 仿新浪微博短网址PHP实现方案
  8. Sass与Compress实战:第一章
  9. inux的进程-进程的概念和fork创建进程
  10. Python字符串拼接的6种方法(转)
  11. SAS对数据变量的处理
  12. 【Python026--字典内键方法】
  13. JavaScript的几个概念简单理解(深入解释见You Don&#39;t know JavaScript这本书)
  14. [转]Java GC的原理
  15. ASP.NET Core WebApi 项目部署到 IIS 服务器的总结
  16. 字典学习(Dictionary Learning, KSVD)详解
  17. EditPlus 4.3.2560 中文版已经发布
  18. css布局:定宽,自适应
  19. IOS系统之蓝牙外接设备
  20. C#.NET常见问题(FAQ)-如何把资源嵌入到项目中

热门文章

  1. hdu 2795 Billboard(线段树+单点更新)
  2. Spark-2.3.2【SparkStreaming+SparkSQL-实时仪表盘应用】
  3. 上传漏洞新姿势(限Linux)
  4. cuda中的二分查找
  5. 工具===代替cmd的conemu设置
  6. python实战===国内很简单实用的一些开源的api以及开源项目
  7. 浅谈linux的死锁检测 【转】
  8. iptables 操作
  9. [hadoop][会装]hadoop ha模式安装
  10. C++——初识C++