题意
给定三个圆坐标以及半径,求一个点坐标,使得点三个圆的视角相等
题解
- 数学方法解几何问题:给定三个圆,找一个点,使得这三个圆的视角相等
- 玄学之模拟退火(代码部分)
知识点
模拟退火
代码
#include<cstdio>
#include<cmath>
int f;
double s,dx,dy,x[3],y[3],r[3],t[3];
double F(double dx, double dy) {
double ret=0;
for(int i=0; i<3; i++)
t[i]=sqrt((dx-x[i])*(dx-x[i])+(dy-y[i])*(dy-y[i]))/r[i];
for(int i=0; i<3; i++)
ret+=(t[i]-t[(i+1)%3])*(t[i]-t[(i+1)%3]);
return ret;
}
int main() {
for(int i=0; i<3; i++)
scanf("%lf%lf%lf",x+i,y+i,r+i);
for(int i=0; i<3; i++){
dx+=x[i]/3;
dy+=y[i]/3;
}
for (s=1; s>1e-6; f=0) {
if (F(dx,dy)>F(dx+s,dy)) dx+=s, f=1;
else if (F(dx,dy)>F(dx-s,dy)) dx-=s, f=1;
else if (F(dx,dy)>F(dx,dy+s)) dy+=s, f=1;
else if (F(dx,dy)>F(dx,dy-s)) dy-=s, f=1;
if (!f) s*=0.5;
}
if (F(dx,dy)<1e-5) printf("%.5lf %.5lf\n",dx,dy);
return 0;
}