似乎无法在作为贝塞尔曲线的像素之间绘制一条线。Python/Tkinter画布
我似乎无法在旧像素和新像素之间画出平滑的贝塞尔曲线。我有贝塞尔曲线,但它仅仅由像素组成。此外,当我点击画布更新贝塞尔曲线时,我无法删除旧的曲线。我尝试了canvas.deleteline和canvas.deletetetk.ALL,但这会消除一切,我需要能够保留我的单击点或绘制椭圆的位置。任何帮助都将不胜感激似乎无法在作为贝塞尔曲线的像素之间绘制一条线。Python/Tkinter画布,python,tkinter,Python,Tkinter,我似乎无法在旧像素和新像素之间画出平滑的贝塞尔曲线。我有贝塞尔曲线,但它仅仅由像素组成。此外,当我点击画布更新贝塞尔曲线时,我无法删除旧的曲线。我尝试了canvas.deleteline和canvas.deletetetk.ALL,但这会消除一切,我需要能够保留我的单击点或绘制椭圆的位置。任何帮助都将不胜感激 import tkinter as tk #Screen creation. SCREEN_WIDTH = 800 SCREEN_HEIGHT
import tkinter as tk
#Screen creation.
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 800
SIZE = 4
**# Creates the canvas.**
root_window = tk.Tk()
canvas = tk.Canvas(root_window, width = SCREEN_WIDTH, height = SCREEN_HEIGHT)
canvas.pack()
**#Plots each pixel**
def plot_pixel(x0, y0):
line = canvas.create_line(x0, y0, x0 + 1, y0)
**#Pre: Takes a list of points.
#Post: Recursively iterates through the list to find the
# linear interpolation (x, y)**
def draw_curve(points, t):
if len(points) == 1:
plot_pixel(points[0][0], points[0][1])
else:
newpoints = []
for i in range(0, len(points) - 1):
# old_point_x = (1 - t) * points[i - 1][0] + t * points[i][0]
# old_point_y = (1 - t) * points[i - 1][1] + t * points[i][1]
x = (1 - t) * points[i][0] + t * points[i + 1][0]
y = (1 - t) * points[i][1] + t * points[i + 1][1]
newpoints.append((x, y))
draw_curve(newpoints, t)
递归调用来绘制_曲线,而你知道Tkinter可以自然地绘制bezier曲线吗?或者这是学习如何手动绘制曲线的练习?当您说我尝试了canvas.deleteline时,尝试的结果是什么?假设该行确实包含项目的id,这将删除该行。是的,我知道Tkinter可以绘制它们。这是我正在学习如何手动完成的作业。现在,线性插值的x,y只是像素。当我运行程序时,就像一条虚线,而不是一条连续的整条线,在画布上单击两次后,算法将绘制一条虚线,b/w两个点。如果我第三次单击,我会得到一条Bezier曲线,但是需要删除原始的线b/w点1和点2,只在屏幕上留下Bezier曲线。我从canvas.deleteline获得的结果为零。在绘制新行后,我无法删除上一行。
#Mouse B-1 bound, for every click draw an oval and append to
#list -- click_points.
click_points = []
def click(event):
click_points.append((event.x, event.y))
oval = canvas.create_oval(event.x - SIZE,
event.y - SIZE,
event.x + SIZE,
event.y + SIZE,
fill = "red")
draw(click_points)
canvas.bind("<Button-1>", click)
root_window.mainloop()