题意:给定两个相离的圆和圆外定点 P P P,求过点 P P P且与已知的两个圆外切的所有圆。
思路:
圆的反演变换入门题。
掌握两个关于圆反演的性质即可解决该问题。
一是相切两圆的反相仍相切,若反相均为直线,则平行。
二是经过反演中心的圆,其反相为直线。
故我们可以以P为反演中心,任意值为反演半径。先求出两个已知圆的反演圆,则与两个反演圆外切的直线,其反演后一定满足:
(1).与两个圆的原形相切。
(2).一定通过反演中心P点。
因题目是求外切,故注意一下反演圆圆心和P点应在切线同一侧,这样就能保证切线反演以后是与原形外切的圆。
代码:
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const double eps = 1e-10;
class Point{
public:
double x,y;
Point(double _x=0,double _y=0):x(_x),y(_y){
}
Point operator + (Point rhs){
return Point(x+rhs.x,y+rhs.y);}
Point operator - (Point rhs){
return Point(x-rhs.x,y-rhs.y);}
Point operator * (double rhs){
return Point(x*rhs,y*rhs);}
Point operator / (double rhs){
return Point(x/rhs,y/rhs);}
Point Move