from types import NoneType
import numpy as np
from numpy.polynomial import Polynomial
import matplotlib.pyplot as plt
def bz3(x:np.ndarray,y:np.ndarray):
# x0,gx0,gx1,x1
# y0,gy0,gy1,y1
a0=x[1]-x[0]
a1=x[3]-x[2]
b0=y[1]-y[0]
b1=y[3]-y[2]
z=3
xc=np.array([x[0],z*a0,3*(x[3]-x[0])-z*(a1+2*a0),2*(x[0]-x[3])+z*(a0+a1)])
yc=np.array([y[0],z*b0,3*(y[3]-y[0])-z*(b1+2*b0),2*(y[0]-y[3])+z*(b0+b1)])
return xc,yc
x=np.array([2,2,4,4],dtype=np.float64)
y=np.array([3,4,3,5],dtype=np.float64)
fig,ax=plt.subplots()
ax.set_xlim(-10,10)
ax.set_ylim(-10,10)
ax.grid()
ax.plot(x,y,'r.')
def on_button_press(event):
fig.canvas.mpl_connect('motion_notify_event',on_button_move)
def on_button_move(event,y=y):
if event.button==1:
xm,ym=event.xdata,event.ydata
for i in range(len(x)):
k=[]
d=np.sqrt((xm-x[i])**2+(ym-y[i])**2)
if d<1:
k.append(i)
break
if k:
x[k[0]]=xm
y[k[0]]=ym
ax.cla()
ax.set_xlim(-10,10)
ax.set_ylim(-10,10)
ax.plot(x,y,'r.')
Cx,Cy=bz3(x,y)
px=Polynomial(Cx)
py=Polynomial(Cy)
t=np.linspace(0,1,50)
ax.plot(px(t),py(t),'r')
ax.grid()
fig.canvas.draw_idle()
def on_button_release(event):
fig.canvas.mpl_disconnect(fig.canvas.mpl_connect('motion_notify_event',on_button_move))
fig.canvas.mpl_connect('button_press_event',on_button_press)
fig.canvas.mpl_connect('button_release_event',on_button_release)
plt.show()
matplotlib之动态拖动点
于 2024-08-01 22:38:09 首次发布