import math import tkinter as tk class Fibonacci: def s5(self, n, r): 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()