LoginSignup
5
9

More than 5 years have passed since last update.

2点を通る円の描画

Posted at

小学生の時コンパスで遊んだアレ

貝みたいでやたら書きまくった記憶がある.
pythonで描いてみた.

c.png

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の格子
  • p11つ目の点.(x,y)の座標で与える.
  • p22つ目.
  • r 半径
  • inv反転する

この関数,もう少しエレガントに書きたかったけど,急いでいたので強引な実装になってしまった.
気が向いたら整理しようと思う.

5
9
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
9