小学生の時コンパスで遊んだアレ
貝みたいでやたら書きまくった記憶がある.
pythonで描いてみた.
import matplotlib.pyplot as plt
import numpy as np
def cir_th2p(x,y,p1,p2,r,inv=False):
def cal_center(p,q,r):
pt3 = (p + q) * 0.5
r =r**2
l1 = (q[0] - pt3[0])**2 + (q[1] - pt3[1])**2
d = np.sqrt(r / l1 - 1.0)
dy,dx= d * (q - pt3)
pc1 = [pt3[0] + dx, pt3[1] - dy]
pc2 = [pt3[0] - dx, pt3[1] + dy]
return pc1,pc2
def cir_eq(x,y,a,b,r):
return (x-a)**2+(y-b)**2-r**2
r=float(r)
p1=np.array(p1).astype("float")
p2=np.array(p2).astype("float")
center=cal_center(p1,p2,r)
if inv:center=center[0]
else:center=center[1]
return cir_eq(x,y,center[0],center[1],r)
delta = 0.1
xrange = np.arange(-3, 3, delta)
yrange = np.arange(-3, 3, delta)
X, Y = np.meshgrid(xrange,yrange)
x=np.logspace(np.log10(1) , np.log10(5) , num=5)
for i in x:
plt.contour(X, Y, cir_th2p(X,Y,(-0.5,-0.5),(1,0),i),[0])
plt.contour(X, Y, cir_th2p(X,Y,(-0.5,-0.5),(1,0),i,inv=True),[0])
plt.gca().set_aspect('equal', adjustable='box')
plt.savefig("c.pdf",bbox_inches='tight')
ノート
cir_th2p(x,y,p1,p2,r,inv=False):
-
x
xの格子 -
y
yの格子 -
p1
1つ目の点.(x,y)の座標で与える. -
p2
2つ目. -
r
半径 -
inv
反転する
この関数,もう少しエレガントに書きたかったけど,急いでいたので強引な実装になってしまった.
気が向いたら整理しようと思う.