求两圆公切线的交点,水题。只求外公切线交点。
不可能有外公切线的情况是,半径相等或者内含,内切的情况。
只求交点的话,画图,根据x y的比例关系就可以求得。
#include <queue>
#include <stack>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <limits.h>
#include <string.h>
#include <string>
#include <algorithm>
using namespace std;
struct point {double x,y;};
point a,b;
const double eps = 1e-6;
bool dy(double x,double y) { return x > y + eps;} // x > y
bool xy(double x,double y) { return x < y - eps;} // x < y
bool dyd(double x,double y) { return x > y - eps;} // x >= y
bool xyd(double x,double y) { return x < y + eps;} // x <= y
bool dd(double x,double y) { return fabs( x - y ) < eps;} // x == y
double disp2p(point a,point b)
{
return sqrt( ( a.x - b.x ) * ( a.x - b.x ) + ( a.y - b.y ) * ( a.y - b.y ) );
}
bool c2c_ainb(point a,double r1,point b,double r2)
{
return xyd(disp2p(a,b),r2 - r1) || xyd(disp2p(a,b),r1 - r2);
}
int main()
{
int ncases;
double r1,r2;
scanf("%d",&ncases);
while( ncases-- )
{
scanf("%lf%lf%lf",&a.x,&a.y,&r1);
scanf("%lf%lf%lf",&b.x,&b.y,&r2);
if( dd(r1,r2) || c2c_ainb(a,r1,b,r2) )
{
printf("Impossible.\n");
continue;
}
if( dy(r1,r2) )
{
swap(r2,r1);
swap(a,b);
}
double x = (r2*a.x - r1*b.x)/(r2 - r1);
double y = (r2*a.y - r1*b.y)/(r2 - r1);
printf("%.2lf %.2lf\n",x,y);
}
return 0;
}