反演是平面上点到点的一个映射,除反演中心外每个点都有唯一的反演点与之对应
通过画图可以知道一些性质:
- 反演点在圆上,圆会反演成一条直线
- 反演点不在圆上,圆会反演成一个圆,与原来的圆位似
- 反演点在直线上,直线会反演成它本身
- 反演点不在直线上,直线会反演成一个圆
- 反演过后的相切关系不会改变
【HDU4773】Problem of Apollonius
给两个圆,一个点 ,求过 的一个或两个圆与这两个圆相切
考虑在
点反演,那么所求的圆会反演成一个直线
注意到如果是内切的话反演回去是一个外切一个内切,如果要两个外切的话两个圆心,反演点在外公切线的同一侧,利用初中知识求出外公切线再判断就可以了
圆反演出去可以用初中的相似,直线反演回来的时候,半径可以通过向直线做垂线的长度得到,而直径一定与垂线重合,于是可以较为方便得求出圆心和半径
初中几何题,将两个点按圆
反演出去,由于
,那么
的相似比相同
于是最小的时候就是
的连线,看与圆有没有交点讨论就可以了
按两个大圆相切的地方反演,那么会是两条竖直的直线框住了一些圆
很方便得求出这些圆过后反演回去就可以了,反演回去可以 “做切线反演”
即考虑切点的反演点,不妨令切点到反演中心的距离为
,那么真正的圆的切点的距离就是
而两个圆的半径之比是
,发现就是要求切点到圆心距离的平方,知道圆心半径很方便求出
【计蒜客A1283】Finding the Radius for an Inserted Circle
按上面两个圆的切点为中心反演,那么就是两条直线框了一些点自上往下排
求出来过后反演回去就可以了
反演回去还是可以用 “做切线反演” 方法
#include<bits/stdc++.h>
#define cs const
using namespace std;
int T; double R, ans[11];
int main(){
scanf("%d%lf", &T,&R);
double y=-0.5*sqrt(3.0)/R; R=1/(2.0*R);
for(int i=1;i<=10;i++){ y-=2*R; ans[i]=R/(y*y-R*R); }
while(T--){
int k; cin>>k; cout<<(int)ans[k]<<'\n';
} return 0;
}