如何在 Matplotlib 中使用鼠标/光标绘制直线和圆弧的组合?

问题描述 投票:0回答:0

对于给定的圆心,如 (x₀,y₀),用户将单击四次以获得三个点,即 (x₁₋₃,y₁₋₃) 以绘制一个不完整的环,如图所示:

the draft

这个程序根本没用...

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₄*)

python matplotlib mouseevent drawing
© www.soinside.com 2019 - 2024. All rights reserved.