圆的反演

定义

已知一圆 $C$ ,圆心为 $O$ ,半径为 $r$ 。如果 $P$ 与 $P’$ 在过圆心 $O$ 的直线上,且 $OP \cdot OP’ = r^2$ ,则称 $P$ 与 $P’$ 关于 $O$ 互为反演。

# 性质

  1. 除反演中心外,平面上的每一个点,都有唯一的反演点,且关心是对称的。位于反演点上的点,保持在原处;位于圆外的点,反演到圆内;圆内的点,反演到圆外。
  2. 设 $P$ 为反演圆 $O(r)$ 外的一点,则它的反演点 $P’$ 是 $OP$ 与 $P$ 到圆的两个切点的连线的交点。用三角形相似易证。
  3. 任一条不过反演中心的直线,它的反形(反演后的形状)是经过反演中心的圆,反之亦然。特别的,过反演中心相交的圆,变为不过反演中心的相交直线。具体证明见 Proof3。
  4. 不过反演中心的圆,它的反形是一个圆,反演中心是这两个互为反形的圆的位似中心,任一对反演点是逆对应点。证明见 Proof4。
  5. 两条直线或曲线的夹角在反演变换后是不变的(两条曲线之间的夹角是指它们的切线之间的夹角)。

Proof3:

如图,过 $O$ 引直线 $l$ 的垂线 $OC$ ,$C$ 为垂足,$C′$ 为 $C$ 的反演点。在直线 $l$ 上任取一点 $M$ ,$M’$ 为 $M$ 的反演点,则 \(OM \cdot OM' = OC \cdot OC' = r^2\) 于是,$M、M’、C’、C$ 四点共圆,$ \angle OM’C’=90^{\circ}$ 由 $M$ 的任意性可知,$l$ 的反形是以 $OC’$ 为直径的圆。

TIM截图20191130163302

Proof4

如图,联结 $OC_1$交 $⊙C_1$ 于点 $B、A$,则 $A、B$ 是 $⊙C_1 $ 的直径. $M$ 是 $⊙C_1$ 上任意一点。由反演定义知 \(OA \cdot OA'=OB \cdot OB'=OM\cdot OM'=r^2\)

\[△OMB \sim △OB'M' \\ △OMA \sim △OA'M' \\ \begin{align*} & 故\angle A'M'B' \\ &=180^{\circ} - \angle M'A' B' - M'B'A' \\ &=180^{\circ} - \angle M'MA - \angle OMB \\ &= 90^{\circ} \end{align*}\]

由点 $M$ 的任意性可知,$⊙C_1$ 的反形是以 $A’B’$ 为直径的圆

TIM截图20191130165455

应用

常用到的结论

点的反演

点 $P(x,y)$ 关于反演中心 $O(x_0, y_0)$ 反演半径为 $r$ 的对应点是 \(P'\left ( x_0+k(x-x_0), \quad y_0+k(y-y_0) \right )\) 其中 $k = \frac{|OP’|}{|OP|} = \frac{r^2}{(x-x_0)^2+(y-y_0)^2}$

根据反演性质有 $OP\cdot OP’ = r^2$ ,则 $k = \frac{ OP’ }{ OP } = \frac{r^2}{(x-x_0)^2+(y-y_0)^2}$

$\overrightarrow{OP’} = k\cdot \overrightarrow{OP} = k\cdot (x-x_0,y-y_0)$ ,

所以 $P’(kx-kx_0+x_0,ky-ky_0+y_0)$

代码:

1
2
3
4
5
6
7
8
9
10
11
12
struct Point{
    double x, y;
    Point operator + (const Point & a) const {return Point{x+a.x, y+a.y};}
    Point operator - (const Point & a) const {return Point{x-a.x, y-a.y};}
	Point operator * (const double & k) const {return Point{k*x, k*y};}
};
double dis_2(Point a, Point b){return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);}

Point Inversion(Point o, double r, Point p){ // p点的反演点
	double k = r*r/dis_2(o, p);
	return o + (p-o)*k;
}

过反演中心的圆

  1. 若两圆相交于两点 $A、B$ ,即反演半径小于圆半径,那么反演后的直线就是 $A、B$ 所在的直线。
  2. 若两圆内切于一点 $A$ ,即反演半径等于圆半径,那么反演后的直线是 $A$ 点的切线。
  3. 若两圆内含关系,即反演半径大于圆半径,那么反演后的直线与反演中心和反演半径构成的圆相离。

模板

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
Point inverse_Point(Point P,Point A,double r){ //求A关于P反演
    Point O(0,0);
    Point PA=A-P;
    double len=r*r/dist(PA,O);
    Point A1=P+PA*(len/dist(PA,O));
    return A1;
}

Circle inverse_Circle(Point P,Circle C,double r){ //圆关于点P
    Point O=C.o;
    Point A,B,B1,A1;
    Point PO=O-P;
    A=P+PO*((dist(PO,Point(0,0))-C.r)/dist(PO,Point(0,0)));
    B=P+PO*((dist(PO,Point(0,0))+C.r)/dist(PO,Point(0,0)));
    A1=inverse_Point(P,A,r);
    B1=inverse_Point(P,B,r);
    Circle C1;
    C1.o=(A1+B1)*0.5;
    C1.r=dist(A1,B1)*0.5;
    return C1;
}

void add(Point a,Point b,int &k) { //直线关于点P
    double t = cross(a,p,b);
    if(t < 0) t = -t;
    double d = dist(a,b);
    t /= d;
    if(t > eps) {
        double w = 0.5*r*r / t;
        Point dir = (b-a).Trans();  //旋转90度
        Point a1 = p + dir * (w / d);
        Point b1 = p - dir * (w / d);
        if(fabs(cross(a,b,a1)) < fabs(cross(a,b,b1))) c[k++] = Circle(a1,w);
        else c[k++] = Circle(b1,w);
    }
}

例一

$⊙C_1、⊙C_2$ 半径分别为 $R、r \quad(R>r)$ ,两圆内切于 $A$ 点。给出位于大圆内小圆外的若干点,让找一个与两圆相切内切圆 $⊙C_3$ ,问这个圆最多能包含多少点。

以两个小圆切点为反演中心,$2r$ 为反演半径,将两个小圆反演成两条直线,点也做对应反演,问题转化为怎样取反演中心使得尽量多的点位于两直线之间。

参考

利用反演变换证明多圆问题

圆的反演模版

「HDU 4773」Problem of Apollonius-圆的反演

圆的反演

# 使用单$作为行内数学公式分界符