Sagot :
Bonjour,
Exercice particulièrement compliqué surtout avec Tkinter, je vais essayer d'être le plus clair possible mais au niveau des maths ça risque d'être un peu compliqué.
On peut faire un rosace avec une succession de cercles de même rayon dont le centre des cercles fait un rotation autour d'un point fixe.
On aura donc besoin de savoir faire un cercle avec Tkinter puis de faire une rotation.
Commençons par le code base:
from tkinter import *
from math import cos, sin, pi #Pour la rotation.
fenetre = Tk()
surface = Canvas(fenetre, width=600, height=600, background="white")
r = 100 #Rayon du cercle
n = 25 #Nombre de cercles (tu pourras jouer avec, c'est trop cool :) !)
xO, yO = 300, 300 #Centre de l'image qui va être notre point fixe pour la rotation.
Il faudra utiliser ensuite surface.create_oval(x0, y0, x1, y1) pour créer des cercles.
Je te propose de voir un schéma ci-joint pour comprendre les notations et vers quoi on va.
Puis de faire une fonction rotation (voir ci-joint), l'explication mathématique se fait à partir du cercle trigonométrique. Si tu veux vraiment savoir d'où ça vient je te propose de faire une petite recherche ou de faire la demande sur un nouveau poste dans la partie mathématiques et non informatique.
On obtient ainsi la fonction suivante:
def rotation(xM, yM, xO, yO, a):
x = (xM - xO) * cos(a) + (yM - yO) * sin(a) + xO
y = -(xM - xO) * sin(a) + (yM - yO) * cos(a) + yO
return x, y
Pour finir, il nous reste plus qu'à faire une boucle for qui va faire n cercles avec une rotation du centre C de 2 * pi / n pour chaque nouveau cercle.
Voici, le code complet:
from tkinter import *
from math import cos, sin, pi
fenetre = Tk()
surface = Canvas(fenetre, width=600, height=600, background="white")
r = 100
n = 25
xO, yO = 300, 300
def rotation(xM, yM, xO, yO, a):
"""
Fonction renvoyant les coordonnées du point M' rotation du point M d'un angle a par rapport au point fixe O(xO, yO).
"""
x = (xM - xO) * cos(a) + (yM - yO) * sin(a) + xO
y = -(xM - xO) * sin(a) + (yM - yO) * cos(a) + yO
return x, y
#Centre du cercle, point sur lequel on appliquera les rotations.
xC, yC = xO, yO - r
x0, y0 = xC - r, yC - r
x1, y1 = xC + r, yC + r
surface.create_oval(x0, y0, x1, y1)
for i in range(1, n):
xC, yC = rotation(xC, yC, xO, yO, 2 * pi / n)
x0, y0 = xC - r, yC - r
x1, y1 = xC + r, yC + r
surface.create_oval(x0, y0, x1, y1)
surface.pack()
fenetre.mainloop()
Tu peux voir un exemple avec n = 25 ci-joint et je te laisse le plaisir d'essayer avec des n différents :).
Bonne journée.