圆的反演学习笔记

反演是平面上点到点的一个映射,除反演中心外每个点都有唯一的反演点与之对应
通过画图可以知道一些性质:

  1. 反演点在圆上,圆会反演成一条直线
  2. 反演点不在圆上,圆会反演成一个圆,与原来的圆位似
  3. 反演点在直线上,直线会反演成它本身
  4. 反演点不在直线上,直线会反演成一个圆
  5. 反演过后的相切关系不会改变

【HDU4773】Problem of Apollonius

给两个圆,一个点 P P ,求过 P P 的一个或两个圆与这两个圆相切

考虑在 P P 点反演,那么所求的圆会反演成一个直线
注意到如果是内切的话反演回去是一个外切一个内切,如果要两个外切的话两个圆心,反演点在外公切线的同一侧,利用初中知识求出外公切线再判断就可以了
圆反演出去可以用初中的相似,直线反演回来的时候,半径可以通过向直线做垂线的长度得到,而直径一定与垂线重合,于是可以较为方便得求出圆心和半径

code


【HDU6097】Mindis

初中几何题,将两个点按圆 O O 反演出去,由于 O P = O Q OP=OQ ,那么 D Q / D Q , D P / D P DQ'/DQ,DP'/DP 的相似比相同
于是最小的时候就是 P Q P'Q' 的连线,看与圆有没有交点讨论就可以了

code


【HDU6158】The Designer

按两个大圆相切的地方反演,那么会是两条竖直的直线框住了一些圆
很方便得求出这些圆过后反演回去就可以了,反演回去可以 “做切线反演”
即考虑切点的反演点,不妨令切点到反演中心的距离为 d d ,那么真正的圆的切点的距离就是 d = R 2 / d d'=R^2/d
而两个圆的半径之比是 d / d d/d' ,发现就是要求切点到圆心距离的平方,知道圆心半径很方便求出

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;
}
发布了634 篇原创文章 · 获赞 98 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/sslz_fsy/article/details/104073452