Sierpinskyの三角形(モジュロの)をプロットするプログラムを作りたいと思います。これを行うために私はTkInterを使いました。プログラムは点をランダムに移動させてフラクタルを生成し、常にその点を側面に保持します。このプロセスを何度も繰り返した後、フラクタルが現れます。TkInter python - Sierpinskyの三角形を得るためのキャンバス上の点の作成
ただし、問題があります。私はTkInterのキャンバスにポイントをプロットする方法を知らない。プログラムの残りの部分はOKですが、ポイントの代わりに小さな線を描いてポイントをプロットするためには "チート"しなければなりませんでした。多かれ少なかれ動作しますが、可能な限り多くの解決策はありません。
キャンバス上にポイントをプロットする機能や、それを行う別のツール(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()
「イメージの各行に対してputメソッドを1回だけ呼び出すと、劇的なスピードアップが得られます。 –
@MartínGómez私は、データの1ピクセルで 'put'を100回呼び出すことは、データの100ピクセルで' put'を1回呼び出すよりもかなり遅いことを意味します。 –