对于给定的圆心,如 (x₀,y₀),用户将单击四次以获得三个点,即 (x₁₋₃,y₁₋₃) 以绘制一个不完整的环,如图所示:
这个程序根本没用...
import matplotlib.pyplot as plt
from matplotlib.patches import Arc
import numpy as np
from matplotlib.widgets import Cursor
class Annotate(object):
def __init__(self):
self.center = (0,0)
self.ax = plt.gca()
self.arc_inn = Arc(self.center, 0, 0, angle=0, theta1=0, theta2=0, color = 'r')
self.arc_out = Arc(self.center, 0, 0, angle=0, theta1=0, theta2=0, color = 'g')
self.x1 = None
self.y1 = None
self.x2 = None
self.y2 = None
self.x3 = None
self.y3 = None
self.x4 = None
self.y4 = None
self.ax.figure.canvas.mpl_connect('button_press_event', self.on_press_one)
self.ax.figure.canvas.mpl_connect('button_press_event', self.on_press_two)
self.ax.figure.canvas.mpl_connect('button_press_event', self.on_press_three)
self.ax.figure.canvas.mpl_connect('button_press_event', self.on_press_four)
def on_press_one(self, event):
print('first')
self.x1 = event.xdata
self.y1 = event.ydata
def on_press_two(self, event):
print('second')
self.x2 = event.xdata
self.y2 = event.ydata
def on_press_three(self, event):
print('third')
self.x3 = event.xdata
self.y3 = event.ydata
def on_press_four(self, event):
print('forth')
self.x4 = event.xdata
self.y4 = event.ydata
self.arc_inn.set_center(self.center)
self.arc_inn.set_angle(0)
self.arc_inn.set_height(np.sqrt((self.x1-self.center[0])**2+(self.y1-self.center[1])**2))
self.arc_inn.set_width = self.arc_inn.set_height
self.arc_inn.theta1 = np.arctan((self.y4-self.center[1])/(self.x4-self.center[0]))*180/np.pi
self.arc_inn.theta2 = np.arctan((self.y1-self.center[1])/(self.x1-self.center[0]))*180/np.pi
self.arc_out.set_center(self.center)
self.arc_out.set_angle(0)
self.arc_out.set_height(np.sqrt((self.x2-self.center[0])**2+((self.x2*(self.y1-self.center[1])/(self.x1-self.center[0])+(self.x1*self.center[1]-self.y1*self.center[0])/(self.x1-self.center[0]))-self.center[1])**2))
self.arc_out.set_width = self.arc_out.set_height
self.arc_out.theta1 = self.arc_inn.theta1
self.arc_out.theta2 = self.arc_inn.theta1
self.ax.figure.canvas.draw()
fig = plt.figure()
plt.axis('square')
a = Annotate()
plt.show()
第一次点击绘制第一条线,arc_out,arc_inn,第三次点击绘制最后一条线比较好
但是可能需要通过解方程来计算(x₄*,y₄*)