61 lines
1.8 KiB
Python
61 lines
1.8 KiB
Python
import math
|
|
import tkinter as tk
|
|
|
|
class Fibonacci:
|
|
def s5(self, n, r):
|
|
"""Generate Fibonacci spiral polar coordinates"""
|
|
spirals = []
|
|
phi = (1 + 5 ** 0.5) / 2 # golden ratio
|
|
for i in range(n + 1):
|
|
angle = (i * 360 / phi) % 360
|
|
spirals.append((r * (i ** 0.5), angle))
|
|
return spirals
|
|
|
|
def pol2cart(self, r, theta):
|
|
x = r * math.cos(math.radians(theta))
|
|
y = r * math.sin(math.radians(theta))
|
|
return x, y
|
|
|
|
def calculate_coordinates(self, num_points=200, distance=15):
|
|
# Convert polar to Cartesian coordinates
|
|
self.coordinates = [self.pol2cart(r, t) for r, t in self.s5(num_points, distance)]
|
|
# Center for the canvas
|
|
self.coordinates = [(x + 250, y + 250) for x, y in self.coordinates]
|
|
|
|
def plot_numbers(self, canvas):
|
|
self.calculate_coordinates()
|
|
for idx, (x, y) in enumerate(self.coordinates, start=1):
|
|
canvas.create_oval(x - 7, y - 7, x + 7, y + 7, fill="white")
|
|
canvas.create_text(x, y, text=str(idx))
|
|
|
|
def plot_lines(self, canvas):
|
|
for delta in [21, 34]:
|
|
for start in range(34):
|
|
x0, y0 = self.coordinates[start]
|
|
i = start + delta
|
|
while i < len(self.coordinates):
|
|
x1, y1 = self.coordinates[i]
|
|
canvas.create_line(x0, y0, x1, y1)
|
|
x0, y0 = x1, y1
|
|
i += delta
|
|
|
|
def create_gui(self):
|
|
master = tk.Tk()
|
|
master.title("Fibonacci Spiral")
|
|
canvas = tk.Canvas(master, width=500, height=500, bg="white")
|
|
canvas.pack()
|
|
|
|
self.plot_numbers(canvas)
|
|
self.plot_lines(canvas)
|
|
|
|
master.mainloop()
|
|
|
|
|
|
def main():
|
|
f = Fibonacci()
|
|
f.create_gui()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|