有什么方法可以在 Python tkinter gui 中放大点 (x, y)?
Any way to scale up points (x, y) in Python tkinter gui?
我正在处理 TSP 问题并从文件中读取一些点(必须使用我给出的点)并想将这些点绘制到 GUI 上。但问题是这些点都只有 2 位数,当我使用 tkinter.Canvas() 绘制它们时,它们看起来真的很脏而且很小,几乎就像它们相互重叠一样。
像这样:
我遇到了问题,但只是想使用此 GUI 来显示它的工作情况,而不是将其全部输出到控制台,但不能导致它在绘制线条时看起来很愚蠢甚至更糟。那么有什么方法可以放大 canvas 或以某种方式修改这些点以使它们看起来更好。我真的可以做任何事情还是我只是把它全部扔到控制台?
给定任何坐标系中以 (0, 0) 为中心的节点值,您需要操纵给定坐标以符合您的屏幕,canvas 需要正确渲染绘图
您可以按标量因子重新缩放点,然后将原点平移到屏幕中心(或任何位置),以便更轻松地可视化它们:
可能是这样的:
import tkinter as tk
WIDTH = 600
HEIGHT = 400
given_nodes = ((-1, -1), (-1, 1), (1, 1), (1, -1), (0, -1.5))
scale = 100
scaled_nodes = [(x * scale, y * scale) for x, y in given_nodes]
translated_to_center_nodes = [(x + WIDTH/2, y + HEIGHT/2) for x, y in scaled_nodes]
app = tk.Tk()
canvas = tk.Canvas(app, width=WIDTH, height=HEIGHT, bg='cyan')
canvas.pack()
# Draw connecting lines
line_nodes = translated_to_center_nodes + [translated_to_center_nodes[0]]
for idx, node in enumerate(line_nodes[:-1]):
x0, y0 = node
x1, y1 = line_nodes[idx+1]
canvas.create_line(x0, y0, x1, y1, fill='black')
# draw nodes
for node in translated_to_center_nodes:
x, y = node
dx, dy = 2, 2
canvas.create_oval(x-dx, y+dy, x+dx, y-dy, fill='white')
# draw origin & coordinate system at rescaled drawing scale
canvas.create_line(0, 0, 0 + scale, 0, width=9, fill='blue', arrow=tk.LAST)
canvas.create_line(0, 0, 0, scale, width=9, fill='blue', arrow=tk.LAST)
canvas.create_text(40, 40, text='SCALED\nCANVAS\nORIGIN')
# draw moved origin & coordinate system at rescaled drawing scale
canvas.create_line(0, HEIGHT/2, WIDTH, HEIGHT/2, fill='black', dash=(1, 3))
canvas.create_line(WIDTH/2, HEIGHT/2, WIDTH/2 + scale, HEIGHT/2, width=3, fill='black', arrow=tk.LAST)
canvas.create_line(WIDTH/2, 0, WIDTH/2, HEIGHT, fill='black', dash=(1, 3))
canvas.create_line(WIDTH/2, HEIGHT/2, WIDTH/2, HEIGHT/2 + scale, width=3, fill='black', arrow=tk.LAST)
canvas.create_text(WIDTH/2, HEIGHT/2, text='MOVED\nORIGIN')
if __name__ == '__main__':
app.mainloop()
这通常通过矩阵乘法和齐次坐标(查找)来完成,但是演示一个简单示例所需的机制有点太重了。
使用对象的坐标并按比例绘制它,在适当的位置,可能旋转或倾斜的过程称为 instantiation(也请查找!)
我正在处理 TSP 问题并从文件中读取一些点(必须使用我给出的点)并想将这些点绘制到 GUI 上。但问题是这些点都只有 2 位数,当我使用 tkinter.Canvas() 绘制它们时,它们看起来真的很脏而且很小,几乎就像它们相互重叠一样。
像这样:
我遇到了问题,但只是想使用此 GUI 来显示它的工作情况,而不是将其全部输出到控制台,但不能导致它在绘制线条时看起来很愚蠢甚至更糟。那么有什么方法可以放大 canvas 或以某种方式修改这些点以使它们看起来更好。我真的可以做任何事情还是我只是把它全部扔到控制台?
给定任何坐标系中以 (0, 0) 为中心的节点值,您需要操纵给定坐标以符合您的屏幕,canvas 需要正确渲染绘图
您可以按标量因子重新缩放点,然后将原点平移到屏幕中心(或任何位置),以便更轻松地可视化它们:
可能是这样的:
import tkinter as tk
WIDTH = 600
HEIGHT = 400
given_nodes = ((-1, -1), (-1, 1), (1, 1), (1, -1), (0, -1.5))
scale = 100
scaled_nodes = [(x * scale, y * scale) for x, y in given_nodes]
translated_to_center_nodes = [(x + WIDTH/2, y + HEIGHT/2) for x, y in scaled_nodes]
app = tk.Tk()
canvas = tk.Canvas(app, width=WIDTH, height=HEIGHT, bg='cyan')
canvas.pack()
# Draw connecting lines
line_nodes = translated_to_center_nodes + [translated_to_center_nodes[0]]
for idx, node in enumerate(line_nodes[:-1]):
x0, y0 = node
x1, y1 = line_nodes[idx+1]
canvas.create_line(x0, y0, x1, y1, fill='black')
# draw nodes
for node in translated_to_center_nodes:
x, y = node
dx, dy = 2, 2
canvas.create_oval(x-dx, y+dy, x+dx, y-dy, fill='white')
# draw origin & coordinate system at rescaled drawing scale
canvas.create_line(0, 0, 0 + scale, 0, width=9, fill='blue', arrow=tk.LAST)
canvas.create_line(0, 0, 0, scale, width=9, fill='blue', arrow=tk.LAST)
canvas.create_text(40, 40, text='SCALED\nCANVAS\nORIGIN')
# draw moved origin & coordinate system at rescaled drawing scale
canvas.create_line(0, HEIGHT/2, WIDTH, HEIGHT/2, fill='black', dash=(1, 3))
canvas.create_line(WIDTH/2, HEIGHT/2, WIDTH/2 + scale, HEIGHT/2, width=3, fill='black', arrow=tk.LAST)
canvas.create_line(WIDTH/2, 0, WIDTH/2, HEIGHT, fill='black', dash=(1, 3))
canvas.create_line(WIDTH/2, HEIGHT/2, WIDTH/2, HEIGHT/2 + scale, width=3, fill='black', arrow=tk.LAST)
canvas.create_text(WIDTH/2, HEIGHT/2, text='MOVED\nORIGIN')
if __name__ == '__main__':
app.mainloop()
这通常通过矩阵乘法和齐次坐标(查找)来完成,但是演示一个简单示例所需的机制有点太重了。 使用对象的坐标并按比例绘制它,在适当的位置,可能旋转或倾斜的过程称为 instantiation(也请查找!)