【发布时间】:2018-02-07 04:59:18
【问题描述】:
我想制作一个绘制谢尔宾斯基三角形(任何模数)的程序。为了做到这一点,我使用了 TkInter。该程序通过随机移动一个点来生成分形,始终将其保持在侧面。多次重复这个过程后,分形就出现了。
但是,有一个问题。我不知道如何在 TkInter 的画布上绘制点。程序的其余部分还可以,但我不得不“作弊”以便通过绘制小线而不是点来绘制点。它或多或少地工作,但它没有尽可能多的分辨率。
是否有在画布上绘制点的功能,或其他工具(使用 Python)?也欢迎改进程序其余部分的想法。
谢谢。这是我所拥有的:
from tkinter import *
import random
import math
def plotpoint(x, y):
global canvas
point = canvas.create_line(x-1, y-1, x+1, y+1, fill = "#000000")
x = 0 #Initial coordinates
y = 0
#x and y will always be in the interval [0, 1]
mod = int(input("What is the modulo of the Sierpinsky triangle that you want to generate? "))
points = int(input("How many points do you want the triangle to have? "))
tkengine = Tk() #Window in which the triangle will be generated
window = Frame(tkengine)
window.pack()
canvas = Canvas(window, height = 700, width = 808, bg = "#FFFFFF") #The dimensions of the canvas make the triangle look equilateral
canvas.pack()
for t in range(points):
#Procedure for placing the points
while True:
#First, randomly choose one of the mod(mod+1)/2 triangles of the first step. a and b are two vectors which point to the chosen triangle. a goes one triangle to the right and b one up-right. The algorithm gives the same probability to every triangle, although it's not efficient.
a = random.randint(0,mod-1)
b = random.randint(0,mod-1)
if a + b < mod:
break
#The previous point is dilated towards the origin of coordinates so that the big triangle of step 0 becomes the small one at the bottom-left of step one (divide by modulus). Then the vectors are added in order to move the point to the same place in another triangle.
x = x / mod + a / mod + b / 2 / mod
y = y / mod + b / mod
#Coordinates [0,1] converted to pixels, for plotting in the canvas.
X = math.floor(x * 808)
Y = math.floor((1-y) * 700)
plotpoint(X, Y)
tkengine.mainloop()
【问题讨论】:
标签: python-3.x tkinter tkinter-canvas