Dessiner un cercle passant par deux points

J'ai joué avec une boussole quand j'étais à l'école primaire

Cela ressemble à un shell et je me souviens de l'avoir écrit partout. Je l'ai dessiné avec du python.

c.png

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')

Remarque

cir_th2p(x,y,p1,p2,r,inv=False):

Je voulais écrire cette fonction un peu plus élégamment, mais j'étais pressé, c'est donc devenu une implémentation de force brute. Je vais l'organiser quand j'en ai envie.

Recommended Posts

Dessiner un cercle passant par deux points
Approximation par la méthode des moindres carrés d'un cercle à deux points fixes
Un exemple pour dessiner des points avec PIL (Python Imaging Library).