[Turtle] Comment Déterminer les points d'intersections de deux segments ?

pourkoisa Messages postés 3 Date d'inscription mardi 27 mai 2008 Statut Membre Dernière intervention 9 novembre 2010 - 1 oct. 2010 à 18:43
pourkoisa Messages postés 3 Date d'inscription mardi 27 mai 2008 Statut Membre Dernière intervention 9 novembre 2010 - 9 nov. 2010 à 23:36
Bonjour à tous :)

Je réalise actuellement un script avec les modules Turtle et Tkinter afin de représenter des chryzodes...
Je souhaite aller plus loin que ce que j'ai déjà, c'est à dire des chryzides tracés comme il faut. Je souhaite maintenant n'afficher QUE les points d'intersetions entre les différents segments dans le cercle...
Connaissez vous une fonction capable de faire ça, ou sauriez vous comment s'y prendre en bricolant un peu ? j'ai cherché, mais je n'ai rien trouvé...

Pour ceux qui ignorent ce qu'est un chryzode, voilà mon script :

from tkinter import *
from turtle import *
from math import *
## from pourkoisa import *


def chryz():
    speed("fastest")
    rayon = eval(entr3.get())
    nbpoint = eval(entr1.get())
    div = eval(entr2.get())
    #fen1.destroy()
    position(rayon)
    up()
    coordonee( nbpoint, 0 )
    down()
    i=0
    while i<=2*div*nbpoint :
        up()
        speed("fastest")
        goto(rayon*(cos((i*pi)/nbpoint)), (rayon*sin((i*pi)/nbpoint)))
        down()
        coloration=['red','green','blue','yellow','black','orange','pink','purple']
##        defin = i%8
##        color(coloration[defin])
##        if i%2==0 :
##            color('orange')
##        else :
##            color('black')
        goto(rayon*cos(((i/div)*pi/nbpoint)), rayon* sin(((i/div)*pi/nbpoint)))
        
        i=i+1
def chryzc() :
    speed("fastest")
    rayon = eval(entr3.get())
    nbpoint = eval(entr1.get())
    valeur = eval(entr2.get())
    #fen1.destroy()
    position(rayon)
    up()
    coordonee( nbpoint, 0 )
    down()
    i=0
    while i<=2*6*nbpoint:
##    *(valeur/pi):
        up()
        speed("fastest")
        goto(rayon*(cos((i*pi)/nbpoint)), (rayon*sin((i*pi)/nbpoint)))
        down()
##      chr coloration=['red','green','blue','yellow','black','orange','pink','purple']
        goto(rayon*cos((((i*valeur))*pi/nbpoint)), rayon* sin(((((i*valeur))*pi/nbpoint))))
##      write(i)
        i=i+1

def chryzs() :
    speed("fastest")
    rayon = eval(entr3.get())
    nbpoint = eval(entr1.get())
    valeur = eval(entr2.get())
    #fen1.destroy()
    position(rayon)
    up()
    coordonee( nbpoint, 0 )
    down()
    i=0
    while i<=36*valeur*nbpoint:
##    *(valeur/pi):
        up()
        speed("fastest")
        goto(rayon*(cos((i*pi)/nbpoint)), (rayon*sin((i*pi)/nbpoint)))
        down()
##      chr coloration=['red','green','blue','yellow','black','orange','pink','purple']
        goto(rayon*cos((((i*(valeur**(1/2))))*pi/nbpoint)), rayon* sin(((((i*(valeur**(1/2))))*pi/nbpoint))))
##      write(i)
        i=i+1

##def chryzp() :
##
##    speed("fastest")
##    rayon = eval(entr3.get())
##    nbpoint = eval(entr1.get())
##    div = eval(entr2.get())
##    #fen1.destroy()
##    position(rayon)
##    up()
##    coordonee( nbpoint, 0 )
##    
##    i=2
##    speed("fastest")
##    goto(rayon*(cos((pi)/nbpoint)), (rayon*sin((pi)/nbpoint)))
##    down()
##
##    while i<=nbpoint*div*50 :
##        speed("fastest")
##        if ispremier(i) == True :    
##           
##            goto(rayon*cos(((i)*pi/nbpoint)), rayon* sin(((i)*pi/nbpoint)))
##        
##        i=i+1
    
def position (rayon) :
    reset()
    up()
    goto(0,-rayon)
    down()
    circle(rayon)
    up()
    goto(0,0)
    #A ce point,la tortue est au centre du cercle
#Il faut maintenant définir une règle pour tracer les points suivant une règle
    
def coordonee(nbpoint, position):
    up()
    goto(100*cos(position*pi/nbpoint), 100*sin(position*pi/nbpoint))
# Ceci permet d'aller n'importe ou sur le cercle

    


# Création du widget principal ("maître") :
fen1 = Tk()
bou1 = Button(fen1,text='Quitter',command=fen1.quit)
bou1.pack(side=BOTTOM)
bou2 = Button(fen1,text='Chryzode Division',command=chryz)
bou2.pack()
bou3 = Button(fen1,text='Chryzode Multiplication',command=chryzc)
bou3.pack()
bou4 = Button(fen1,text='Chryzode Racine',command=chryzs)
bou4.pack()
##bou4 = Button(fen1,text='/!\ BETA',command=chryzp)
##bou4.pack()
entr1 = Entry(fen1)
entr2 = Entry(fen1)
entr3 = Entry(fen1)
# création des widgets "esclaves" :
txt1 Label(fen1, text 'Nombre de points:')
txt2 Label(fen1, text 'Valeur :')
txt3 Label(fen1, text 'Rayon :')
txt1.pack()
entr1.pack()
txt2.pack()
entr2.pack()
txt3.pack()
entr3.pack()



##bou3 = Button(fen1,text='Autre couleur',command=changecolor)
##bou3.pack()

fen1.mainloop(n=0)              # démarrage du réceptionnaire d'événements

fen1.destroy()               # destruction (fermeture) de la fenêtre



J'ai également une petite question qui concerne l'aspect pratique :
Lorsque je ferme la fenètre de trutle, elle se réouvre tout seule et continue a exécuter le script, même si j'ai stoppé son execution en fermant le shell ! :O

Comment pourrais je remédier à ça ?

Merci d'avance pour votre aide ! :)

Pourkoisa

2 réponses

cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
2 oct. 2010 à 19:20
Aucune fonction de Turtle ne te permettra de faire ça. Il va je pense falloir calculer tes points d'intersection en dehors du module dessin...
0
pourkoisa Messages postés 3 Date d'inscription mardi 27 mai 2008 Statut Membre Dernière intervention 9 novembre 2010
9 nov. 2010 à 23:36
Effectivement, j'ai trouvé ça

Il est vaguement expliqué comment faire...

Je vais essayer de mettre ça en œuvre :)
0
Rejoignez-nous