はじめに
二定点からの距離の比率が等しいという条件を課した場合の軌跡は円になる。これをアポロニウスの円というのだが、今回はこのことについて、証明したのち、Pythonを用いてシミュレーションをしてみる。具体的に前半は、ユークリッド距離の定義式を用いて証明について議論し、後半ではPythonの複素数機能を用いてプログラムを実装することとする。
アポロニウスの円
導入
定点A,Bに関してAP:PB=一定という条件を課したときに点Pの軌跡は円または直線(AP=BPのとき)を描くというものである。
証明
$A(a,0),B(b,0)$として$P(x,y)$とした場合、APとBPは以下のようにして表すことができる。
AP=\sqrt{(x-a)^2+y^2}
BP=\sqrt{(x-b)^2+y^2}
したがって、Cを定数とした場合、
\frac{AP}{BP}=C
が成立することから、
\frac{AP^2}{BP^2}=C^2
ゆえに、AP,BPを代入すると以下のようになる。
(x-a)^2+y^2=C^2\{(x-b)^2+y^2\}
これを解くと以下のようになる
(C^2-1)x^2+(C^2-1)y^2-2(bC^2-a)x+(b^2C^2-1^2)=0
$C^2-1\ne 0$とすると、上式は円の軌跡を描く。
プログラム
さて、距離の比率が一定という条件を課した場合、アポロニウスの円を描くかどうかを調べるために、以下の制約条件で点をプロットするプログラムを書いた。
\frac{AP}{BP}+\frac{BP}{AP}=C_1
ただし、$C_1$は定数である。
このような条件に対応するプログラムをいかに示す。
import numpy as np
import matplotlib.pyplot as plt
import math
import japanize_matplotlib
m=2
n=100
#座標空間の設定
x=np.linspace(0,m,n)
y=np.linspace(0,m,n)
X,Y=np.meshgrid(x,y)
#2定点の設定
Z_0=0
Z_1=1
#複素数平面の導入
Z=X+1j*Y
#2つのユークリッド距離の設定
d0=abs(Z-Z_0)
d1=abs(Z-Z_1)
d=d1/d0+d0/d1
#等高線図の描写3nは等高線の本数
plt.contour(X,Y,d,3*n)
plt.colorbar(label="距離の比率")
plt.savefig("アポロニウスの円.png")
plt.show()
このプログラムを実行した場合、以下のような画像が出力される。
したがって、このような条件を課すると円の軌跡を描くということがシミュレーションにおいても確認することができた。
まとめ
2定点からの距離の比率が一定となるような軌跡をアポロニウスの円といい、今回は実際に証明し、Pythonを用いてシミュレーションを行った。すると、2点間に円の軌跡を描くということが分かった。