反演是平面上点到点的一个映射,除反演中心外每个点都有唯一的反演点与之对应
通过画图可以知道一些性质:
- 反演点在圆上,圆会反演成一条直线
- 反演点不在圆上,圆会反演成一个圆,与原来的圆位似
- 反演点在直线上,直线会反演成它本身
- 反演点不在直线上,直线会反演成一个圆
- 反演过后的相切关系不会改变
【HDU4773】Problem of Apollonius
给两个圆,一个点 ,求过
的一个或两个圆与这两个圆相切
考虑在 点反演,那么所求的圆会反演成一个直线
注意到如果是内切的话反演回去是一个外切一个内切,如果要两个外切的话两个圆心,反演点在外公切线的同一侧,利用初中知识求出外公切线再判断就可以了
圆反演出去可以用初中的相似,直线反演回来的时候,半径可以通过向直线做垂线的长度得到,而直径一定与垂线重合,于是可以较为方便得求出圆心和半径
code
【HDU6097】Mindis
初中几何题,将两个点按圆 反演出去,由于
,那么
的相似比相同
于是最小的时候就是 的连线,看与圆有没有交点讨论就可以了
code
【HDU6158】The Designer
按两个大圆相切的地方反演,那么会是两条竖直的直线框住了一些圆
很方便得求出这些圆过后反演回去就可以了,反演回去可以 “做切线反演”
即考虑切点的反演点,不妨令切点到反演中心的距离为 ,那么真正的圆的切点的距离就是
而两个圆的半径之比是 ,发现就是要求切点到圆心距离的平方,知道圆心半径很方便求出
code
【计蒜客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;
}