题意:给出一个圆和两个点,求以这两个点为焦点的与圆相切的椭圆与圆的切点。椭圆要尽量小。
题解:三分。
代码:
#include<bits/stdc++.h>
using namespace std;
int T;
struct pnt
{
double x,y;
void in()
{
scanf("%lf%lf",&x,&y);
}
void out()
{
printf("%lf %lf\n",x,y);
}
};
const double eps=1e-10;
double dis(pnt x,pnt y)
{
return sqrt((x.x-y.x)*(x.x-y.x)+(x.y-y.y)*(x.y-y.y));
}
pnt get(pnt p,pnt p0,double r)
{
pnt ans;
double hh=dis(p,p0);
ans.x=p0.x+(p.x - p0.x)*r/hh;
ans.y=p0.y+(p.y - p0.y)*r/hh;
return ans;
}
pnt gm(pnt x,pnt y)
{
return (pnt){x.x+(y.x-x.x)/3,x.y+(y.y-x.y)/3};
}
int main()
{
scanf("%d",&T);
while(T--)
{
pnt p1,p2,p0,l,r;
double R;
p1.in();
p2.in();
p0.in();
scanf("%lf",&R);
l=get(p1,p0,R);
r=get(p2,p0,R);
// l.out();
// r.out();
while(abs(l.x-r.x)>eps||abs(l.y-r.y)>eps)
{/*
printf("l:");
l.out();
printf("r:");
r.out();
system("pause");*/
pnt m1=get(gm(l,r),p0,R),m2=get(gm(r,l),p0,R);
if(dis(m1,p1)+dis(m1,p2)>dis(m2,p1)+dis(m2,p2))
l=m1;
else
r=m2;
}
l.out();
}
}
新题就是容易登顶。