这个程序应该在运行时应该显示窗体,采集的鼠标点击位置是窗体内的坐标,生成的贝塞尔曲线控制点应该是窗体内的点生成的
时间: 2024-04-21 19:23:20 浏览: 97
MATLAB.zip_MATLAB求控制点_求曲线误差_翼型离散点反求bezier曲线控制点_贝塞尔 拟合_贝塞尔拟合
5星 · 资源好评率100%
如果你想在程序中显示一个窗体,并且只记录窗体内的鼠标点击位置,并生成贝塞尔曲线的控制点,你可以使用`tkinter`库来创建一个简单的窗体。
下面是更新后的代码示例:
```python
from pynput import mouse
from scipy.interpolate import interp1d
import tkinter as tk
import matplotlib.pyplot as plt
import numpy as np
# 存储鼠标点击位置的列表
points = []
def on_click(x, y, button, pressed):
# 获取窗体内的相对坐标
x -= root.winfo_x()
y -= root.winfo_y()
# 当鼠标左键按下时记录鼠标位置
if button == mouse.Button.left and pressed:
points.append((x, y))
# 创建根窗体
root = tk.Tk()
# 设置窗体大小和标题
root.geometry("400x300")
root.title("鼠标点击示例")
# 创建画布
canvas = tk.Canvas(root, width=400, height=300)
canvas.pack()
# 创建鼠标监听器
listener = mouse.Listener(on_click=on_click)
listener.start()
# 运行程序并点击窗体生成点
print("请点击窗体生成点,按'q'键退出")
while True:
if input() == 'q':
break
# 停止鼠标监听器
listener.stop()
# 获取鼠标坐标值
x = [point[0] for point in points]
y = [point[1] for point in points]
# 生成贝塞尔曲线的插值函数
t = np.arange(len(points))
f_x = interp1d(t, x, kind='cubic')
f_y = interp1d(t, y, kind='cubic')
# 绘制贝塞尔曲线
t_new = np.linspace(0, len(points)-1, 1000)
x_new = f_x(t_new)
y_new = f_y(t_new)
# 在画布上绘制贝塞尔曲线和点击的点
for i in range(len(x)):
canvas.create_oval(x[i]-2, y[i]-2, x[i]+2, y[i]+2, fill='red')
for i in range(len(x_new)-1):
canvas.create_line(x_new[i], y_new[i], x_new[i+1], y_new[i+1], fill='blue')
# 运行窗体主循环
root.mainloop()
```
这段代码使用`tkinter`库创建了一个简单的窗体,然后监听窗体内的鼠标点击事件,并记录鼠标点击的相对坐标。之后使用`scipy.interpolate`库中的`interp1d`函数生成贝塞尔曲线的插值函数,并使用`tkinter`的画布在窗体上绘制贝塞尔曲线和点击的点。
你可以运行这段代码,点击窗体内生成点,当你按下键盘上的 'q' 键时程序会退出,并在窗体上绘制出贝塞尔曲线和点击的点。
阅读全文