begin process at 2012 05 23 23:53:53
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Math & Algorithmes

 > CERCLE ET DROITE D' EULER ANIMÉS DANS UN TRIANGLE

CERCLE ET DROITE D' EULER ANIMÉS DANS UN TRIANGLE


 Information sur la source

Note :
10 / 10 - par 2 personnes
10,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Math & Algorithmes Classé sous :euler, triangle, gergonne, nagel, simpson Niveau :Débutant Date de création :23/05/2006 Date de mise à jour :26/06/2006 17:05:07 Vu / téléchargé :5 377 / 174

Auteur : HCD

Ecrire un message privé
Commentaire sur cette source (19)
Ajouter un commentaire et/ou une note

 Description

Cliquez pour voir la capture en taille normale
Le code présente une construction du cercle et de la droite d' Euler dans un triangle.
Il fait également apparaître les points de Gergonne et de Nagel ainsi que la droite de Simpson.
L'ensemble est animé;la vitesse est modifiable.

Source

  • #! /usr/bin/env python
  • # -*- coding: Latin-1 -*-
  • # Python version 2.4.2
  • # Tk version 8.4
  • # IDLE version 1.1.2
  • # <<< DROITE et CERCLE d' EULER >>>
  • # f : facteur d'échelle lié à la résolution de l'écran du PC : on peut l'augmenter ou le diminuer
  • #########################################################
  • # version 11
  • #Ce script a été vu, corrigé et amélioré par XEOLIN :
  • # avec notamment :
  • # - l' ajout d' un menu_bouton au clic droit de la souris
  • # - l' ajout d'une fonction "who create it ?"
  • # - l' ajout d'un widget "Scale" permettant de redimensionner la fenêtre à l'écran
  • #########################################################
  • # PRESENTATION
  • # On considère le triangle quelconque ABC avec les points remarquables suivants :
  • # G : centre de gravité
  • # H : orthocentre
  • # O : centre du cercle circonscrit
  • # I : centre du cercle inscrit
  • # E : centre du cercle d'Euler
  • # Ge : point de Gergonne
  • # N : point de Nagel
  • # Le cercle d'Euler passe par les neufs points suivants :
  • # les milieux des trois côtés du triangle : mA, mB, mC
  • # les pieds des hauteurs issues des trois sommets : hA, hB, hC
  • # les milieux des segments joignant les trois sommets à l'orthocentre : aA, bB, cC
  • # La droite d'Euler passe par les quatre points O, E, G, H :qui forment une division harmonique : EO / EG = HO / OG ( = 3)
  • # Les trois points G, I , N sont alignés, avec la relation : GN =2*GI (on a aussi HN = 2*OI)
  • from Tkinter import*
  • from math import *
  • from tkMessageBox import askokcancel
  • def pop_up(event=None) :
  • frame = Frame(root, relief=RIDGE)
  • entry = Entry(frame, width = '21')
  • menu = Menu(entry, tearoff = 0)
  • menu.add_command(label ='Présentation du script', underline =0,command = rahxephon)
  • menu.add_separator()
  • menu.add_command(label ='Triangle', underline =0,command = animation_triangle)
  • menu.add_separator()
  • menu.add_command(label ='Centre de gravité', underline =0,command = centre_de_gravite)
  • menu.add_command(label ='Orthocentre', underline =0,command = ortho_centre)
  • menu.add_command(label ='Cercle circonscrit', underline =0,command = cercle_circonscrit)
  • menu.add_command(label ='Cercle et droite d\' Euler', underline =0,command = Euler)
  • menu.add_command(label ='Cercle inscrit', underline =0,command = cercle_inscrit)
  • menu.add_command(label ='Points de Gergonne et de Nagel', underline =0,command = Gergonne_Nagel)
  • menu.add_command(label ='Droite de Simpson', underline =0,command = Simpson)
  • menu.add_command(label ='Figure de synthèse', underline =0,command = synthese)
  • menu.add_separator()
  • menu.add_command(label ='Stop !', underline =0,command = stop)
  • menu.add_command(label ='Quitter le jeu !', underline =0,command = quitter)
  • menu.add_separator()
  • menu.add_command(label ='A propos', underline =0,command = hack_sing)
  • ycoord = entry.winfo_pointery()
  • xcoord = entry.winfo_pointerx()
  • menu.tk_popup(xcoord, ycoord)
  • def naruto(event=None) :
  • global f,L,H,xA,yA,xB,yB,xC,yC,dxA,dyA,dxB,dyB,dxC,dyC
  • n=ss.get()
  • f=int(n)
  • L,H=120.*f,80.*f
  • xA,yA,xB,yB,xC,yC=10*f,10*f,5*f,50*f,70*f,70*f
  • dxA,dyA,dxB,dyB,dxC,dyC=0.2*f,0.2*f,0.2*f,0.2*f,0.2*f,-0.2*f
  • can.configure(height=H,width=L)
  • def rahxephon():
  • global fen1
  • fen1=Tk()
  • fen1.configure (bg='grey100')
  • fen1.geometry("%sx%s+0+0"%(root.winfo_screenwidth(),root.winfo_screenheight()))
  • fen1.overrideredirect(TRUE)
  • Label(fen1,text="""\n
  • Les propriétés du triangle ont intéressé de nombreux mathématiciens au cours des siècles.
  • Tous se sont attachés à repérer des points remarquables dans le triangle et à mettre en lumière les relations qui pouvaient exister entre ces points.
  • Il en est ainsi de la droite d'EULER qui relie le centre de gravité, l'orthocentre, le centre du cercle circonscrit et le centre du cercle d'Euler.\n
  • On trouvera un excellent document sur ce sujet sur le site suivant :\n
  • http://www.reunion.iufm.fr/dep/mathematiques/abracadabri/geoplane/cocyclik/CInsEx3.htm
  • On considère le triangle quelconque ABC avec les points remarquables suivants :
  • G : centre de gravité
  • H : orthocentre
  • O : centre du cercle circonscrit
  • I : centre du cercle inscrit
  • E : centre du cercle d'Euler
  • Ge : point de Gergonne
  • N : point de Nagel
  • Le cercle d'Euler passe par les neufs points suivants :
  • les milieux des trois côtés du triangle : mA, mB, mC
  • les pieds des hauteurs issues des trois sommets : hA, hB, hC
  • les milieux des segments joignant les trois sommets à l'orthocentre : aA, bB, cC
  • La droite d'Euler passe par les quatre points O, E, G, H :qui forment une division harmonique : EO / EG = HO / OG ( = 3)
  • Les trois points G, I , N sont alignés, avec la relation : GN =2*GI (on a aussi HN = 2*OI)
  • """,bg='grey100',fg='grey0',font='Arial 15 bold',justify=LEFT).pack()
  • Button(fen1,text='OK',command=fen1.destroy).pack()
  • fen1.mainloop()
  • def hack_sing():
  • global fen
  • fen=Tk()
  • fen.configure (bg='grey0')
  • fen.geometry("%sx%s+0+0"%(root.winfo_screenwidth(),root.winfo_screenheight()))
  • fen.overrideredirect(TRUE)
  • Label(fen,text="""\n\n\n\n\n\n\n\n\n\n\n\n
  • By HCD avec le concours de XEOLIN""",bg='grey0',fg='grey100',font='Arial 20 bold').pack()
  • Button(fen,text='OK',font='Arial 10 bold',command=fen.destroy).pack()
  • fen.mainloop()
  • def vitesse(a):
  • "récupération de la valeur (a) choisie sur l'échelle"
  • global k
  • k=0.1*int(a) #affectation à la variable <k>
  • def animer():
  • "résolution du triangle et animation "
  • global xA,yA,xB,yB,xC,yC # coordonnées des sommets A, B, C
  • global dxA,dyA,dxB,dyB,dxC,dyC # coordonnées des vecteurs vitesses des sommets A, B, C
  • global a,b,c,p # longueur des côtés BC,CA,AB et demi périmètre
  • global A,B,C #angles aux sommets A,B,C
  • global xmA,ymA,xmB,ymB,xmC,ymC # coordonnées des milieux des côtés BC, CA, AB
  • global xG,yG # coordonnées du centre de gravité (G)
  • global xhA,yhA,xhB,yhB,xhC,yhC # coordonnées des pieds des hauteurs issues des trois sommets A, B, C
  • global xH,yH # coordonnées de l'orthocentre (H)
  • global xO,yO,RO # coordonnées du centre (O) et rayon (RO) du cercle circonscrit
  • global xE,yE,RE # coordonnées du centre (E) et rayon (RE) du cercle d'Euler
  • global xaA,yaA,xbB,ybB,xcC,ycC # coordonnées des milieux des segments joignant les trois sommets à l'orthocentre
  • global xGergonne,yGergonne,xNagel,yNagel # coordonnées des points de Gergonne et de Nagel
  • global xI,yI,RI # coordonnées du centre (I) et rayon (RI) du cercle inscrit
  • global xiA,yiA,xiB,yiB,xiC,yiC # coordonnées des points de contact entre le cercle inscrit et les côtés du triangle
  • global xeA,yeA,xeB,yeB,xeC,yeC # coordonnées des points de contact entre les cercles exinscrits et les côtés du triangle
  • global xM,yM,xMA,yMA,xMB,yMB,xMC,yMC
  • global k
  • k=0.9999*k
  • if flag==1 :
  • can.delete(ALL)
  • # animation
  • xA,yA,xB,yB,xC,yC=xA+k*dxA,yA+k*dyA,xB+k*dxB,yB+k*dyB,xC+k*dxC,yC+k*dyC
  • # résolution du triangle
  • a,b,c=hypot(xC-xB,yC-yB),hypot(xA-xC,yA-yC),hypot(xA-xB,yA-yB)
  • p=(a+b+c)/2 # demi périmètre (p)
  • RI=sqrt((p-a)*(p-b)*(p-c)/p)# rayon (RI) du cercle inscrit
  • if p==a:A=0
  • if p==b:B=0
  • if p==c:C=0
  • if p==a or p==b or p==c:RI,RO=0,infini
  • else:
  • A,B,C=2*atan(RI/(p-a)),2*atan(RI/(p-b)),2*atan(RI/(p-c))# angles aux sommets
  • RO=a*b*c/RI/p/4# rayon (RO) du cercle circonscrit
  • RE=RO/2 # rayon (RE) du cercle d'Euler
  • # coordonnées des milieux des côtés BC, CA, AB et du centre de gravité G ( isobarycentre : A[1], B[1], C[1] )
  • barycentre(0,1,1);xmA,ymA=x,y
  • barycentre(1,0,1);xmB,ymB=x,y
  • barycentre(1,1,0);xmC,ymC=x,y
  • barycentre(1,1,1);xG,yG=x,y
  • # coordonnées des pieds des hauteurs issues des trois sommets A, B, C et de l'orthocentre H : barycentre de A[tan(A)], B[tan(B)], C[tan(C)]
  • barycentre(0,tan(B),tan(C));xhA,yhA=x,y
  • barycentre(tan(A),0,tan(C));xhB,yhB=x,y
  • barycentre(tan(A),tan(B),0);xhC,yhC=x,y
  • barycentre(tan(A),tan(B),tan(C));xH,yH=x,y
  • # coordonnées du centre (O) du cercle circonscrit : barycentre de A[sin(2*A)], B[sin(2*B)], C[sin(2*C)]
  • barycentre(sin(2*A),sin(2*B),sin(2*C));xO,yO=x,y
  • # coordonnées du centre (E) du cercle d'Euler
  • xE,yE=(xO+xH)/2,(yO+yH)/2
  • # coordonnées des milieux des segments joignant les trois sommets à l'orthocentre
  • xaA,yaA= (xH+xA)/2,(yH+yA)/2
  • xbB,ybB= (xH+xB)/2,(yH+yB)/2
  • xcC,ycC= (xH+xC)/2,(yH+yC)/2
  • # coordonnées du point de Gergonne : barycentre de A[(p-b)*(p-c)], B[(p-c)*(p-a)], C[(p-a)*(p-b)]
  • barycentre((p-b)*(p-c),(p-c)*(p-a),(p-a)*(p-b));xGergonne,yGergonne=x,y
  • # coordonnées du point de Nagel : barycentre de A[p-a], B[p-b], C[p-c]
  • barycentre(p-a,p-b,p-c);xNagel,yNagel=x,y
  • # coordonnées du centre (I) du cercle inscrit : barycentre de A[a], B[b], C[c]
  • barycentre(a,b,c);xI,yI=x,y
  • # coordonnées des points de contact entre le cercle inscrit et les côtés du triangle
  • if p==a:xiA,yiA=0,0
  • else:barycentre(0,(p-c)*(p-a),(p-a)*(p-b));xiA,yiA=x,y
  • if p==b:xiB,yiB=0,0
  • else:barycentre((p-b)*(p-c),0,(p-a)*(p-b));xiB,yiB=x,y
  • if p==c:xiC,yiC=0,0
  • else:barycentre((p-b)*(p-c),(p-c)*(p-a),0);xiC,yiC=x,y
  • # coordonnées des points de contact entre les cercles exinscrit et les côtés du triangle
  • xeA,yeA=2*xmA+-xiA,2*ymA+-yiA
  • xeB,yeB=2*xmB+-xiB,2*ymB+-yiB
  • xeC,yeC=2*xmC+-xiC,2*ymC+-yiC
  • # droite de Simpson
  • xM=xO-RO/2
  • yM=yO-sqrt(RO*RO-(xM-xO)*(xM-xO))
  • if xB==xA:pC=infini
  • else:pC=(yB-yA)/(xB-xA)
  • if xC==xB:pA=infini
  • else:pA=(yC-yB)/(xC-xB)
  • if xA==xC:pB=infini
  • else:pB=(yA-yC)/(xA-xC)
  • xMC=(pC*(yM-yA)+xM+pC*pC*xA)/(1+pC*pC)
  • yMC=(pC*(xM-xA)+yA+pC*pC*yM)/(1+pC*pC)
  • xMA=(pA*(yM-yB)+xM+pA*pA*xB)/(1+pA*pA)
  • yMA=(pA*(xM-xB)+yB+pA*pA*yM)/(1+pA*pA)
  • xMB=(pB*(yM-yC)+xM+pB*pB*xC)/(1+pB*pB)
  • yMB=(pB*(xM-xC)+yC+pB*pB*yM)/(1+pB*pB)
  • # maintien du triangle dans le plan de jeu
  • if xA<8 or xA>L-8:dxA,dxB,dxC=-dxA,-dxB,-dxC
  • if xB<8 or xB>L-8:dxA,dxB,dxC=-dxA,-dxB,-dxC
  • if xC<8 or xC>L-8:dxA,dxB,dxC=-dxA,-dxB,-dxC
  • if yA<8 or yA>H-8:dyA,dyB,dyC=-dyA,dyB,dyC
  • if yB<8 or yB>H-8:dyA,dyB,dyC=-dyA,-dyB,-dyC
  • if yC<8 or yC>H-8:dyA,dyB,dyC=dyA,dyB,-dyC
  • #lancement de l'animation des différentes figures
  • if tt==1 and gg==0 and hh==0 and oo==0 and ee==0 and ii==0 and gn==0:animation_triangle()
  • if tt==0 and gg==1 and hh==0 and oo==0 and ee==0 and ii==0 and gn==0:centre_de_gravite()
  • if tt==0 and gg==0 and hh==1 and oo==0 and ee==0 and ii==0 and gn==0:ortho_centre()
  • if tt==0 and gg==0 and hh==0 and oo==1 and ee==0 and ii==0 and gn==0:cercle_circonscrit()
  • if tt==0 and gg==0 and hh==0 and oo==0 and ee==1 and ii==0 and gn==0:Euler()
  • if tt==0 and gg==0 and hh==0 and oo==0 and ee==0 and ii==1 and gn==0:cercle_inscrit()
  • if tt==0 and gg==0 and hh==0 and oo==0 and ee==0 and ii==0 and gn==1:Gergonne_Nagel()
  • if tt==0 and gg==0 and hh==0 and oo==0 and ee==0 and ii==0 and gn==0 and ss==1:synthese()
  • if tt==0 and gg==0 and hh==0 and oo==0 and ee==0 and ii==0 and gn==0 and ss==0 and sm==1:Simpson()
  • def barycentre(k1,k2,k3):
  • " cette fonction donne les coordonnées x et y du barycentre des points A, B, C auxquels sont affectés les coefficients k1, k2, k3"
  • global x,y
  • m,n,o=k1,k2,k3
  • x,y=(m*xA+n*xB+o*xC)/(m+n+o),(m*yA+n*yB+o*yC)/(m+n+o)
  • def animation_triangle():
  • " A,B,C sont les sommets du triangle"
  • global flag,tt,gg,hh,oo,ee,ii,gn
  • flag,tt,gg,hh,oo,ee,ii,gn=1,1,0,0,0,0,0,0
  • texte="A,B,C sommets"
  • information.config(text=texte)
  • can.create_text(150,500,text="Le triangle a pour sommets A, B, C",fill="white")
  • triangle()
  • root.after(10,animer)
  • def triangle():
  • "dessin du triangle"
  • cote_AB=can.create_line(xA,yA,xB,yB,fill="red",width=2)
  • cote_BC=can. create_line(xB,yB,xC,yC,fill="red",width=2)
  • cote_CA=can. create_line(xC,yC,xA,yA,fill="red",width=2)
  • sommet_A=can.create_oval(xA-8,yA-8,xA+8,yA+8,fill="red",width=1)
  • sommet_B=can.create_oval(xB-8,yB-8,xB+8,yB+8,fill="red",width=1)
  • sommet_C=can.create_oval(xC-8,yC-8,xC+8,yC+8,fill="red",width=1)
  • lettre_A=can.create_text(xA,yA,text="A",fill="white")
  • lettre_B=can.create_text(xB,yB,text="B",fill="white")
  • lettre_C=can.create_text(xC,yC,text="C",fill="white")
  • def centre_de_gravite():
  • " mA,mB,mC sont les milieux des côtés du triangle et G le centre de gravité"
  • global flag,tt,gg,hh,oo,ee,ii
  • flag,tt,gg,hh,oo,ee,ii,gn=1,0,1,0,0,0,0,0
  • texte="A,B,C sommets\nG Centre de gravité"
  • information.config(text=texte)
  • can.create_text(150,500,text="Le centre de gravité G est à l' intersection \ndes droites issues des sommets A, B, C et \npassant par les milieux des côtés BC, CA, AB",fill="white")
  • ligne_mA_A=can.create_line(xA,yA,xmA,ymA,fill='#007030',width=2)
  • ligne_mB_B=can.create_line(xB,yB,xmB,ymB,fill='#007030',width=2)
  • ligne_mC_C=can.create_line(xC,yC,xmC,ymC,fill='#007030',width=2)
  • triangle()
  • mA=can.create_oval(xmA-3,ymA-3,xmA+3,ymA+3,fill="pink",width=1)
  • mB=can.create_oval(xmB-3,ymB-3,xmB+3,ymB+3,fill="pink",width=1)
  • mC=can.create_oval(xmC-3,ymC-3,xmC+3,ymC+3,fill="pink",width=1)
  • marqueur_G=can.create_oval(xG-8,yG-8,xG+8,yG+8,fill="pink",width=1)
  • lettre_G=can.create_text(xG,yG,text="G",fill="black")
  • root.after(10,animer)
  • def ortho_centre():
  • " hA,hB,hC sont les pieds des hauteurs issues des sommets du triangle et H l'orthocentre"
  • global flag,tt,gg,hh,oo,ee,ii,gn
  • flag,tt,gg,hh,oo,ee,ii,gn=1,0,0,1,0,0,0,0
  • texte="A,B,C sommets\nH orthocentre"
  • information.config(text=texte)
  • can.create_text(150,500,text="L' orthocentre H est à l' intersection \ndes hauteurs issues des sommets A, B, C",fill="white")
  • ligne_hA_A=can.create_line(xA,yA,xhA,yhA,fill='#007030',width=2)
  • ligne_hB_B=can.create_line(xB,yB,xhB,yhB,fill='#007030',width=2)
  • ligne_hC_C=can.create_line(xC,yC,xhC,yhC,fill='#007030',width=2)
  • ligne_hA_H=can.create_line(xH,yH,xhA,yhA,fill='#007030',width=2)
  • ligne_hB_H=can.create_line(xH,yH,xhB,yhB,fill='#007030',width=2)
  • ligne_hC_H=can.create_line(xH,yH,xhC,yhC,fill='#007030',width=2)
  • triangle()
  • hA=can.create_oval(xhA-3,yhA-3,xhA+3,yhA+3,fill="light blue",width=1)
  • hB=can.create_oval(xhB-3,yhB-3,xhB+3,yhB+3,fill="light blue",width=1)
  • hC=can.create_oval(xhC-3,yhC-3,xhC+3,yhC+3,fill="light blue",width=1)
  • marqueur_H=can.create_oval(xH-8,yH-8,xH+8,yH+8,fill="light blue",width=1)
  • lettre_H=can.create_text(xH,yH,text="H",fill="black")
  • root.after(10,animer)
  • def cercle_circonscrit():
  • "centre (O) et rayon (RO) du cercle circonscrit "
  • global flag,tt,gg,hh,oo,ee,ii,gn
  • flag,tt,gg,hh,oo,ee,ii,gn=1,0,0,0,1,0,0,0
  • texte='''A,B,C sommets\nO centre du cercle circonscrit'''
  • information.config(text=texte)
  • can.create_text(150,500,text="Le centre (O) du cercle circonscrit est à \nl' intersection des médiatrices des\ncôtés BC, CA, AB",fill="white")
  • cercle_circonscrit=can.create_oval(xO-RO,yO-RO,xO+RO,yO+RO,outline='gold',width=1)
  • ligne_mA_CT=can.create_line(xO,yO,xmA,ymA,fill='#007030',width=2)
  • ligne_mB_CT=can.create_line(xO,yO,xmB,ymB,fill='#007030',width=2)
  • ligne_mC_CT=can.create_line(xO,yO,xmC,ymC,fill='#007030',width=2)
  • triangle()
  • mA=can.create_oval(xmA-3,ymA-3,xmA+3,ymA+3,fill="gold",width=1)
  • mB=can.create_oval(xmB-3,ymB-3,xmB+3,ymB+3,fill="gold",width=1)
  • mC=can.create_oval(xmC-3,ymC-3,xmC+3,ymC+3,fill="gold",width=1)
  • centre_cercle_circonscrit=can.create_oval(xO-8,yO-8,xO+8,yO+8,fill="gold",width=1)
  • lettre_O=can.create_text(xO,yO,text="O",fill="black")
  • root.after(10,animer)
  • def Euler():
  • "centre (E) et rayon (RE) du cercle d'Euler et droite d'Euler"
  • global flag,tt,gg,hh,oo,ee,ii,gn
  • flag,tt,gg,hh,oo,ee,ii,gn=1,0,0,0,0,1,0,0
  • texte="A,B,C sommets\nG Centre de gravité\nH orthocentre\nO centre du cercle circonscrit\nE centre du cercle d' Euler"
  • information.config(text=texte)
  • can.create_text(250,500,text= '''Le cercle d' Euler passe par les 9 points suivants :
  • - les milieux des trois côtés du triangle
  • - les pieds des hauteurs issues des trois sommets
  • - les milieux des segments joignant les trois sommets à l'orthocentre
  • La droite d' Euler relie les 4 points suivants: G, H, O, E
  • avec la relation EO / EG = HO / OG ( = 3)''',fill="white")
  • triangle()
  • droite_Euler_1=can.create_line(xO,yO,xG,yG,fill="white",width=1)
  • droite_Euler_2=can.create_line(xH,yH,xG,yG,fill="white",width=1)
  • centre_cercle_Euler=can.create_oval(xE-8,yE-8,xE+8,yE+8,fill="white",width=1)
  • cercle_Euler=can.create_oval(xE-RE,yE-RE,xE+RE,yE+RE,outline="white",width=1)
  • lettre_E=can.create_text(xE,yE,text="E",fill="black")
  • centre_cercle_circonscrit=can.create_oval(xO-8,yO-8,xO+8,yO+8,fill="gold",width=1)
  • lettre_O=can.create_text(xO,yO,text="O",fill="black")
  • marqueur_G=can.create_oval(xG-8,yG-8,xG+8,yG+8,fill="pink",width=1)
  • lettre_G=can.create_text(xG,yG,text="G",fill="black")
  • marqueur_H=can.create_oval(xH-8,yH-8,xH+8,yH+8,fill="light blue",width=1)
  • lettre_H=can.create_text(xH,yH,text="H",fill="black")
  • aA=can.create_oval(xaA-3,yaA-3,xaA+3,yaA+3,fill="green",width=1)
  • bB=can.create_oval(xbB-3,ybB-3,xbB+3,ybB+3,fill="green",width=1)
  • cC=can.create_oval(xcC-3,ycC-3,xcC+3,ycC+3,fill="green",width=1)
  • mA=can.create_oval(xmA-3,ymA-3,xmA+3,ymA+3,fill="pink",width=1)
  • mB=can.create_oval(xmB-3,ymB-3,xmB+3,ymB+3,fill="pink",width=1)
  • mC=can.create_oval(xmC-3,ymC-3,xmC+3,ymC+3,fill="pink",width=1)
  • hA=can.create_oval(xhA-3,yhA-3,xhA+3,yhA+3,fill="light blue",width=1)
  • hB=can.create_oval(xhB-3,yhB-3,xhB+3,yhB+3,fill="light blue",width=1)
  • hC=can.create_oval(xhC-3,yhC-3,xhC+3,yhC+3,fill="light blue",width=1)
  • root.after(10,animer)
  • def cercle_inscrit():
  • "centre (I) et rayon (RI) du cercle inscrit et droite reliant les points de Gergonne et de Nagel"
  • global flag,tt,gg,hh,oo,ee,ii,gn
  • flag,tt,gg,hh,oo,ee,ii,gn=1,0,0,0,0,0,1,0
  • texte="A,B,C sommets\nG Centre de gravité\nI centre du Cercle inscrit\nN point de Nagel\nGe point de Gergonne"
  • information.config(text=texte)
  • can.create_text(150,500,text="Le centre (I) du cercle inscrit est à l' intersection\ndes bissectrices issues des sommets A, B, C",fill="white")
  • ligne_A_I=can.create_line(xI,yI,xA,yA,fill='#007030',width=2)
  • ligne_B_I=can.create_line(xI,yI,xB,yB,fill='#007030',width=2)
  • ligne_C_I=can.create_line(xI,yI,xC,yC,fill='#007030',width=2)
  • ligne_iA_I=can.create_line(xI,yI,xiA,yiA,fill='#007030',width=1)
  • ligne_iB_I=can.create_line(xI,yI,xiB,yiB,fill='#007030',width=1)
  • ligne_iC_I=can.create_line(xI,yI,xiC,yiC,fill='#007030',width=1)
  • cercle_inscrit=can.create_oval(xI-RI,yI-RI,xI+RI,yI+RI,outline='yellow',width=1)
  • triangle()
  • centre_cercle_inscrit=can.create_oval(xI-8,yI-8,xI+8,yI+8,fill="yellow",width=1)
  • lettre_I=can.create_text(xI,yI,text="I",fill="black")
  • marqueur_iA=can.create_oval(xiA-3,yiA-3,xiA+3,yiA+3,fill="yellow",width=1)
  • marqueur_iB=can.create_oval(xiB-3,yiB-3,xiB+3,yiB+3,fill="yellow",width=1)
  • marqueur_iC=can.create_oval(xiC-3,yiC-3,xiC+3,yiC+3,fill="yellow",width=1)
  • root.after(10,animer)
  • def Gergonne_Nagel():
  • "centre (I) et rayon (RI) du cercle inscrit et droite reliant les points de Gergonne et de Nagel"
  • global flag,tt,gg,hh,oo,ee,ii,gn
  • flag,tt,gg,hh,oo,ee,ii,gn=1,0,0,0,0,0,0,1
  • texte="A,B,C sommets\nN point de Nagel\nGe point de Gergonne"
  • information.config(text=texte)
  • can.create_text(250,500,text= '''Le point de Gergonne est à l'intersection des droites issues des sommets et passant
  • par les points de contact du cercle inscrit avec les côtés du triangle
  • Le point de Nagel est à l'intersection des droites issues des sommets et passant par
  • les points de contact des cercles exinscrits avec les côtés du triangle
  • La droite de Nagel relie les 3 points suivants : N, G, I
  • avec la relation IG = GN / 2''',fill="white")
  • cercle_inscrit=can.create_oval(xI-RI,yI-RI,xI+RI,yI+RI,outline='#007030',width=1)
  • ligne_iA_A=can.create_line(xA,yA,xiA,yiA,fill='#007030',width=2)
  • ligne_iB_B=can.create_line(xB,yB,xiB,yiB,fill='#007030',width=2)
  • ligne_iC_C=can.create_line(xC,yC,xiC,yiC,fill='#007030',width=2)
  • ligne_eA_A=can.create_line(xA,yA,xeA,yeA,fill='#007030',width=2)
  • ligne_eB_B=can.create_line(xB,yB,xeB,yeB,fill='#007030',width=2)
  • ligne_eC_C=can.create_line(xC,yC,xeC,yeC,fill='#007030',width=2)
  • triangle()
  • droite_Nagel=can.create_line(xI,yI,xNagel,yNagel,fill="white",width=1)
  • centre_cercle_inscrit=can.create_oval(xI-8,yI-8,xI+8,yI+8,fill="yellow",width=1)
  • lettre_I=can.create_text(xI,yI,text="I",fill="black")
  • point_de_Gergonne=can.create_oval(xGergonne-8,yGergonne-8,xGergonne+8,yGergonne+8,fill="light blue",width=1)
  • lettre_Ge=can.create_text(xGergonne,yGergonne,text="Ge",fill="black")
  • point_de_Nagel=can.create_oval(xNagel-8,yNagel-8,xNagel+8,yNagel+8,fill="orange",width=1)
  • lettre_N=can.create_text(xNagel,yNagel,text="N",fill="black")
  • marqueur_G=can.create_oval(xG-8,yG-8,xG+8,yG+8,fill="pink",width=1)
  • lettre_G=can.create_text(xG,yG,text="G",fill="black")
  • marqueur_iA=can.create_oval(xiA-3,yiA-3,xiA+3,yiA+3,fill="light blue",width=1)
  • marqueur_iB=can.create_oval(xiB-3,yiB-3,xiB+3,yiB+3,fill="light blue",width=1)
  • marqueur_iC=can.create_oval(xiC-3,yiC-3,xiC+3,yiC+3,fill="light blue",width=1)
  • marqueur_eA=can.create_oval(xeA-3,yeA-3,xeA+3,yeA+3,fill="orange",width=1)
  • marqueur_eB=can.create_oval(xeB-3,yeB-3,xeB+3,yeB+3,fill="orange",width=1)
  • marqueur_eC=can.create_oval(xeC-3,yeC-3,xeC+3,yeC+3,fill="orange",width=1)
  • root.after(10,animer)
  • def Simpson():
  • " droite de Simpson"
  • global flag,tt,gg,hh,oo,ee,ii,gn,ss,sm
  • flag,tt,gg,hh,oo,ee,ii,gn,ss,sm=1,0,0,0,0,0,0,0,0,1
  • texte="A,B,C sommets\nM est sur le cercle circonscrit\nsA,sB,sC pieds des hauteurs issues de M"
  • information.config(text=texte)
  • can.create_text(150,500,text="La droite de Simpson relie \nles pieds des hauteurs issues de M",fill="white")
  • triangle()
  • ligne_sA_M=can.create_line(xM,yM,xMA,yMA,fill='#007030',width=2)
  • ligne_sB_M=can.create_line(xM,yM,xMB,yMB,fill='#007030',width=2)
  • ligne_sC_M=can.create_line(xM,yM,xMC,yMC,fill='#007030',width=2)
  • ligne_sA_sB=can.create_line(xMB,yMB,xMA,yMA,fill='white',width=1)
  • ligne_sB_sC=can.create_line(xMC,yMC,xMB,yMB,fill='white',width=1)
  • ligne_sC_sA=can.create_line(xMA,yMA,xMC,yMC,fill='white',width=1)
  • cercle_circonscrit=can.create_oval(xO-RO,yO-RO,xO+RO,yO+RO,outline='gold',width=1)
  • marqueur_M=can.create_oval(xM-8,yM-8,xM+8,yM+8,fill="brown",width=1)
  • lettre_M=can.create_text(xM,yM,text="M",fill="white")
  • marqueur_sA=can.create_oval(xMA-8,yMA-8,xMA+8,yMA+8,fill="brown",width=1)
  • lettre_sA=can.create_text(xMA,yMA,text="sA",fill="white")
  • marqueur_sB=can.create_oval(xMB-8,yMB-8,xMB+8,yMB+8,fill="brown",width=1)
  • lettre_sB=can.create_text(xMB,yMB,text="sB",fill="white")
  • marqueur_sC=can.create_oval(xMC-8,yMC-8,xMC+8,yMC+8,fill="brown",width=1)
  • lettre_sC=can.create_text(xMC,yMC,text="sC",fill="white")
  • root.after(10,animer)
  • def synthese():
  • " figure de synthèse"
  • global flag,tt,gg,hh,oo,ee,ii,gn,ss
  • flag,tt,gg,hh,oo,ee,ii,gn,ss=1,0,0,0,0,0,0,0,1
  • texte="A,B,C sommets\nG Centre de gravité\nH orthocentre\nO centre du cercle circonscrit\nE centre du cercle d' Euler\nI centre du cercle inscrit\nN point de Nagel\nGe point de Gergonne"
  • information.config(text=texte)
  • can.create_text(150,500,text="Le centre (O) du cercle circonscrit est à \nl' intersection des médiatrices des\ncôtés BC, CA, AB",fill="white")
  • triangle()
  • droite_Euler_1=can.create_line(xO,yO,xG,yG,fill="white",width=1)
  • droite_Euler_2=can.create_line(xH,yH,xG,yG,fill="white",width=1)
  • droite_Nagel=can.create_line(xI,yI,xNagel,yNagel,fill="white",width=1)
  • marqueur_G=can.create_oval(xG-8,yG-8,xG+8,yG+8,fill="pink",width=1)
  • lettre_G=can.create_text(xG,yG,text="G",fill="black")
  • marqueur_H=can.create_oval(xH-8,yH-8,xH+8,yH+8,fill="light blue",width=1)
  • lettre_H=can.create_text(xH,yH,text="H",fill="black")
  • centre_cercle_circonscrit=can.create_oval(xO-8,yO-8,xO+8,yO+8,fill="gold",width=1)
  • lettre_O=can.create_text(xO,yO,text="O",fill="black")
  • centre_cercle_Euler=can.create_oval(xE-8,yE-8,xE+8,yE+8,fill="white",width=1)
  • lettre_E=can.create_text(xE,yE,text="E",fill="black")
  • centre_cercle_inscrit=can.create_oval(xI-8,yI-8,xI+8,yI+8,fill="yellow",width=1)
  • lettre_I=can.create_text(xI,yI,text="I",fill="black")
  • point_de_Gergonne=can.create_oval(xGergonne-8,yGergonne-8,xGergonne+8,yGergonne+8,fill="light blue",width=1)
  • lettre_Ge=can.create_text(xGergonne,yGergonne,text="Ge",fill="black")
  • point_de_Nagel=can.create_oval(xNagel-8,yNagel-8,xNagel+8,yNagel+8,fill="orange",width=1)
  • lettre_N=can.create_text(xNagel,yNagel,text="N",fill="black")
  • root.after(10,animer)
  • def stop():
  • global flag
  • flag=0
  • dxA,dyA,dxB,dyB,dxC,dyC=0,0,0,0,0,0
  • def quitter():
  • ans=askokcancel('',"Voulez-vous réellement quitter ?")
  • if ans:root.quit()
  • ######## Programme principal ############################################
  • root = Tk()
  • root.title("#>>>>>>>| DROITE et CERCLE d' EULER |<<<<<<<# By HCD and XEOLIN")
  • root.bind('<Button-3>',pop_up)
  • root.bind('<Alt-F12>',pop_up)# commande au clavier du menu pop-up
  • # données initiales:
  • f=1 # facteur d'échelle lié à la résolution de l'écran du PC : on peut l'augmenter ou le diminuer
  • L,H=1200*f,800*f # largeur et hauteur du plan
  • flag,tt,gg,hh,oo,ee,ii,gn,ss,sm=0,0,0,0,0,0,0,0,0,0
  • infini=tan(pi/2)
  • xA,yA,xB,yB,xC,yC=100*f,100*f,50.,500*f,700*f,700*f
  • dxA,dyA,dxB,dyB,dxC,dyC=0.1*f,0.1*f,0.1*f,0.1*f,0.1*f,-0.1*f
  • can=Canvas(root,bg='dark green',height=H,width=L)
  • can.grid(row=1,column=1,rowspan=2)
  • can2=Canvas(root,bg='brown',highlightbackground='brown')
  • can2.grid(row=1,column=2,sticky=N)
  • information=Label(can2,text="",height=16,width=36,relief=GROOVE,bg="brown",fg="white",justify=LEFT,command=None)
  • information.pack(padx=4,pady=4,side=BOTTOM,anchor=SW)
  • Button(can2,text='Quitter le jeu !',height=1,width=35,relief=GROOVE,bg="white",command=quitter).pack(padx=5,pady=5,side=BOTTOM,anchor=SW)
  • Button(can2,text='Stop !',height=1,width=35,relief=GROOVE,bg="white",activebackground="dark green",activeforeground="white",command=stop).pack(padx=4,pady=4,side=BOTTOM,anchor=SW)
  • Button(can2,text='Figure de synthèse',height=1,width=35,relief=GROOVE,bg="white",activebackground="dark green",activeforeground="white",command=synthese).pack(padx=4,pady=4,side=BOTTOM,anchor=SW)
  • Button(can2,text='Droite de Simpson',height=1,width=35,relief=GROOVE,bg="white",activebackground="dark green",activeforeground="white",command=Simpson).pack(padx=4,pady=4,side=BOTTOM,anchor=SW)
  • Button(can2,text='Points de Gergonne et de Nagel',height=1,width=35,relief=GROOVE,bg="white",activebackground="dark green",activeforeground="white",command=Gergonne_Nagel).pack(padx=4,pady=4,side=BOTTOM,anchor=SW)
  • Button(can2,text='Cercle inscrit',height=1,width=35,relief=GROOVE,bg="white",activebackground="dark green",activeforeground="white",command=cercle_inscrit).pack(padx=4,pady=4,side=BOTTOM,anchor=SW)
  • Button(can2,text='''Cercle et droite d' Euler''',height=1,width=35,relief=GROOVE,bg="white",activebackground="dark green",activeforeground="white",command=Euler).pack(padx=4,pady=4,side=BOTTOM,anchor=SW)
  • Button(can2,text='Cercle circonscrit',height=1,width=35,relief=GROOVE,bg="white",activebackground="dark green",activeforeground="white",command=cercle_circonscrit).pack(padx=4,pady=4,side=BOTTOM,anchor=SW)
  • Button(can2,text='Orthocentre',height=1,width=35,relief=GROOVE,bg="white",activebackground="dark green",activeforeground="white",command=ortho_centre).pack(padx=4,pady=4,side=BOTTOM,anchor=SW)
  • Button(can2,text='Centre de gravité',height=1,width=35,relief=GROOVE,bg="white",activebackground="dark green",activeforeground="white",command=centre_de_gravite).pack(padx=4,pady=4,side=BOTTOM,anchor=SW)
  • Button(can2,text='Triangle',height=1,width=35,relief=GROOVE,bg="white",activebackground="dark green",activeforeground="white",command=animation_triangle).pack(padx=4,pady=4,side=BOTTOM,anchor=SW)
  • kmin,kmax,kdef=0,10,1
  • vitesse_jeu=Scale(can2,length=215,orient=HORIZONTAL,sliderlength=11,label="Vitesse de l'animation (entre 0 et 10)", from_ =kmin, to =kmax, troughcolor ='white',command =vitesse)
  • vitesse_jeu.pack(padx=1,pady=1,side=BOTTOM,anchor=SW)
  • vitesse_jeu.set(kdef)
  • ss=Scale(can2,length=215,orient=HORIZONTAL,sliderlength=11,label="Dimensionner la fenêtre (entre 1 et 10)",from_ =1,to=10,showvalue=10,command=naruto)
  • ss.pack(padx=1,pady=1,side=BOTTOM,anchor=SW)
  • ss.set(7)
  • root.config(bg="brown")
  • root.mainloop()
  • root.destroy()
#! /usr/bin/env python 
# -*- coding: Latin-1 -*- 
# Python version 2.4.2 
# Tk version 8.4 
# IDLE version 1.1.2 

# <<< DROITE et CERCLE d' EULER >>> 

# f : facteur d'échelle lié à la résolution de l'écran du PC : on peut l'augmenter ou le diminuer

#########################################################
#   version 11 

#Ce script a été vu, corrigé et amélioré par XEOLIN :
#  avec notamment :
#     - l' ajout d' un menu_bouton au clic droit de la souris       
#     - l' ajout d'une fonction "who create it ?"                   
#     - l' ajout d'un widget "Scale" permettant de redimensionner la fenêtre à l'écran                                   
                                   
#########################################################
#  PRESENTATION

# On considère le triangle quelconque ABC avec les points remarquables suivants :
#        G : centre de gravité
#        H : orthocentre
#        O : centre du cercle circonscrit
#        I   : centre du cercle inscrit
#        E : centre du  cercle d'Euler
#        Ge : point de Gergonne
#       N : point de Nagel

#  Le cercle d'Euler passe par les neufs points suivants :
#        les milieux des trois côtés du triangle :  mA, mB, mC
#        les pieds des hauteurs issues des trois sommets : hA, hB, hC
#        les milieux des segments joignant les trois sommets à l'orthocentre : aA, bB, cC
#  La droite d'Euler passe par les quatre points O, E, G, H :qui forment une division harmonique : EO / EG  =  HO / OG  ( = 3)
#  Les trois points G, I , N  sont alignés, avec la relation : GN =2*GI (on a aussi HN = 2*OI)

from Tkinter import* 
from math import *
from tkMessageBox import askokcancel

def pop_up(event=None) :
            frame = Frame(root, relief=RIDGE)
            entry = Entry(frame, width = '21')
            menu = Menu(entry, tearoff = 0)
            menu.add_command(label ='Présentation du script', underline =0,command = rahxephon)
            menu.add_separator()
            menu.add_command(label ='Triangle', underline =0,command = animation_triangle)
            menu.add_separator()
            menu.add_command(label ='Centre de gravité', underline =0,command = centre_de_gravite)
            menu.add_command(label ='Orthocentre', underline =0,command = ortho_centre)
            menu.add_command(label ='Cercle circonscrit', underline =0,command = cercle_circonscrit)
            menu.add_command(label ='Cercle et droite d\' Euler', underline =0,command = Euler)
            menu.add_command(label ='Cercle inscrit', underline =0,command = cercle_inscrit)
            menu.add_command(label ='Points de Gergonne et de Nagel', underline =0,command = Gergonne_Nagel)
            menu.add_command(label ='Droite de Simpson', underline =0,command = Simpson)
            menu.add_command(label ='Figure de synthèse', underline =0,command = synthese)
            menu.add_separator()
            menu.add_command(label ='Stop !', underline =0,command = stop)
            menu.add_command(label ='Quitter le jeu !', underline =0,command = quitter)
            menu.add_separator()
            menu.add_command(label ='A propos', underline =0,command = hack_sing)
            ycoord = entry.winfo_pointery()
            xcoord = entry.winfo_pointerx()
            menu.tk_popup(xcoord, ycoord)

def naruto(event=None) :
    global f,L,H,xA,yA,xB,yB,xC,yC,dxA,dyA,dxB,dyB,dxC,dyC
    n=ss.get()
    f=int(n)
    L,H=120.*f,80.*f
    xA,yA,xB,yB,xC,yC=10*f,10*f,5*f,50*f,70*f,70*f
    dxA,dyA,dxB,dyB,dxC,dyC=0.2*f,0.2*f,0.2*f,0.2*f,0.2*f,-0.2*f
    can.configure(height=H,width=L)

def rahxephon():
    global fen1
    fen1=Tk()
    fen1.configure (bg='grey100')
    fen1.geometry("%sx%s+0+0"%(root.winfo_screenwidth(),root.winfo_screenheight()))
    fen1.overrideredirect(TRUE)
    Label(fen1,text="""\n
Les propriétés du triangle ont intéressé de nombreux mathématiciens au cours  des siècles.
Tous se sont attachés à repérer des points remarquables dans le triangle et à mettre en lumière les relations qui pouvaient exister entre ces points.
Il en est ainsi de la droite d'EULER qui relie le centre de gravité, l'orthocentre, le centre du cercle circonscrit et le centre du cercle d'Euler.\n
On trouvera un excellent document sur ce sujet sur le site suivant :\n
http://www.reunion.iufm.fr/dep/mathematiques/abracadabri/geoplane/cocyclik/CInsEx3.htm

On considère le triangle quelconque ABC avec les points remarquables suivants :
        G : centre de gravité
        H : orthocentre
        O : centre du cercle circonscrit
        I   : centre du cercle inscrit
        E : centre du  cercle d'Euler
        Ge : point de Gergonne
        N : point de Nagel

  Le cercle d'Euler passe par les neufs points suivants :
        les milieux des trois côtés du triangle :  mA, mB, mC
        les pieds des hauteurs issues des trois sommets : hA, hB, hC
        les milieux des segments joignant les trois sommets à l'orthocentre : aA, bB, cC
  La droite d'Euler passe par les quatre points O, E, G, H :qui forment une division harmonique : EO / EG  =  HO / OG  ( = 3)
  Les trois points G, I , N  sont alignés, avec la relation : GN =2*GI (on a aussi HN = 2*OI)
""",bg='grey100',fg='grey0',font='Arial 15 bold',justify=LEFT).pack()
    Button(fen1,text='OK',command=fen1.destroy).pack()
    fen1.mainloop()

def hack_sing():
    global fen
    fen=Tk()
    fen.configure (bg='grey0')
    fen.geometry("%sx%s+0+0"%(root.winfo_screenwidth(),root.winfo_screenheight()))
    fen.overrideredirect(TRUE)
    Label(fen,text="""\n\n\n\n\n\n\n\n\n\n\n\n
By HCD avec le concours de XEOLIN""",bg='grey0',fg='grey100',font='Arial 20 bold').pack()
    Button(fen,text='OK',font='Arial 10 bold',command=fen.destroy).pack()
    fen.mainloop()

def vitesse(a):
    "récupération de la valeur (a) choisie sur l'échelle"
    global k
    k=0.1*int(a) #affectation à la variable <k>

def animer(): 
    "résolution du triangle et animation " 

    global xA,yA,xB,yB,xC,yC # coordonnées des sommets A, B, C
    global dxA,dyA,dxB,dyB,dxC,dyC # coordonnées des vecteurs vitesses des sommets A, B, C
    global a,b,c,p # longueur des côtés BC,CA,AB et demi périmètre
    global A,B,C #angles aux sommets A,B,C
    global xmA,ymA,xmB,ymB,xmC,ymC # coordonnées des milieux des côtés BC, CA, AB
    global xG,yG # coordonnées du centre de gravité (G)
    global xhA,yhA,xhB,yhB,xhC,yhC # coordonnées des pieds des hauteurs issues des trois sommets A, B, C
    global xH,yH # coordonnées de l'orthocentre (H)
    global  xO,yO,RO # coordonnées du centre (O) et rayon (RO) du cercle circonscrit
    global xE,yE,RE # coordonnées du centre (E) et rayon (RE) du cercle d'Euler
    global xaA,yaA,xbB,ybB,xcC,ycC # coordonnées des milieux des segments joignant les trois sommets à l'orthocentre
    global xGergonne,yGergonne,xNagel,yNagel # coordonnées des points de Gergonne et de Nagel
    global xI,yI,RI # coordonnées du centre (I) et rayon (RI) du cercle inscrit
    global xiA,yiA,xiB,yiB,xiC,yiC # coordonnées des points de contact entre le cercle inscrit et les côtés du triangle
    global xeA,yeA,xeB,yeB,xeC,yeC # coordonnées des points de contact entre les cercles exinscrits et les côtés du triangle
    global xM,yM,xMA,yMA,xMB,yMB,xMC,yMC
    global k
    k=0.9999*k
    if flag==1 :
        can.delete(ALL)
        # animation
        xA,yA,xB,yB,xC,yC=xA+k*dxA,yA+k*dyA,xB+k*dxB,yB+k*dyB,xC+k*dxC,yC+k*dyC

        # résolution du triangle
        a,b,c=hypot(xC-xB,yC-yB),hypot(xA-xC,yA-yC),hypot(xA-xB,yA-yB)
        p=(a+b+c)/2 # demi périmètre (p)
        RI=sqrt((p-a)*(p-b)*(p-c)/p)#  rayon (RI) du cercle inscrit
        if p==a:A=0
        if p==b:B=0
        if p==c:C=0
        if p==a or p==b or p==c:RI,RO=0,infini
        else:
            A,B,C=2*atan(RI/(p-a)),2*atan(RI/(p-b)),2*atan(RI/(p-c))# angles aux sommets
            RO=a*b*c/RI/p/4#  rayon (RO) du cercle circonscrit
        RE=RO/2 # rayon (RE) du cercle d'Euler

        # coordonnées des milieux des côtés BC, CA, AB et du centre de gravité G ( isobarycentre : A[1], B[1], C[1] )
        barycentre(0,1,1);xmA,ymA=x,y
        barycentre(1,0,1);xmB,ymB=x,y
        barycentre(1,1,0);xmC,ymC=x,y
        barycentre(1,1,1);xG,yG=x,y

        # coordonnées des pieds des hauteurs issues des trois sommets A, B, C et de l'orthocentre H : barycentre de A[tan(A)], B[tan(B)], C[tan(C)]
        barycentre(0,tan(B),tan(C));xhA,yhA=x,y
        barycentre(tan(A),0,tan(C));xhB,yhB=x,y
        barycentre(tan(A),tan(B),0);xhC,yhC=x,y
        barycentre(tan(A),tan(B),tan(C));xH,yH=x,y

       # coordonnées du centre (O)  du cercle circonscrit  : barycentre de A[sin(2*A)], B[sin(2*B)], C[sin(2*C)]
        barycentre(sin(2*A),sin(2*B),sin(2*C));xO,yO=x,y

        # coordonnées du centre (E) du cercle d'Euler
        xE,yE=(xO+xH)/2,(yO+yH)/2

        # coordonnées des milieux des segments joignant les trois sommets à l'orthocentre
        xaA,yaA= (xH+xA)/2,(yH+yA)/2
        xbB,ybB= (xH+xB)/2,(yH+yB)/2
        xcC,ycC= (xH+xC)/2,(yH+yC)/2

        # coordonnées du point de Gergonne : barycentre de A[(p-b)*(p-c)], B[(p-c)*(p-a)], C[(p-a)*(p-b)]
        barycentre((p-b)*(p-c),(p-c)*(p-a),(p-a)*(p-b));xGergonne,yGergonne=x,y

        # coordonnées du point de Nagel : barycentre de A[p-a], B[p-b], C[p-c]
        barycentre(p-a,p-b,p-c);xNagel,yNagel=x,y

        # coordonnées du centre (I) du cercle inscrit : barycentre de A[a], B[b], C[c]
        barycentre(a,b,c);xI,yI=x,y

        # coordonnées des points de contact entre le cercle inscrit et les côtés du triangle
        if p==a:xiA,yiA=0,0
        else:barycentre(0,(p-c)*(p-a),(p-a)*(p-b));xiA,yiA=x,y
        if p==b:xiB,yiB=0,0
        else:barycentre((p-b)*(p-c),0,(p-a)*(p-b));xiB,yiB=x,y
        if p==c:xiC,yiC=0,0
        else:barycentre((p-b)*(p-c),(p-c)*(p-a),0);xiC,yiC=x,y

        # coordonnées des points de contact entre les cercles exinscrit et les côtés du triangle
        xeA,yeA=2*xmA+-xiA,2*ymA+-yiA
        xeB,yeB=2*xmB+-xiB,2*ymB+-yiB
        xeC,yeC=2*xmC+-xiC,2*ymC+-yiC

        #  droite de Simpson
        xM=xO-RO/2
        yM=yO-sqrt(RO*RO-(xM-xO)*(xM-xO))
        if xB==xA:pC=infini
        else:pC=(yB-yA)/(xB-xA)
        if xC==xB:pA=infini
        else:pA=(yC-yB)/(xC-xB)
        if xA==xC:pB=infini
        else:pB=(yA-yC)/(xA-xC)
        xMC=(pC*(yM-yA)+xM+pC*pC*xA)/(1+pC*pC)
        yMC=(pC*(xM-xA)+yA+pC*pC*yM)/(1+pC*pC)
        xMA=(pA*(yM-yB)+xM+pA*pA*xB)/(1+pA*pA)
        yMA=(pA*(xM-xB)+yB+pA*pA*yM)/(1+pA*pA)
        xMB=(pB*(yM-yC)+xM+pB*pB*xC)/(1+pB*pB)
        yMB=(pB*(xM-xC)+yC+pB*pB*yM)/(1+pB*pB)
        
        # maintien du triangle dans le plan de jeu
        if xA<8 or xA>L-8:dxA,dxB,dxC=-dxA,-dxB,-dxC
        if xB<8 or xB>L-8:dxA,dxB,dxC=-dxA,-dxB,-dxC
        if xC<8 or xC>L-8:dxA,dxB,dxC=-dxA,-dxB,-dxC
        if yA<8 or yA>H-8:dyA,dyB,dyC=-dyA,dyB,dyC
        if yB<8 or yB>H-8:dyA,dyB,dyC=-dyA,-dyB,-dyC
        if yC<8 or yC>H-8:dyA,dyB,dyC=dyA,dyB,-dyC

        #lancement de l'animation des différentes figures
        if tt==1 and gg==0 and hh==0 and oo==0 and ee==0 and ii==0 and gn==0:animation_triangle()
        if tt==0 and gg==1 and hh==0 and oo==0 and ee==0 and ii==0 and gn==0:centre_de_gravite()
        if tt==0 and gg==0 and hh==1 and oo==0 and ee==0 and ii==0 and gn==0:ortho_centre()
        if tt==0 and gg==0 and hh==0 and oo==1 and ee==0 and ii==0 and gn==0:cercle_circonscrit()
        if tt==0 and gg==0 and hh==0 and oo==0 and ee==1 and ii==0 and gn==0:Euler()
        if tt==0 and gg==0 and hh==0 and oo==0 and ee==0 and ii==1 and gn==0:cercle_inscrit()
        if tt==0 and gg==0 and hh==0 and oo==0 and ee==0 and ii==0 and gn==1:Gergonne_Nagel()
        if tt==0 and gg==0 and hh==0 and oo==0 and ee==0 and ii==0 and gn==0 and ss==1:synthese()
        if tt==0 and gg==0 and hh==0 and oo==0 and ee==0 and ii==0 and gn==0 and ss==0 and sm==1:Simpson()

def barycentre(k1,k2,k3):
        " cette fonction donne les coordonnées x et y du barycentre des points A, B, C auxquels sont affectés les coefficients k1, k2, k3"
        global x,y
        m,n,o=k1,k2,k3
        x,y=(m*xA+n*xB+o*xC)/(m+n+o),(m*yA+n*yB+o*yC)/(m+n+o)

def animation_triangle():
    " A,B,C sont les sommets du triangle"
    global flag,tt,gg,hh,oo,ee,ii,gn
    flag,tt,gg,hh,oo,ee,ii,gn=1,1,0,0,0,0,0,0
    texte="A,B,C     sommets"
    information.config(text=texte)
    can.create_text(150,500,text="Le triangle a pour sommets A, B, C",fill="white")
    triangle()
    root.after(10,animer) 
    
def triangle():
    "dessin du triangle"
    cote_AB=can.create_line(xA,yA,xB,yB,fill="red",width=2)
    cote_BC=can. create_line(xB,yB,xC,yC,fill="red",width=2)
    cote_CA=can. create_line(xC,yC,xA,yA,fill="red",width=2)
    sommet_A=can.create_oval(xA-8,yA-8,xA+8,yA+8,fill="red",width=1)
    sommet_B=can.create_oval(xB-8,yB-8,xB+8,yB+8,fill="red",width=1)
    sommet_C=can.create_oval(xC-8,yC-8,xC+8,yC+8,fill="red",width=1)
    lettre_A=can.create_text(xA,yA,text="A",fill="white")
    lettre_B=can.create_text(xB,yB,text="B",fill="white")
    lettre_C=can.create_text(xC,yC,text="C",fill="white")

def centre_de_gravite():
    " mA,mB,mC sont les milieux des côtés du triangle et G le centre de gravité"
    global flag,tt,gg,hh,oo,ee,ii
    flag,tt,gg,hh,oo,ee,ii,gn=1,0,1,0,0,0,0,0
    texte="A,B,C     sommets\nG     Centre de gravité"
    information.config(text=texte)
    can.create_text(150,500,text="Le centre de gravité G est à l' intersection \ndes droites issues des sommets A, B, C et \npassant par les milieux des côtés BC, CA, AB",fill="white")
    ligne_mA_A=can.create_line(xA,yA,xmA,ymA,fill='#007030',width=2)
    ligne_mB_B=can.create_line(xB,yB,xmB,ymB,fill='#007030',width=2)
    ligne_mC_C=can.create_line(xC,yC,xmC,ymC,fill='#007030',width=2)
    triangle()
    mA=can.create_oval(xmA-3,ymA-3,xmA+3,ymA+3,fill="pink",width=1)
    mB=can.create_oval(xmB-3,ymB-3,xmB+3,ymB+3,fill="pink",width=1)
    mC=can.create_oval(xmC-3,ymC-3,xmC+3,ymC+3,fill="pink",width=1)
    marqueur_G=can.create_oval(xG-8,yG-8,xG+8,yG+8,fill="pink",width=1)
    lettre_G=can.create_text(xG,yG,text="G",fill="black")
    root.after(10,animer) 

def ortho_centre():
    " hA,hB,hC sont les pieds des hauteurs issues des sommets du triangle et H l'orthocentre"
    global flag,tt,gg,hh,oo,ee,ii,gn
    flag,tt,gg,hh,oo,ee,ii,gn=1,0,0,1,0,0,0,0
    texte="A,B,C     sommets\nH    orthocentre"
    information.config(text=texte)
    can.create_text(150,500,text="L' orthocentre H est à l' intersection \ndes hauteurs issues des sommets A, B, C",fill="white")
    ligne_hA_A=can.create_line(xA,yA,xhA,yhA,fill='#007030',width=2)
    ligne_hB_B=can.create_line(xB,yB,xhB,yhB,fill='#007030',width=2)
    ligne_hC_C=can.create_line(xC,yC,xhC,yhC,fill='#007030',width=2)
    ligne_hA_H=can.create_line(xH,yH,xhA,yhA,fill='#007030',width=2)
    ligne_hB_H=can.create_line(xH,yH,xhB,yhB,fill='#007030',width=2)
    ligne_hC_H=can.create_line(xH,yH,xhC,yhC,fill='#007030',width=2)
    triangle()
    hA=can.create_oval(xhA-3,yhA-3,xhA+3,yhA+3,fill="light blue",width=1)
    hB=can.create_oval(xhB-3,yhB-3,xhB+3,yhB+3,fill="light blue",width=1)
    hC=can.create_oval(xhC-3,yhC-3,xhC+3,yhC+3,fill="light blue",width=1)
    marqueur_H=can.create_oval(xH-8,yH-8,xH+8,yH+8,fill="light blue",width=1)
    lettre_H=can.create_text(xH,yH,text="H",fill="black")
    root.after(10,animer) 

def cercle_circonscrit():
    "centre (O) et rayon (RO) du cercle circonscrit "
    global flag,tt,gg,hh,oo,ee,ii,gn
    flag,tt,gg,hh,oo,ee,ii,gn=1,0,0,0,1,0,0,0
    texte='''A,B,C     sommets\nO     centre du cercle circonscrit'''
    information.config(text=texte)
    can.create_text(150,500,text="Le centre (O) du cercle circonscrit est à  \nl' intersection des médiatrices des\ncôtés BC, CA, AB",fill="white")
    cercle_circonscrit=can.create_oval(xO-RO,yO-RO,xO+RO,yO+RO,outline='gold',width=1)
    ligne_mA_CT=can.create_line(xO,yO,xmA,ymA,fill='#007030',width=2)
    ligne_mB_CT=can.create_line(xO,yO,xmB,ymB,fill='#007030',width=2)
    ligne_mC_CT=can.create_line(xO,yO,xmC,ymC,fill='#007030',width=2)
    triangle()
    mA=can.create_oval(xmA-3,ymA-3,xmA+3,ymA+3,fill="gold",width=1)
    mB=can.create_oval(xmB-3,ymB-3,xmB+3,ymB+3,fill="gold",width=1)
    mC=can.create_oval(xmC-3,ymC-3,xmC+3,ymC+3,fill="gold",width=1)
    centre_cercle_circonscrit=can.create_oval(xO-8,yO-8,xO+8,yO+8,fill="gold",width=1)
    lettre_O=can.create_text(xO,yO,text="O",fill="black")
    root.after(10,animer) 

def Euler():
    "centre (E) et rayon (RE) du cercle d'Euler et droite d'Euler"
    global flag,tt,gg,hh,oo,ee,ii,gn
    flag,tt,gg,hh,oo,ee,ii,gn=1,0,0,0,0,1,0,0
    texte="A,B,C     sommets\nG     Centre de gravité\nH    orthocentre\nO     centre du cercle circonscrit\nE     centre du cercle d' Euler"
    information.config(text=texte)
    can.create_text(250,500,text= '''Le cercle d' Euler passe par les 9 points suivants :
        - les milieux des trois côtés du triangle
        - les pieds des hauteurs issues des trois sommets
        - les milieux des segments joignant les trois sommets à l'orthocentre

La droite d' Euler relie les 4 points suivants:   G, H, O, E
        avec la relation    EO / EG = HO / OG ( = 3)''',fill="white")
    triangle()
    droite_Euler_1=can.create_line(xO,yO,xG,yG,fill="white",width=1)
    droite_Euler_2=can.create_line(xH,yH,xG,yG,fill="white",width=1)
    centre_cercle_Euler=can.create_oval(xE-8,yE-8,xE+8,yE+8,fill="white",width=1)
    cercle_Euler=can.create_oval(xE-RE,yE-RE,xE+RE,yE+RE,outline="white",width=1)
    lettre_E=can.create_text(xE,yE,text="E",fill="black")
    centre_cercle_circonscrit=can.create_oval(xO-8,yO-8,xO+8,yO+8,fill="gold",width=1)
    lettre_O=can.create_text(xO,yO,text="O",fill="black")
    marqueur_G=can.create_oval(xG-8,yG-8,xG+8,yG+8,fill="pink",width=1)
    lettre_G=can.create_text(xG,yG,text="G",fill="black")
    marqueur_H=can.create_oval(xH-8,yH-8,xH+8,yH+8,fill="light blue",width=1)
    lettre_H=can.create_text(xH,yH,text="H",fill="black")
    aA=can.create_oval(xaA-3,yaA-3,xaA+3,yaA+3,fill="green",width=1)
    bB=can.create_oval(xbB-3,ybB-3,xbB+3,ybB+3,fill="green",width=1)
    cC=can.create_oval(xcC-3,ycC-3,xcC+3,ycC+3,fill="green",width=1)
    mA=can.create_oval(xmA-3,ymA-3,xmA+3,ymA+3,fill="pink",width=1)
    mB=can.create_oval(xmB-3,ymB-3,xmB+3,ymB+3,fill="pink",width=1)
    mC=can.create_oval(xmC-3,ymC-3,xmC+3,ymC+3,fill="pink",width=1)
    hA=can.create_oval(xhA-3,yhA-3,xhA+3,yhA+3,fill="light blue",width=1)
    hB=can.create_oval(xhB-3,yhB-3,xhB+3,yhB+3,fill="light blue",width=1)
    hC=can.create_oval(xhC-3,yhC-3,xhC+3,yhC+3,fill="light blue",width=1)
    root.after(10,animer) 

def cercle_inscrit():
    "centre (I) et rayon (RI) du cercle inscrit et droite reliant les points de Gergonne et de Nagel"
    global flag,tt,gg,hh,oo,ee,ii,gn
    flag,tt,gg,hh,oo,ee,ii,gn=1,0,0,0,0,0,1,0
    texte="A,B,C     sommets\nG     Centre de gravité\nI     centre du Cercle inscrit\nN     point de Nagel\nGe     point de Gergonne"
    information.config(text=texte)
    can.create_text(150,500,text="Le centre (I) du cercle inscrit est à l' intersection\ndes bissectrices issues des sommets    A, B, C",fill="white")
    ligne_A_I=can.create_line(xI,yI,xA,yA,fill='#007030',width=2)
    ligne_B_I=can.create_line(xI,yI,xB,yB,fill='#007030',width=2)
    ligne_C_I=can.create_line(xI,yI,xC,yC,fill='#007030',width=2)
    ligne_iA_I=can.create_line(xI,yI,xiA,yiA,fill='#007030',width=1)
    ligne_iB_I=can.create_line(xI,yI,xiB,yiB,fill='#007030',width=1)
    ligne_iC_I=can.create_line(xI,yI,xiC,yiC,fill='#007030',width=1)
    cercle_inscrit=can.create_oval(xI-RI,yI-RI,xI+RI,yI+RI,outline='yellow',width=1)
    triangle()
    centre_cercle_inscrit=can.create_oval(xI-8,yI-8,xI+8,yI+8,fill="yellow",width=1)
    lettre_I=can.create_text(xI,yI,text="I",fill="black")
    marqueur_iA=can.create_oval(xiA-3,yiA-3,xiA+3,yiA+3,fill="yellow",width=1)
    marqueur_iB=can.create_oval(xiB-3,yiB-3,xiB+3,yiB+3,fill="yellow",width=1)
    marqueur_iC=can.create_oval(xiC-3,yiC-3,xiC+3,yiC+3,fill="yellow",width=1)
    root.after(10,animer) 

def Gergonne_Nagel():
    "centre (I) et rayon (RI) du cercle inscrit et droite reliant les points de Gergonne et de Nagel"
    global flag,tt,gg,hh,oo,ee,ii,gn
    flag,tt,gg,hh,oo,ee,ii,gn=1,0,0,0,0,0,0,1
    texte="A,B,C     sommets\nN     point de Nagel\nGe     point de Gergonne"
    information.config(text=texte)
    can.create_text(250,500,text= '''Le point de Gergonne est à l'intersection des droites issues des sommets et passant 
par les points de contact du cercle inscrit avec les côtés du triangle
    
Le point de Nagel est à l'intersection des droites issues des sommets et passant par
les points de contact des cercles exinscrits avec les côtés du triangle

La droite de Nagel relie les 3 points suivants : N, G, I
        avec  la relation    IG = GN / 2''',fill="white")
    cercle_inscrit=can.create_oval(xI-RI,yI-RI,xI+RI,yI+RI,outline='#007030',width=1)
    ligne_iA_A=can.create_line(xA,yA,xiA,yiA,fill='#007030',width=2)
    ligne_iB_B=can.create_line(xB,yB,xiB,yiB,fill='#007030',width=2)
    ligne_iC_C=can.create_line(xC,yC,xiC,yiC,fill='#007030',width=2)
    ligne_eA_A=can.create_line(xA,yA,xeA,yeA,fill='#007030',width=2)
    ligne_eB_B=can.create_line(xB,yB,xeB,yeB,fill='#007030',width=2)
    ligne_eC_C=can.create_line(xC,yC,xeC,yeC,fill='#007030',width=2)
    triangle()
    droite_Nagel=can.create_line(xI,yI,xNagel,yNagel,fill="white",width=1)
    centre_cercle_inscrit=can.create_oval(xI-8,yI-8,xI+8,yI+8,fill="yellow",width=1)
    lettre_I=can.create_text(xI,yI,text="I",fill="black")
    point_de_Gergonne=can.create_oval(xGergonne-8,yGergonne-8,xGergonne+8,yGergonne+8,fill="light blue",width=1)
    lettre_Ge=can.create_text(xGergonne,yGergonne,text="Ge",fill="black")
    point_de_Nagel=can.create_oval(xNagel-8,yNagel-8,xNagel+8,yNagel+8,fill="orange",width=1)
    lettre_N=can.create_text(xNagel,yNagel,text="N",fill="black")
    marqueur_G=can.create_oval(xG-8,yG-8,xG+8,yG+8,fill="pink",width=1)
    lettre_G=can.create_text(xG,yG,text="G",fill="black")
    marqueur_iA=can.create_oval(xiA-3,yiA-3,xiA+3,yiA+3,fill="light blue",width=1)
    marqueur_iB=can.create_oval(xiB-3,yiB-3,xiB+3,yiB+3,fill="light blue",width=1)
    marqueur_iC=can.create_oval(xiC-3,yiC-3,xiC+3,yiC+3,fill="light blue",width=1)
    marqueur_eA=can.create_oval(xeA-3,yeA-3,xeA+3,yeA+3,fill="orange",width=1)
    marqueur_eB=can.create_oval(xeB-3,yeB-3,xeB+3,yeB+3,fill="orange",width=1)
    marqueur_eC=can.create_oval(xeC-3,yeC-3,xeC+3,yeC+3,fill="orange",width=1)
    root.after(10,animer) 

def Simpson():
    " droite de Simpson"
    global flag,tt,gg,hh,oo,ee,ii,gn,ss,sm
    flag,tt,gg,hh,oo,ee,ii,gn,ss,sm=1,0,0,0,0,0,0,0,0,1
    texte="A,B,C     sommets\nM     est sur le cercle circonscrit\nsA,sB,sC     pieds des hauteurs issues de M"
    information.config(text=texte)
    can.create_text(150,500,text="La droite de Simpson relie \nles pieds des hauteurs issues de M",fill="white")
    triangle()
    ligne_sA_M=can.create_line(xM,yM,xMA,yMA,fill='#007030',width=2)
    ligne_sB_M=can.create_line(xM,yM,xMB,yMB,fill='#007030',width=2)
    ligne_sC_M=can.create_line(xM,yM,xMC,yMC,fill='#007030',width=2)
    ligne_sA_sB=can.create_line(xMB,yMB,xMA,yMA,fill='white',width=1)
    ligne_sB_sC=can.create_line(xMC,yMC,xMB,yMB,fill='white',width=1)
    ligne_sC_sA=can.create_line(xMA,yMA,xMC,yMC,fill='white',width=1)
    cercle_circonscrit=can.create_oval(xO-RO,yO-RO,xO+RO,yO+RO,outline='gold',width=1)
    marqueur_M=can.create_oval(xM-8,yM-8,xM+8,yM+8,fill="brown",width=1)
    lettre_M=can.create_text(xM,yM,text="M",fill="white")
    marqueur_sA=can.create_oval(xMA-8,yMA-8,xMA+8,yMA+8,fill="brown",width=1)
    lettre_sA=can.create_text(xMA,yMA,text="sA",fill="white")
    marqueur_sB=can.create_oval(xMB-8,yMB-8,xMB+8,yMB+8,fill="brown",width=1)
    lettre_sB=can.create_text(xMB,yMB,text="sB",fill="white")
    marqueur_sC=can.create_oval(xMC-8,yMC-8,xMC+8,yMC+8,fill="brown",width=1)
    lettre_sC=can.create_text(xMC,yMC,text="sC",fill="white")
    root.after(10,animer) 
   
def synthese():
    " figure de synthèse"
    global flag,tt,gg,hh,oo,ee,ii,gn,ss
    flag,tt,gg,hh,oo,ee,ii,gn,ss=1,0,0,0,0,0,0,0,1
    texte="A,B,C     sommets\nG     Centre de gravité\nH    orthocentre\nO     centre du cercle circonscrit\nE     centre du cercle d' Euler\nI     centre du cercle inscrit\nN     point de Nagel\nGe     point de Gergonne"
    information.config(text=texte)
    can.create_text(150,500,text="Le centre (O) du cercle circonscrit est à  \nl' intersection des médiatrices des\ncôtés BC, CA, AB",fill="white")
    triangle()
    droite_Euler_1=can.create_line(xO,yO,xG,yG,fill="white",width=1)
    droite_Euler_2=can.create_line(xH,yH,xG,yG,fill="white",width=1)
    droite_Nagel=can.create_line(xI,yI,xNagel,yNagel,fill="white",width=1)
    marqueur_G=can.create_oval(xG-8,yG-8,xG+8,yG+8,fill="pink",width=1)
    lettre_G=can.create_text(xG,yG,text="G",fill="black")
    marqueur_H=can.create_oval(xH-8,yH-8,xH+8,yH+8,fill="light blue",width=1)
    lettre_H=can.create_text(xH,yH,text="H",fill="black")
    centre_cercle_circonscrit=can.create_oval(xO-8,yO-8,xO+8,yO+8,fill="gold",width=1)
    lettre_O=can.create_text(xO,yO,text="O",fill="black")
    centre_cercle_Euler=can.create_oval(xE-8,yE-8,xE+8,yE+8,fill="white",width=1)
    lettre_E=can.create_text(xE,yE,text="E",fill="black")
    centre_cercle_inscrit=can.create_oval(xI-8,yI-8,xI+8,yI+8,fill="yellow",width=1)
    lettre_I=can.create_text(xI,yI,text="I",fill="black")
    point_de_Gergonne=can.create_oval(xGergonne-8,yGergonne-8,xGergonne+8,yGergonne+8,fill="light blue",width=1)
    lettre_Ge=can.create_text(xGergonne,yGergonne,text="Ge",fill="black")
    point_de_Nagel=can.create_oval(xNagel-8,yNagel-8,xNagel+8,yNagel+8,fill="orange",width=1)
    lettre_N=can.create_text(xNagel,yNagel,text="N",fill="black")
    root.after(10,animer) 

def stop(): 
    global flag
    flag=0 
    dxA,dyA,dxB,dyB,dxC,dyC=0,0,0,0,0,0

def quitter():
    ans=askokcancel('',"Voulez-vous réellement quitter ?")
    if ans:root.quit()

######## Programme principal ############################################ 

root = Tk() 
root.title("#>>>>>>>| DROITE et CERCLE d' EULER |<<<<<<<# By HCD and XEOLIN") 

root.bind('<Button-3>',pop_up)
root.bind('<Alt-F12>',pop_up)# commande au clavier du menu pop-up

# données initiales: 
f=1  # facteur d'échelle lié à la résolution de l'écran du PC : on peut l'augmenter ou le diminuer
L,H=1200*f,800*f # largeur  et hauteur du plan 
flag,tt,gg,hh,oo,ee,ii,gn,ss,sm=0,0,0,0,0,0,0,0,0,0
infini=tan(pi/2)
xA,yA,xB,yB,xC,yC=100*f,100*f,50.,500*f,700*f,700*f
dxA,dyA,dxB,dyB,dxC,dyC=0.1*f,0.1*f,0.1*f,0.1*f,0.1*f,-0.1*f

can=Canvas(root,bg='dark green',height=H,width=L) 
can.grid(row=1,column=1,rowspan=2) 
can2=Canvas(root,bg='brown',highlightbackground='brown') 
can2.grid(row=1,column=2,sticky=N) 

information=Label(can2,text="",height=16,width=36,relief=GROOVE,bg="brown",fg="white",justify=LEFT,command=None) 
information.pack(padx=4,pady=4,side=BOTTOM,anchor=SW) 
Button(can2,text='Quitter le jeu !',height=1,width=35,relief=GROOVE,bg="white",command=quitter).pack(padx=5,pady=5,side=BOTTOM,anchor=SW) 
Button(can2,text='Stop !',height=1,width=35,relief=GROOVE,bg="white",activebackground="dark green",activeforeground="white",command=stop).pack(padx=4,pady=4,side=BOTTOM,anchor=SW) 
Button(can2,text='Figure de synthèse',height=1,width=35,relief=GROOVE,bg="white",activebackground="dark green",activeforeground="white",command=synthese).pack(padx=4,pady=4,side=BOTTOM,anchor=SW) 
Button(can2,text='Droite de Simpson',height=1,width=35,relief=GROOVE,bg="white",activebackground="dark green",activeforeground="white",command=Simpson).pack(padx=4,pady=4,side=BOTTOM,anchor=SW) 
Button(can2,text='Points de Gergonne et de Nagel',height=1,width=35,relief=GROOVE,bg="white",activebackground="dark green",activeforeground="white",command=Gergonne_Nagel).pack(padx=4,pady=4,side=BOTTOM,anchor=SW) 
Button(can2,text='Cercle inscrit',height=1,width=35,relief=GROOVE,bg="white",activebackground="dark green",activeforeground="white",command=cercle_inscrit).pack(padx=4,pady=4,side=BOTTOM,anchor=SW) 
Button(can2,text='''Cercle et droite d' Euler''',height=1,width=35,relief=GROOVE,bg="white",activebackground="dark green",activeforeground="white",command=Euler).pack(padx=4,pady=4,side=BOTTOM,anchor=SW) 
Button(can2,text='Cercle circonscrit',height=1,width=35,relief=GROOVE,bg="white",activebackground="dark green",activeforeground="white",command=cercle_circonscrit).pack(padx=4,pady=4,side=BOTTOM,anchor=SW) 
Button(can2,text='Orthocentre',height=1,width=35,relief=GROOVE,bg="white",activebackground="dark green",activeforeground="white",command=ortho_centre).pack(padx=4,pady=4,side=BOTTOM,anchor=SW) 
Button(can2,text='Centre de gravité',height=1,width=35,relief=GROOVE,bg="white",activebackground="dark green",activeforeground="white",command=centre_de_gravite).pack(padx=4,pady=4,side=BOTTOM,anchor=SW) 
Button(can2,text='Triangle',height=1,width=35,relief=GROOVE,bg="white",activebackground="dark green",activeforeground="white",command=animation_triangle).pack(padx=4,pady=4,side=BOTTOM,anchor=SW) 
kmin,kmax,kdef=0,10,1
vitesse_jeu=Scale(can2,length=215,orient=HORIZONTAL,sliderlength=11,label="Vitesse de l'animation    (entre 0 et 10)", from_ =kmin, to =kmax, troughcolor ='white',command =vitesse)
vitesse_jeu.pack(padx=1,pady=1,side=BOTTOM,anchor=SW) 
vitesse_jeu.set(kdef)
ss=Scale(can2,length=215,orient=HORIZONTAL,sliderlength=11,label="Dimensionner la fenêtre    (entre 1 et 10)",from_ =1,to=10,showvalue=10,command=naruto)
ss.pack(padx=1,pady=1,side=BOTTOM,anchor=SW) 
ss.set(7)
root.config(bg="brown") 
root.mainloop() 
root.destroy()   


 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

23 mai 2006 17:23:53 :
Fonctionnalité ajoutée:O, E, G, C forment une division harmonique EO/EG=CO/CG=3
24 mai 2006 10:59:44 :
Amélioration de la présentation à l'écran
30 mai 2006 22:37:00 :
Incorporation de boutons pour commander l'animation des différentes figures. Ajout d'un curseur pour faire varier la vitesse de l'animation.
01 juin 2006 22:18:06 :
Diverses améliorations dans l'écriture du code et les commentaires
06 juin 2006 14:20:37 :
Simplification du code par l'utilisation systématique de la fonction "barycentre" pour calculer les coordonnées des points remarquables du triangle. Amélioration de la présentation des textes. Introduction d'un "facteur d'échelle" (f) permettant d'agrandir ou de réduire la fenêtre Tkinter en fonction des caractéristiques de l'écran du PC.
08 juin 2006 00:54:37 :
Introduction d'un menu pop-up pour sélectionner les différentes figures avec le clic droit de la souris.
10 juin 2006 14:39:39 :
Ajout d'un widget "Scale" permettant de redimensionner la fenêtre Tkinter pour l'adapter à la taille de l'écran. Correction du texte de " Présentation du script"
19 juin 2006 10:49:02 :
Ajout d'une capture d'écran
26 juin 2006 17:05:08 :
Nouvelle fonctionnalité : la droite de Simpson

 Sources du même auteur

Source avec Zip MASTERMIND (PAR JULIE ET HCD)
Source avec Zip Source avec une capture RÉSOLUTION DES ÉQUATIONS DU 4ÈME DEGRÉ
Source avec Zip Source avec une capture LE CENTRE DU CERCLE RETROUVÉ PAR NAPOLÉON !
Source avec Zip COLLISIONS EN 3D AVEC VISUAL PYTHON
Source avec Zip Source avec une capture UN SERPENT PYTHON ... PAS COMME LES AUTRES !

 Sources de la même categorie

Source avec une capture MISE EN EVIDENCE DE L'ALGORITHME A STAR GRAPHIQUEMENT par Mints
Source avec Zip BASE64 ENCRYPT/DECRYPT PYTHON BY MAXOU56800 par Maxou56800
Source avec Zip Source avec une capture TRIANGULATION par mecrosoft
Source avec Zip Source avec une capture COURBE DE BEZIER par mecrosoft
Source avec Zip Source avec une capture CALCUL D'AIRE D'UN TRIANGLE [INTERFACE GRAPHIQUE] par SeventhSon

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture CALCUL D'AIRE D'UN TRIANGLE [INTERFACE GRAPHIQUE] par SeventhSon
Source avec Zip Source avec une capture TRACER UEN COURBE AVEC LA MÉTHODE D'EULER par LokR

Commentaires et avis

Commentaire de xeolin le 27/05/2006 12:00:05

alors la hcd tu m'épate : j'ai jamais vu une formule mathematique aussi compliquée !!!

bon sinon TA PAS HONTE !!
y a même pas de truc pour acceler le mouvement de ta 'chose'.

de plus franchement a quoi ca sert d'avoir 3 menu bouton pour avoir une fonction dans chacune et pour finir tu n'a même pas mis de fonction credits !

et un menu pop-up avec le bouton droit ne serait pas de trop...

et il n'y a pas de titre sur la fenetre demandant si on veut ou non quiter...

Commentaire de HCD le 30/05/2006 22:58:35

A l'attention de XEOLIN.

Je suis content de te voir réagir.
Le code paraît compliqué: en fait,il ne l'est pas.
Je dirais plutôt qu'il est "lourd".
Ceci tient au fait que tous les points remarquables du triangle se définissent comme intersections de droites en coordonnées cartésiennes dans la fenêtre Tkinter.
Pour tenir compte de tes remarques, je viens de mettre sur le site une nouvelle version avec notamment un curseur permettant de faire varier la vitesse de l'animation de la "chose"...Le système de boutons est complètement revu.
Pour le "menu pop-up avec le bouton droit", je veux bien, mais je ne sais pas comment m'y prendre ???
A+ au plaisir de te lire
HCD

Commentaire de xeolin le 01/06/2006 16:40:04

Non c pas la peine de m'expliquer (j'amais entendu le mot cartésiennes)
car mon  niveau de math ne me permet pas de, de comprendre.

(même si je suis le meilleur de la classe , eh en pratiquement tout (NB je pense
que tu comprent le presque, voir mes fautes d'hortographes))

de plus il y aa une source sur python france : MENU POPUP AU CLIC DROIT DE LA SOURIS
de  frankystadore

qui l'a franchement mal ecrit...
class voi :
  def popupChoices(self, event=None):
    """Popup right-click menu of special parameter operations"""
    self.frame = Frame(self.window, relief=RIDGE)
    self.entry = Entry(self.frame, width = '21')
    self.menu = Menu(self.entry, tearoff = 0)
    self.menu.add_command(label = "1",command = None)
    self.menu.add_separator()
    self.menu.add_command(label = "2",command = None)
    self.menu.add_command(label = "3",command = None)
    ycoord = self.entry.winfo_pointery()
    xcoord = self.entry.winfo_pointerx()
    self.menu.tk_popup(xcoord, ycoord)

Commentaire de xeolin le 01/06/2006 16:46:25

g pris des bonnes résolutons :
orthographe ne s'écrit pas hortographes
jamais ne s'écrit pas j'amais
tu comprends ne s'écrit pas tu comprent

et oui pour que l'on ne pense pas du bien de frankystadore (Conquestador)
c moi qui ai entierement réécrit la source :)

Commentaire de HCD le 01/06/2006 22:52:07

Salut XEOLIN !

Pour info : "cartésien" vient du nom du philosophe et mathématicien René DESCARTES ( 1596-1650 ). C'est ainsi que l' on désigne un repère Ox,Oy dans le plan : tout point y a pour coordonnées x(abcisse) et y(ordonnée).
Que tu sois le meilleur de la classe ne me surprend pas ...
Quant à l'ortho, je sais que c'est du boulot, mais pas plus que d'apprendre à programmer : comme la syntaxe,cela ne s'invente pas... Il faut simplement s'y "coller".
Je viens de remettre une nouvelle version sur le site qui comporte des améliorations du code, mais je n'ai pas intégré le menu POPUP.
En fait,j'ai essayé, mais je n'ai pas réussi.
Peux-tu me donner un coup de main STP ?
C'est nouveau pour moi.
MERCI encore et A+
HCD

Commentaire de xeolin le 02/06/2006 21:09:41

je sais mais l'hortographe c dur...  
mé HCD tou mé décois car tou a oublié moun dernier conseille : mé des "stat=DISABLED" a tes boutons (tu sé quant lé boutones sone désactibé) (que j'aime écrire en phonétique)

et puis le nombre de pixels de ton ordi s'exprime en miliards ou quoi : comme pour ton serpent pas comme les autre tu oublit que les autres ont des résolutions plus faible (moi je suis en 1280/960 et ca rentre même pas dans l'écrant donc ca serai simpas de fair une version 800/500)
et pour finir, je sais plus...

A oui je vais te modifier ton script quant tu aura changé la résolution de ton programme fesant (faute mé ché pas ou) qui fé avancé la "CHOSE"

et pis c'est a peu prés tout.

Xeolin ou Sk8gis ou Tipro75 ou Aegis

et c ca l'evolution des psedo...

et pour ceux qui veulent connaitre l'etimologie de Xeolin :
ca vien du dessin animé s'appelant Rah-Xephon
ou le pilote de cette antitée est surnomé Olin (j'ai pas compris pq)
et j'ai trouvé que xéolin était simpas comme tout...

et oui (A les grand discour...):

j'ai demandé a ma prof de math ce qu'était la "droite d' Euler" (bon j'ai dit "courbe d' Euler")
et elle m'a répondu quelle ne savait pas...

et 2 question personelles :
1-quelle est ta touche préférée du clavier ?
2-et quelle est ta phrase de philo préférée ?

les deux sont dificile a répondre...

1-La touche Fin seulement a cause de son utilitée
2- "Les relations humaines sont essenciellement (big faute mé ché pas toujours ou) basés sur des interet comuns (2 big faure mé idem)"

A+ au plaisir de te lire  (j'ai bien aimé cette formule)
XeOlin

Commentaire de HCD le 06/06/2006 15:38:12

Merci XEOLIN pour ta réponse.

Voici la mienne dans l'ordre de tes remarques.

1° "activer/désactiver" les boutons : je n'ai rien fait pour le moment, car je pense qu'il est peut-être préférable de laisser la possibilité d'aller d'un bouton à un autre (pour revoir une figure, par exemple). Quel est ton avis ?

2° Taille de l'écran et nombre de pixels : je n'y avais pas pensé. Comme solution, j'ai ajouté au début du script un "facteur d'échelle" (f) réglable.Il vaut 0.75 au départ.(je suis avec f=1 avec mon grand écran).

3° Merci pour l'info sur l'origine de ton PSEUDO; Il sonne bien en effet.

4° Une prof de math qui ne connaît pas la droite d'Euler : cela me surprend beaucoup, car c'est une grande classique quand on étudie les propriétés remarquables des triangles. Tu devrais lui redemander en lui parlant bien de "droite".

5° A ta question 1, ma réponse est la lettre "X" :
    X désigne le plus souvent une variable inconnue dans une équation
    X est aussi la lettre symbole de lEcole Polytechnique (des forts en math !)

6° A la question 2, il y a une phrase que j'aime bien dans la fable de LA FONTAINE intitulée"Le lion et le rat" :

     " Patience et longueur de temps font plus que force ni que rage"

A bientôt sur le site

(PS: je viens de mettre une version 7 sur le site)

HCD

Commentaire de xeolin le 06/06/2006 20:33:12

1° escuse moi de m'être mal exprime : si tu clique par exemple 2 fois d'afilés sur le bouton triangle, il iras 2x+ vite et si tu recommence plusieur(s?) fois encore le script se mettera a boeuger....

2° je sais que c'est embetant a faire mais tu pourai metre un widget (Scale) pour changer la grandeur de la fenetre

3° mais de rien et le tien :

Ho
C'est
Difficile

non?

4. bon j'ai dit droite (et non courbe) et cercle d'Euler et tout d'un coup un delic est apparut  tombant comme un aiclair sur ma prof (bon j'en fé un peut trop) t elle m'a expliquer  l'origine

bon d'apres ce que je me souvient c'est (pour la droite)

le centre du cercle inscrit et le circonscrit et l'orthocentre qui sont alignés sur une même droite

et pour le cercle : c'est 7 (ou 8) point qui sont sur un cercle dont certaint sont issue du pied qegrhioqrhgrhsrhuoqhgjqnç'"èé-_çè-çà"'uihui( brouhaha ) zefjiqhtze_"-è_uid

et vla.

5° bobn je te poserai 2 question a chaque fois que je te mailrait ( holala le super vocabulaire   bon on va dire que je posterai un message t'étant adressé) j'en ai fait une pour ton psedo et he... bon...

as-tu vraiment 63 ans?
(non franchement tu fais plus jeune)

6° Moi ma fable preférée est : 'l'âne chargé de sel et l'âne chargé d'éponge'
   pourquoi ? cela trace la differannce même entre moi et les 21 autres eleves de ma classe (j'en exclus 2)

7) je modifirai ta source...

A tout de suite (si je fini le prog a temps)

Commentaire de xeolin le 06/06/2006 21:10:51

#########################
#! /usr/bin/env python
f=0.75 # facteur d'échelle lié à la résoloution de l'écran du PC : on peut l'augmenter ou le diminuer

#########################################################
#Amilioration par xeolin :                              #
#Ajout de menu_bouton au clic droit de la sourit        #
#Ajout d'une fonction who create it ?                   #
#pour miopes... et monosouris (y fo penser au autre)    #
#modifier en 36min29s                                   #
#########################################################

# -*- coding: Latin-1 -*-
# Python version 2.4.2
# Tk version 8.4
# IDLE version 1.1.2
  
# <<< DROITE et CERCLE d' EULER >>>
#   version 7
#  Dans cette version on a simplifié l'écriture du code en faisant systématiquement appel à la fonction "barycentre" pour définir les points remarquables du triangle.

#  PRESENTATION

# On considère le triangle quelconque ABC avec les points remarquables suivants :
#        G : centre de gravité
#        H : orthocentre
#        O : centre du cercle circonscrit
#        I   : centre du cercle inscrit
#        E : centre du  cercle d'Euler
#        Ge : point de Gergonne
#       N : point de Nagel

#  Le cercle d'Euler passe par les neufs points suivants :
#        les milieux des trois côtés du triangle :  mA, mB, mC
#        les pieds des hauteurs issues des trois sommets : hA, hB, hC
#        les milieux des segments joignant les trois sommets à l'orthocentre : aA, bB, cC)
#  La droite d'Euler passe par les quatre points O, E, G, H :qui forment une division harmonique : EO / EG  =  HO / OG  ( = 3)
#  Les trois points G, I , N  sont alignés, avec la relation : GN =2*GI (on a aussi HN = 2*OI)

from Tkinter import*
from math import *
from tkMessageBox import askokcancel
def pop_up(event=None) :
            frame = Frame(root, relief=RIDGE)
            entry = Entry(frame, width = '21')
            menu = Menu(entry, tearoff = 0)
            menu.add_command(label ='Triangle', underline =0,command = animation_triangle)
            menu.add_separator()
            menu.add_command(label ='Centre de gravité', underline =0,command = centre_de_gravite)
            menu.add_command(label ='Orthocentre', underline =0,command = ortho_centre)
            menu.add_command(label ='Cercle circonscrit', underline =0,command = cercle_circonscrit)
            menu.add_command(label ='Cercle et droite d\' Euler', underline =0,command = Euler)
            menu.add_command(label ='Cercle inscrit', underline =0,command = cercle_inscrit)
            menu.add_command(label ='Points de Gergonne et de Nagel', underline =0,command = Gergonne_Nagel)
            menu.add_command(label ='Figure de synthèse', underline =0,command = synthese)
            menu.add_separator()
            menu.add_command(label ='Tout', underline =0,command = rahxephon)
            menu.add_separator()
            menu.add_command(label ='Stop !', underline =0,command = stop)
            menu.add_command(label ='Quitter le "jeu"', underline =0,command = quitter)
            menu.add_separator()
            menu.add_command(label ='A propos', underline =0,command = hack_sing)
            ycoord = entry.winfo_pointery()
            xcoord = entry.winfo_pointerx()
            menu.tk_popup(xcoord, ycoord)
            
def rahxephon(): #/*pour toi ossi*/
    global fen1
    fen1=Tk()
    fen1.configure (bg='grey100')
    fen1.geometry("%sx%s+0+0"%(root.winfo_screenwidth(),root.winfo_screenheight()))
    fen1.overrideredirect(TRUE)
    Label(fen1,text="""Et bas non,\n il l'a pas fait \n;)""",bg='grey100',fg='grey0',font='Arial 150 bold').pack()
    Button(fen1,text='OK',command=fen1.destroy).pack()
    fen.mainloop()

def hack_sing(): #/*pour toi*/
    global fen
    fen=Tk()
    fen.configure (bg='grey0')
    fen.geometry("%sx%s+0+0"%(root.winfo_screenwidth(),root.winfo_screenheight()))
    fen.overrideredirect(TRUE)
    Label(fen,text="""By HCD""",bg='grey0',fg='grey100',font='Arial 250 bold').pack()
    Button(fen,text='OK',font='Arial 100 bold',command=fen.destroy).pack()
    fen.mainloop()
def vitesse(a):
    "récupération de la valeur (a) choisie sur l'échelle"
    global k
    k=int(a) #affectation à la variable <k>

def animer():
    "résolution du triangle et animation "

    global xA,yA,xB,yB,xC,yC # coordonnées des sommets A, B, C
    global dxA,dyA,dxB,dyB,dxC,dyC # coordonnées des vecteurs vitesses des sommets A, B, C
    global a,b,c,p # longueur des côtés BC,CA,AB et demi périmètre
    global A,B,C #angles aux sommets A,B,C
    global xmA,ymA,xmB,ymB,xmC,ymC # coordonnées des milieux des côtés BC, CA, AB
    global xG,yG # coordonnées du centre de gravité (G)
    global xhA,yhA,xhB,yhB,xhC,yhC # coordonnées des pieds des hauteurs issues des trois sommets A, B, C
    global xH,yH # coordonnées de l'orthocentre (H)
    global  xO,yO,RO # coordonnées du centre (O) et rayon (RO) du cercle circonscrit
    global xE,yE,RE # coordonnées du centre (E) et rayon (RE) du cercle d'Euler
    global xaA,yaA,xbB,ybB,xcC,ycC # coordonnées des milieux des segments joignant les trois sommets à l'orthocentre
    global xGergonne,yGergonne,xNagel,yNagel # coordonnées des points de Gergonne et de Nagel
    global xI,yI,RI # coordonnées du centre (I) et rayon (RI) du cercle inscrit
    global xiA,yiA,xiB,yiB,xiC,yiC # coordonnées des points de contact entre le cercle inscrit et les côtés du triangle
    global xeA,yeA,xeB,yeB,xeC,yeC # coordonnées des points de contact entre les cercles exinscrits et les côtés du triangle

    if flag==1 :
        can.delete(ALL)

        # animation
        xA,yA,xB,yB,xC,yC=xA+k*dxA,yA+k*dyA,xB+k*dxB,yB+k*dyB,xC+k*dxC,yC+k*dyC

        # résolution du triangle
        a,b,c=hypot(xC-xB,yC-yB),hypot(xA-xC,yA-yC),hypot(xA-xB,yA-yB)
        p=(a+b+c)/2 # demi périmètre (p)
        RI=sqrt((p-a)*(p-b)*(p-c)/p)#  rayon (RI) du cercle inscrit
        if p==a:A=0
        if p==b:B=0
        if p==c:C=0
        if p==a or p==b or p==c:RI,RO=0,infini
        else:
            A,B,C=2*atan(RI/(p-a)),2*atan(RI/(p-b)),2*atan(RI/(p-c))# angles aux sommets
            RO=a*b*c/RI/p/4#  rayon (RO) du cercle circonscrit
        RE=RO/2 # rayon (RE) du cercle d'Euler

        # coordonnées des milieux des côtés BC, CA, AB et du centre de gravité G ( isobarycentre : A[1], B[1], C[1] )
        barycentre(0,1,1);xmA,ymA=x,y
        barycentre(1,0,1);xmB,ymB=x,y
        barycentre(1,1,0);xmC,ymC=x,y
        barycentre(1,1,1);xG,yG=x,y

        # coordonnées des pieds des hauteurs issues des trois sommets A, B, C et de l'orthocentre H : barycentre de A[tan(A)], B[tan(B)], C[tan(C)]
        barycentre(0,tan(B),tan(C));xhA,yhA=x,y
        barycentre(tan(A),0,tan(C));xhB,yhB=x,y
        barycentre(tan(A),tan(B),0);xhC,yhC=x,y
        barycentre(tan(A),tan(B),tan(C));xH,yH=x,y

       # coordonnées du centre (O)  du cercle circonscrit  : barycentre de A[sin(2*A)], B[sin(2*A)], C[sin(2*A)]
        barycentre(sin(2*A),sin(2*B),sin(2*C));xO,yO=x,y

        # coordonnées du centre (E) du cercle d'Euler
        xE,yE=(xO+xH)/2,(yO+yH)/2

        # coordonnées des milieux des segments joignant les trois sommets à l'orthocentre
        xaA,yaA= (xH+xA)/2,(yH+yA)/2
        xbB,ybB= (xH+xB)/2,(yH+yB)/2
        xcC,ycC= (xH+xC)/2,(yH+yC)/2

        # coordonnées du point de Gergonne : barycentre de A[(p-b)*(p-c)], B[(p-c)*(p-a)], C[(p-a)*(p-b)]
        barycentre((p-b)*(p-c),(p-c)*(p-a),(p-a)*(p-b));xGergonne,yGergonne=x,y

        # coordonnées du point de Nagel : barycentre de A[p-a], B[p-b], C[p-c]
        barycentre(p-a,p-b,p-c);xNagel,yNagel=x,y

        # coordonnées du centre (I) du cercle inscrit : barycentre de A[a], B[b], C[c]
        barycentre(a,b,c);xI,yI=x,y

        # coordonnées des points de contact entre le cercle inscrit et les côtés du triangle
        if p==a:xiA,yiA=0,0
        else:barycentre(0,(p-c)*(p-a),(p-a)*(p-b));xiA,yiA=x,y
        if p==b:xiB,yiB=0,0
        else:barycentre((p-b)*(p-c),0,(p-a)*(p-b));xiB,yiB=x,y
        if p==c:xiC,yiC=0,0
        else:barycentre((p-b)*(p-c),(p-c)*(p-a),0);xiC,yiC=x,y

        # coordonnées des points de contact entre les cercles exinscrit et les côtés du triangle
        xeA,yeA=2*xmA+-xiA,2*ymA+-yiA
        xeB,yeB=2*xmB+-xiB,2*ymB+-yiB
        xeC,yeC=2*xmC+-xiC,2*ymC+-yiC

        # maintien du triangle dans le plan de jeu
        if xA<8 or xA>L-8:dxA,dxB,dxC=-dxA,-dxB,-dxC
        if xB<8 or xB>L-8:dxA,dxB,dxC=-dxA,-dxB,-dxC
        if xC<8 or xC>L-8:dxA,dxB,dxC=-dxA,-dxB,-dxC
        if yA<8 or yA>H-8:dyA,dyB,dyC=-dyA,dyB,dyC
        if yB<8 or yB>H-8:dyA,dyB,dyC=-dyA,-dyB,-dyC
        if yC<8 or yC>H-8:dyA,dyB,dyC=dyA,dyB,-dyC

        #lancement de l'animation des différentes figures
        if tt==1 and gg==0 and hh==0 and oo==0 and ee==0 and ii==0 and gn==0:animation_triangle()
        if tt==0 and gg==1 and hh==0 and oo==0 and ee==0 and ii==0 and gn==0:centre_de_gravite()
        if tt==0 and gg==0 and hh==1 and oo==0 and ee==0 and ii==0 and gn==0:ortho_centre()
        if tt==0 and gg==0 and hh==0 and oo==1 and ee==0 and ii==0 and gn==0:cercle_circonscrit()
        if tt==0 and gg==0 and hh==0 and oo==0 and ee==1 and ii==0 and gn==0:Euler()
        if tt==0 and gg==0 and hh==0 and oo==0 and ee==0 and ii==1 and gn==0:cercle_inscrit()
        if tt==0 and gg==0 and hh==0 and oo==0 and ee==0 and ii==0 and gn==1:Gergonne_Nagel()
        if tt==0 and gg==0 and hh==0 and oo==0 and ee==0 and ii==0 and gn==0 and ss==1:synthese()

def barycentre(k1,k2,k3):
        " cette fonction donne les coordonnées x et y du barycentre des points A, B, C auxquels sont affectés les coefficients k1, k2, k3"
        global x,y
        m,n,o=k1,k2,k3
        x,y=(m*xA+n*xB+o*xC)/(m+n+o),(m*yA+n*yB+o*yC)/(m+n+o)

def animation_triangle():
    " A,B,C sont les sommets du triangle"
    global flag,tt,gg,hh,oo,ee,ii,gn
    flag,tt,gg,hh,oo,ee,ii,gn=1,1,0,0,0,0,0,0
    texte="A,B,C     sommets"
    information.config(text=texte)
    can.create_text(150,500,text="Le triangle a pour sommets A, B, C",fill="white")
    triangle()
    root.after(100,animer)
    
def triangle():
    "dessin du triangle"
    cote_AB=can.create_line(xA,yA,xB,yB,fill="red",width=2)
    cote_BC=can. create_line(xB,yB,xC,yC,fill="red",width=2)
    cote_CA=can. create_line(xC,yC,xA,yA,fill="red",width=2)
    sommet_A=can.create_oval(xA-8,yA-8,xA+8,yA+8,fill="red",width=1)
    sommet_B=can.create_oval(xB-8,yB-8,xB+8,yB+8,fill="red",width=1)
    sommet_C=can.create_oval(xC-8,yC-8,xC+8,yC+8,fill="red",width=1)
    lettre_A=can.create_text(xA,yA,text="A",fill="white")
    lettre_B=can.create_text(xB,yB,text="B",fill="white")
    lettre_C=can.create_text(xC,yC,text="C",fill="white")

def centre_de_gravite():
    " mA,mB,mC sont les milieux des côtés du triangle et G le centre de gravité"
    global flag,tt,gg,hh,oo,ee,ii
    flag,tt,gg,hh,oo,ee,ii,gn=1,0,1,0,0,0,0,0
    texte="A,B,C     sommets\nG     Centre de gravité"
    information.config(text=texte)
    can.create_text(150,500,text="Le centre de gravité G est à l' intersection \ndes droites issues des sommets A, B, C et \npassant par les milieux des côtés BC, CA, AB",fill="white")
    ligne_mA_A=can.create_line(xA,yA,xmA,ymA,fill='#007030',width=2)
    ligne_mB_B=can.create_line(xB,yB,xmB,ymB,fill='#007030',width=2)
    ligne_mC_C=can.create_line(xC,yC,xmC,ymC,fill='#007030',width=2)
    triangle()
    mA=can.create_oval(xmA-3,ymA-3,xmA+3,ymA+3,fill="pink",width=1)
    mB=can.create_oval(xmB-3,ymB-3,xmB+3,ymB+3,fill="pink",width=1)
    mC=can.create_oval(xmC-3,ymC-3,xmC+3,ymC+3,fill="pink",width=1)
    marqueur_G=can.create_oval(xG-8,yG-8,xG+8,yG+8,fill="pink",width=1)
    lettre_G=can.create_text(xG,yG,text="G",fill="black")
    root.after(100,animer)

def ortho_centre():
    " hA,hB,hC sont les pieds des hauteurs issues des sommets du triangle et H l'orthocentre"
    global flag,tt,gg,hh,oo,ee,ii,gn
    flag,tt,gg,hh,oo,ee,ii,gn=1,0,0,1,0,0,0,0
    texte="A,B,C     sommets\nH    orthocentre"
    information.config(text=texte)
    can.create_text(150,500,text="L' orthocentre H est à l' intersection \ndes hauteurs issues des sommets A, B, C",fill="white")
    ligne_hA_A=can.create_line(xA,yA,xhA,yhA,fill='#007030',width=2)
    ligne_hB_B=can.create_line(xB,yB,xhB,yhB,fill='#007030',width=2)
    ligne_hC_C=can.create_line(xC,yC,xhC,yhC,fill='#007030',width=2)
    ligne_hA_H=can.create_line(xH,yH,xhA,yhA,fill='#007030',width=2)
    ligne_hB_H=can.create_line(xH,yH,xhB,yhB,fill='#007030',width=2)
    ligne_hC_H=can.create_line(xH,yH,xhC,yhC,fill='#007030',width=2)
    triangle()
    hA=can.create_oval(xhA-3,yhA-3,xhA+3,yhA+3,fill="light blue",width=1)
    hB=can.create_oval(xhB-3,yhB-3,xhB+3,yhB+3,fill="light blue",width=1)
    hC=can.create_oval(xhC-3,yhC-3,xhC+3,yhC+3,fill="light blue",width=1)
    marqueur_H=can.create_oval(xH-8,yH-8,xH+8,yH+8,fill="light blue",width=1)
    lettre_H=can.create_text(xH,yH,text="H",fill="black")
    root.after(100,animer)

def cercle_circonscrit():
    "centre (O) et rayon (RO) du cercle circonscrit "
    global flag,tt,gg,hh,oo,ee,ii,gn
    flag,tt,gg,hh,oo,ee,ii,gn=1,0,0,0,1,0,0,0
    texte='''A,B,C     sommets\nO     centre du cercle circonscrit'''
    information.config(text=texte)
    can.create_text(150,500,text="Le centre (O) du cercle circonscrit est à  \nl' intersection des médiatrices des\ncôtés BC, CA, AB",fill="white")
    cercle_circonscrit=can.create_oval(xO-RO,yO-RO,xO+RO,yO+RO,outline='gold',width=1)
    ligne_mA_CT=can.create_line(xO,yO,xmA,ymA,fill='#007030',width=2)
    ligne_mB_CT=can.create_line(xO,yO,xmB,ymB,fill='#007030',width=2)
    ligne_mC_CT=can.create_line(xO,yO,xmC,ymC,fill='#007030',width=2)
    triangle()
    mA=can.create_oval(xmA-3,ymA-3,xmA+3,ymA+3,fill="gold",width=1)
    mB=can.create_oval(xmB-3,ymB-3,xmB+3,ymB+3,fill="gold",width=1)
    mC=can.create_oval(xmC-3,ymC-3,xmC+3,ymC+3,fill="gold",width=1)
    centre_cercle_circonscrit=can.create_oval(xO-8,yO-8,xO+8,yO+8,fill="gold",width=1)
    lettre_O=can.create_text(xO,yO,text="O",fill="black")
    root.after(100,animer)

def Euler():
    "centre (E) et rayon (RE) du cercle d'Euler et droite d'Euler"
    global flag,tt,gg,hh,oo,ee,ii,gn
    flag,tt,gg,hh,oo,ee,ii,gn=1,0,0,0,0,1,0,0
    texte="A,B,C     sommets\nG     Centre de gravité\nH    orthocentre\nO     centre du cercle circonscrit\nE     centre du cercle d' Euler"
    information.config(text=texte)
    can.create_text(250,500,text= '''Le cercle d' Euler passe par les 9 points suivants :
        - les milieux des trois côtés du triangle
        - les pieds des hauteurs issues des trois sommets
        - les milieux des segments joignant les trois sommets à l'orthocentre

La droite d' Euler relie les 4 points suivants:   G, H, O, E
        avec la relation    EO / EG = HO / OG ( = 3)''',fill="white")
    triangle()
    droite_Euler_1=can.create_line(xO,yO,xG,yG,fill="white",width=1)
    droite_Euler_2=can.create_line(xH,yH,xG,yG,fill="white",width=1)
    centre_cercle_Euler=can.create_oval(xE-8,yE-8,xE+8,yE+8,fill="white",width=1)
    cercle_Euler=can.create_oval(xE-RE,yE-RE,xE+RE,yE+RE,outline="white",width=1)
    lettre_E=can.create_text(xE,yE,text="E",fill="black")
    centre_cercle_circonscrit=can.create_oval(xO-8,yO-8,xO+8,yO+8,fill="gold",width=1)
    lettre_O=can.create_text(xO,yO,text="O",fill="black")
    marqueur_G=can.create_oval(xG-8,yG-8,xG+8,yG+8,fill="pink",width=1)
    lettre_G=can.create_text(xG,yG,text="G",fill="black")
    marqueur_H=can.create_oval(xH-8,yH-8,xH+8,yH+8,fill="light blue",width=1)
    lettre_H=can.create_text(xH,yH,text="H",fill="black")
    aA=can.create_oval(xaA-3,yaA-3,xaA+3,yaA+3,fill="green",width=1)
    bB=can.create_oval(xbB-3,ybB-3,xbB+3,ybB+3,fill="green",width=1)
    cC=can.create_oval(xcC-3,ycC-3,xcC+3,ycC+3,fill="green",width=1)
    mA=can.create_oval(xmA-3,ymA-3,xmA+3,ymA+3,fill="pink",width=1)
    mB=can.create_oval(xmB-3,ymB-3,xmB+3,ymB+3,fill="pink",width=1)
    mC=can.create_oval(xmC-3,ymC-3,xmC+3,ymC+3,fill="pink",width=1)
    hA=can.create_oval(xhA-3,yhA-3,xhA+3,yhA+3,fill="light blue",width=1)
    hB=can.create_oval(xhB-3,yhB-3,xhB+3,yhB+3,fill="light blue",width=1)
    hC=can.create_oval(xhC-3,yhC-3,xhC+3,yhC+3,fill="light blue",width=1)
    root.after(100,animer)

def cercle_inscrit():
    "centre (I) et rayon (RI) du cercle inscrit et droite reliant les points de Gergonne et de Nagel"
    global flag,tt,gg,hh,oo,ee,ii,gn
    flag,tt,gg,hh,oo,ee,ii,gn=1,0,0,0,0,0,1,0
    texte="A,B,C     sommets\nG     Centre de gravité\nI     centre du Cercle inscrit\nN     point de Nagel\nGe     point de Gergonne"
    information.config(text=texte)
    can.create_text(150,500,text="Le centre (I) du cercle inscrit est à l' intersection\ndes bissectrices issues des sommets    A, B, C",fill="white")
    ligne_A_I=can.create_line(xI,yI,xA,yA,fill='#007030',width=2)
    ligne_B_I=can.create_line(xI,yI,xB,yB,fill='#007030',width=2)
    ligne_C_I=can.create_line(xI,yI,xC,yC,fill='#007030',width=2)
    ligne_iA_I=can.create_line(xI,yI,xiA,yiA,fill='#007030',width=1)
    ligne_iB_I=can.create_line(xI,yI,xiB,yiB,fill='#007030',width=1)
    ligne_iC_I=can.create_line(xI,yI,xiC,yiC,fill='#007030',width=1)
    cercle_inscrit=can.create_oval(xI-RI,yI-RI,xI+RI,yI+RI,outline='yellow',width=1)
    triangle()
    centre_cercle_inscrit=can.create_oval(xI-8,yI-8,xI+8,yI+8,fill="yellow",width=1)
    lettre_I=can.create_text(xI,yI,text="I",fill="black")
    marqueur_iA=can.create_oval(xiA-3,yiA-3,xiA+3,yiA+3,fill="yellow",width=1)
    marqueur_iB=can.create_oval(xiB-3,yiB-3,xiB+3,yiB+3,fill="yellow",width=1)
    marqueur_iC=can.create_oval(xiC-3,yiC-3,xiC+3,yiC+3,fill="yellow",width=1)
    root.after(100,animer)

def Gergonne_Nagel():
    "centre (I) et rayon (RI) du cercle inscrit et droite reliant les points de Gergonne et de Nagel"
    global flag,tt,gg,hh,oo,ee,ii,gn
    flag,tt,gg,hh,oo,ee,ii,gn=1,0,0,0,0,0,0,1
    texte="A,B,C     sommets\nN     point de Nagel\nGe     point de Gergonne"
    information.config(text=texte)
    can.create_text(250,500,text= '''Le point de Gergonne est à l'intersection des droites issues des sommets et passant
par les points de contact du cercle inscrit avec les côtés du triangle
    
Le point de Nagel est à l'intersection des droites issues des sommets et passant par
les points de contact des cercles exinscrits avec les côtés du triangle

La droite de Nagel relie les 3 points suivants : N, G, I
        avec  la relation    IG = GN / 2''',fill="white")
    cercle_inscrit=can.create_oval(xI-RI,yI-RI,xI+RI,yI+RI,outline='#007030',width=1)
    ligne_iA_A=can.create_line(xA,yA,xiA,yiA,fill='#007030',width=2)
    ligne_iB_B=can.create_line(xB,yB,xiB,yiB,fill='#007030',width=2)
    ligne_iC_C=can.create_line(xC,yC,xiC,yiC,fill='#007030',width=2)
    ligne_eA_A=can.create_line(xA,yA,xeA,yeA,fill='#007030',width=2)
    ligne_eB_B=can.create_line(xB,yB,xeB,yeB,fill='#007030',width=2)
    ligne_eC_C=can.create_line(xC,yC,xeC,yeC,fill='#007030',width=2)
    triangle()
    droite_Nagel=can.create_line(xI,yI,xNagel,yNagel,fill="white",width=1)
    centre_cercle_inscrit=can.create_oval(xI-8,yI-8,xI+8,yI+8,fill="yellow",width=1)
    lettre_I=can.create_text(xI,yI,text="I",fill="black")
    point_de_Gergonne=can.create_oval(xGergonne-8,yGergonne-8,xGergonne+8,yGergonne+8,fill="light blue",width=1)
    lettre_Ge=can.create_text(xGergonne,yGergonne,text="Ge",fill="black")
    point_de_Nagel=can.create_oval(xNagel-8,yNagel-8,xNagel+8,yNagel+8,fill="orange",width=1)
    lettre_N=can.create_text(xNagel,yNagel,text="N",fill="black")
    marqueur_G=can.create_oval(xG-8,yG-8,xG+8,yG+8,fill="pink",width=1)
    lettre_G=can.create_text(xG,yG,text="G",fill="black")
    marqueur_iA=can.create_oval(xiA-3,yiA-3,xiA+3,yiA+3,fill="light blue",width=1)
    marqueur_iB=can.create_oval(xiB-3,yiB-3,xiB+3,yiB+3,fill="light blue",width=1)
    marqueur_iC=can.create_oval(xiC-3,yiC-3,xiC+3,yiC+3,fill="light blue",width=1)
    marqueur_eA=can.create_oval(xeA-3,yeA-3,xeA+3,yeA+3,fill="orange",width=1)
    marqueur_eB=can.create_oval(xeB-3,yeB-3,xeB+3,yeB+3,fill="orange",width=1)
    marqueur_eC=can.create_oval(xeC-3,yeC-3,xeC+3,yeC+3,fill="orange",width=1)
    root.after(100,animer)

def synthese():
    " figure de synthèse"
    global flag,tt,gg,hh,oo,ee,ii,gn,ss
    flag,tt,gg,hh,oo,ee,ii,gn,ss=1,0,0,0,0,0,0,0,1
    texte="A,B,C     sommets\nG     Centre de gravité\nH    orthocentre\nO     centre du cercle circonscrit\nE     centre du cercle d' Euler\nI     centre du cercle inscrit\nN     point de Nagel\nGe     point de Gergonne"
    information.config(text=texte)
    can.create_text(150,500,text="Le centre (O) du cercle circonscrit est à  \nl' intersection des médiatrices des\ncôtés BC, CA, AB",fill="white")
    triangle()
    droite_Euler_1=can.create_line(xO,yO,xG,yG,fill="white",width=1)
    droite_Euler_2=can.create_line(xH,yH,xG,yG,fill="white",width=1)
    droite_Nagel=can.create_line(xI,yI,xNagel,yNagel,fill="white",width=1)
    marqueur_G=can.create_oval(xG-8,yG-8,xG+8,yG+8,fill="pink",width=1)
    lettre_G=can.create_text(xG,yG,text="G",fill="black")
    marqueur_H=can.create_oval(xH-8,yH-8,xH+8,yH+8,fill="light blue",width=1)
    lettre_H=can.create_text(xH,yH,text="H",fill="black")
    centre_cercle_circonscrit=can.create_oval(xO-8,yO-8,xO+8,yO+8,fill="gold",width=1)
    lettre_O=can.create_text(xO,yO,text="O",fill="black")
    centre_cercle_Euler=can.create_oval(xE-8,yE-8,xE+8,yE+8,fill="white",width=1)
    lettre_E=can.create_text(xE,yE,text="E",fill="black")
    centre_cercle_inscrit=can.create_oval(xI-8,yI-8,xI+8,yI+8,fill="yellow",width=1)
    lettre_I=can.create_text(xI,yI,text="I",fill="black")
    point_de_Gergonne=can.create_oval(xGergonne-8,yGergonne-8,xGergonne+8,yGergonne+8,fill="light blue",width=1)
    lettre_Ge=can.create_text(xGergonne,yGergonne,text="Ge",fill="black")
    point_de_Nagel=can.create_oval(xNagel-8,yNagel-8,xNagel+8,yNagel+8,fill="orange",width=1)
    lettre_N=can.create_text(xNagel,yNagel,text="N",fill="black")
    root.after(100,animer)

def stop():
    global flag
    flag=0
    dxA,dyA,dxB,dyB,dxC,dyC=0,0,0,0,0,0

def quitter():
    ans=askokcancel('',"Voulez-vous réellement quitter ?")
    if ans:root.quit()

######## Programme principal ############################################

root = Tk()
root.title("#>>>>>>>| DROITE et CERCLE d' EULER |<<<<<<<# By HCD")
root.bind('<Button-3>',pop_up)
root.bind('<Alt-F12>',pop_up)#ca sert a rien mais bon pour les non sourisistes (en estimant que ca existe encore)
# données initiales:
L,H=1200*f,800*f # largeur  et hauteur du plan
flag,tt,gg,hh,oo,ee,ii,gn,ss=0,0,0,0,0,0,0,0,0
infini=tan(pi/2)
xA,yA,xB,yB,xC,yC=100*f,100*f,50.,500*f,700*f,700*f
dxA,dyA,dxB,dyB,dxC,dyC=0.25*f,0.25*f,0.25*f,0.25*f,0.25*f,-0.25*f

can=Canvas(root,bg='dark green',height=H,width=L)
can.grid(row=1,column=0,rowspan=2)
can2=Canvas(root,bg='brown',highlightbackground='brown')
can2.grid(row=1,column=1,sticky=N)
information=Label(can2,text="",height=16,width=36,relief=GROOVE,bg="brown",fg="white",command=None)
information.pack(padx=5*f,pady=5*f,side=BOTTOM,anchor=SW)
Button(can2,text='Quitter le jeu !',height=1,width=35,relief=GROOVE,bg="white",command=quitter).pack(padx=5,pady=5,side=BOTTOM,anchor=SW)
Button(can2,text='Stop !',height=1,width=35,relief=GROOVE,bg="white",activebackground="dark green",activeforeground="white",command=stop).pack(padx=5*f,pady=5*f,side=BOTTOM,anchor=SW)
Button(can2,text='Figure de synthèse',height=1,width=35,relief=GROOVE,bg="white",activebackground="dark green",activeforeground="white",command=synthese).pack(padx=5*f,pady=5*f,side=BOTTOM,anchor=SW)
Button(can2,text='Points de Gergonne et de Nagel',height=1,width=35,relief=GROOVE,bg="white",activebackground="dark green",activeforeground="white",command=Gergonne_Nagel).pack(padx=5*f,pady=5*f,side=BOTTOM,anchor=SW)
Button(can2,text='Cercle inscrit',height=1,width=35,relief=GROOVE,bg="white",activebackground="dark green",activeforeground="white",command=cercle_inscrit).pack(padx=5*f,pady=5*f,side=BOTTOM,anchor=SW)
Button(can2,text='''Cercle et droite d' Euler''',height=1,width=35,relief=GROOVE,bg="white",activebackground="dark green",activeforeground="white",command=Euler).pack(padx=5*f,pady=5*f,side=BOTTOM,anchor=SW)
Button(can2,text='Cercle circonscrit',height=1,width=35,relief=GROOVE,bg="white",activebackground="dark green",activeforeground="white",command=cercle_circonscrit).pack(padx=5*f,pady=5*f,side=BOTTOM,anchor=SW)
Button(can2,text='Orthocentre',height=1,width=35,relief=GROOVE,bg="white",activebackground="dark green",activeforeground="white",command=ortho_centre).pack(padx=5*f,pady=5*f,side=BOTTOM,anchor=SW)
Button(can2,text='Centre de gravité',height=1,width=35,relief=GROOVE,bg="white",activebackground="dark green",activeforeground="white",command=centre_de_gravite).pack(padx=5*f,pady=5*f,side=BOTTOM,anchor=SW)
Button(can2,text='Triangle',height=1,width=35,relief=GROOVE,bg="white",activebackground="dark green",activeforeground="white",command=animation_triangle).pack(padx=5*f,pady=5*f,side=BOTTOM,anchor=SW)
kmin,kmax,kdef=0,10,1
vitesse_jeu=Scale(can2,length=215,orient=HORIZONTAL,sliderlength=15*f,label="Vitesse de l'animation    (entre 0 et 10)", from_ =kmin, to =kmax, troughcolor ='white',command =vitesse)
vitesse_jeu.pack(padx=5*f,pady=5*f,side=BOTTOM,anchor=SW)
vitesse_jeu.set(kdef)

root.mainloop()
root.destroy()  

Commentaire de xeolin le 06/06/2006 21:11:51

a+

Commentaire de HCD le 06/06/2006 23:02:56

Capeau XEOLIN pour ta réactivité !
Modifier un code en 36mn29s alors que tu n'en es pas l'auteur, il faut le faire !
J' apprécie l'humour ... Bien vu pour Ho C'est Difficile !!!
Pour ton info, j'ai fait l'Ecole Polytechnique en 1963. Ceci explique cela ...
Eh oui, j'ai bien 63 ans : et 50 ans nous séparent !!! SAUF quant on discute le coup en PYTHON, où là tu me donnes des leçons (en fait il n'y a pas d'âge pour cela) !!!
Je m'arrête, car il  est tard.
Je reprendrai demain pour continuer à améliorer le script selon tes idées (mettre un widget (Scale) pour changer la grandeur de la fenêtre + régler le problème de la vitesse qui augmente à chaque fois que l'on clique sur le même bouton).

Good night sir
A+
HCD

Commentaire de HCD le 08/06/2006 01:18:57

XEOLIN

Je viens de mettre la version 9 sur le site.
Celle-ci fait apparaître le menu pop-up que tu as ajouté, ainsi que la commande clavier <Alt-F12>.
Dans le menu, j'ai supprimé "Tout" et je l'ai remplacé par "Présentation du script", placé au début.
Par contre, je n'ai pas réussi à trouver l'astuce qui permet de redimensionner la fenêtre avec un widget Scale.
On peut laisser comme cela à mon avis, sauf si tu as une idée.
De même, j'ai essayé d'empêcher le problème de l'accélération du mouvement au fur et à mesure des clics sur les boutons, mais sans succès.
J'ai finalement introduit un freinage k=0.999*k
Je pense que l'on peut s'en contenter.
En conclusion, serais-tu d'accord pour que l'on en reste là ???
HCD
(Au fait, si tu as besoin d'un éclaircissement en math, n'hésites pas : je ferai le maximum)

Commentaire de xeolin le 09/06/2006 19:34:46

(as-tu remarquer le nom de mes variables, c'est une facon simple de se rappeler, ce sont les nom de mes manga preferés)
(si tu peut voir un .hack//sing regarde le les dessins sont sublibles, même si l'istoir est 50-50)

bon c simpas de ta part d'avoir laisser ma source (celle ci-dessus) tel quel (je ne sait pas si sa s'ecrit comme cela) en vers7

et puis non je ne suis pas d'accort pour en rester la... (tu purais faire une version compressée suprimer les commentaires etc)

donc pour la fonction pour la redimention utilise le script suivant :

!!! lancement du chrono !!!

Commentaire de xeolin le 09/06/2006 19:58:55

#########################
#! /usr/bin/env python
# -*- coding: Latin-1 -*-
# Python version 2.4.2
# Tk version 8.4
# IDLE version 1.1.2

# <<< DROITE et CERCLE d' EULER >>>

# facteur d'échelle lié à la résolution de l'écran du PC : on peut l'augmenter ou le diminuer

#########################################################
#   version 9

#Ce script a été vu, corrigé et amélioré par XEOLIN :
#  avec notamment :
#     - l' ajout d' un menu_bouton au clic droit de la souris      
#     -  l' ajout d'une fonction "who create it ?"                  
                                  
#########################################################
f=0.75
#  PRESENTATION

# On considère le triangle quelconque ABC avec les points remarquables suivants :
#        G : centre de gravité
#        H : orthocentre
#        O : centre du cercle circonscrit
#        I   : centre du cercle inscrit
#        E : centre du  cercle d'Euler
#        Ge : point de Gergonne
#       N : point de Nagel

#  Le cercle d'Euler passe par les neufs points suivants :
#        les milieux des trois côtés du triangle :  mA, mB, mC
#        les pieds des hauteurs issues des trois sommets : hA, hB, hC
#        les milieux des segments joignant les trois sommets à l'orthocentre : aA, bB, cC
#  La droite d'Euler passe par les quatre points O, E, G, H :qui forment une division harmonique : EO / EG  =  HO / OG  ( = 3)
#  Les trois points G, I , N  sont alignés, avec la relation : GN =2*GI (on a aussi HN = 2*OI)

from Tkinter import*
from math import *
from tkMessageBox import askokcancel

def pop_up(event=None) :
            frame = Frame(root, relief=RIDGE)
            entry = Entry(frame, width = '21')
            menu = Menu(entry, tearoff = 0)
            menu.add_command(label ='Présentation du script', underline =0,command = rahxephon)
            menu.add_separator()
            menu.add_command(label ='Triangle', underline =0,command = animation_triangle)
            menu.add_separator()
            menu.add_command(label ='Centre de gravité', underline =0,command = centre_de_gravite)
            menu.add_command(label ='Orthocentre', underline =0,command = ortho_centre)
            menu.add_command(label ='Cercle circonscrit', underline =0,command = cercle_circonscrit)
            menu.add_command(label ='Cercle et droite d\' Euler', underline =0,command = Euler)
            menu.add_command(label ='Cercle inscrit', underline =0,command = cercle_inscrit)
            menu.add_command(label ='Points de Gergonne et de Nagel', underline =0,command = Gergonne_Nagel)
            menu.add_command(label ='Figure de synthèse', underline =0,command = synthese)
            menu.add_separator()
            menu.add_command(label ='Stop !', underline =0,command = stop)
            menu.add_command(label ='Quitter le jeu !', underline =0,command = quitter)
            menu.add_separator()
            menu.add_command(label ='A propos', underline =0,command = hack_sing)
            ycoord = entry.winfo_pointery()
            xcoord = entry.winfo_pointerx()
            menu.tk_popup(xcoord, ycoord)
def naruto(event=None) :
    n=ss.get()
    facteur_echelle(int(n))
    L,H=120.*f,80.*f
    can.configure(height=H,width=L)
def rahxephon():
    global fen1
    fen1=Tk()
    fen1.configure (bg='grey100')
    fen1.geometry("%sx%s+0+0"%(root.winfo_screenwidth(),root.winfo_screenheight()))
    fen1.overrideredirect(TRUE)
    Label(fen1,text="""\n\n\n\n\n\n\n\n\n\n\n\n\n\n
Les propriétés du triangle ont intéressé de nombreux mathématiciens au cours  des siècles.
Tous se sont attachés à repérer des points remarquables dans le triangle et à mettre en lumière les relations qui pouvaient exister entre ces points.
Il en est ainsi de la droite d'EULER qui relie le centre de gravité, l'orthocentre, le centre du cercle circonscrit et le centre du cercle d'Euler.\n
On trouvera un excellent document sur ce sujet sur le site suivant :\n
http://www.reunion.iufm.fr/dep/mathematiques/abracadabri/geoplane/cocyclik/CInsEx3.htmhttp://www.reunion.iufm.fr/dep/mathematiques/abracadabri/geoplane/cocyclik/CInsEx3.htm)

On considère le triangle quelconque ABC avec les points remarquables suivants :
        G : centre de gravité\nH : orthocentre
        O : centre du cercle circonscrit
        I   : centre du cercle inscrit
        E : centre du  cercle d'Euler
        Ge : point de Gergonne
        N : point de Nagel

  Le cercle d'Euler passe par les neufs points suivants :
        les milieux des trois côtés du triangle :  mA, mB, mC
        les pieds des hauteurs issues des trois sommets : hA, hB, hC
        les milieux des segments joignant les trois sommets à l'orthocentre : aA, bB, cC
  La droite d'Euler passe par les quatre points O, E, G, H :qui forment une division harmonique : EO / EG  =  HO / OG  ( = 3)
  Les trois points G, I , N  sont alignés, avec la relation : GN =2*GI (on a aussi HN = 2*OI)
""",bg='grey100',fg='grey0',font='Arial 10 bold',justify=LEFT).pack()
    Button(fen1,text='OK',command=fen1.destroy).pack()
    fen1.mainloop()

def hack_sing():
    global fen
    fen=Tk()
    fen.configure (bg='grey0')
    fen.geometry("%sx%s+0+0"%(root.winfo_screenwidth(),root.winfo_screenheight()))
    fen.overrideredirect(TRUE)
    Label(fen,text="""\n\n\n\n\n\n\n\n\n\n\n\n\n\n
By HCD avec le concours de XEOLIN""",bg='grey0',fg='grey100',font='Arial 20 bold').pack()
    Button(fen,text='OK',font='Arial 10 bold',command=fen.destroy).pack()
    fen.mainloop()

def facteur_echelle(a):
    "récupération de la valeur (a) choisie sur l'échelle"
    global f
    f=int(a) #affectation à la variable <f>
  
def vitesse(a):
    "récupération de la valeur (a) choisie sur l'échelle"
    global k
    k=int(a) #affectation à la variable <k>

def animer():
    "résolution du triangle et animation "

    global xA,yA,xB,yB,xC,yC # coordonnées des sommets A, B, C
    global dxA,dyA,dxB,dyB,dxC,dyC # coordonnées des vecteurs vitesses des sommets A, B, C
    global a,b,c,p # longueur des côtés BC,CA,AB et demi périmètre
    global A,B,C #angles aux sommets A,B,C
    global xmA,ymA,xmB,ymB,xmC,ymC # coordonnées des milieux des côtés BC, CA, AB
    global xG,yG # coordonnées du centre de gravité (G)
    global xhA,yhA,xhB,yhB,xhC,yhC # coordonnées des pieds des hauteurs issues des trois sommets A, B, C
    global xH,yH # coordonnées de l'orthocentre (H)
    global  xO,yO,RO # coordonnées du centre (O) et rayon (RO) du cercle circonscrit
    global xE,yE,RE # coordonnées du centre (E) et rayon (RE) du cercle d'Euler
    global xaA,yaA,xbB,ybB,xcC,ycC # coordonnées des milieux des segments joignant les trois sommets à l'orthocentre
    global xGergonne,yGergonne,xNagel,yNagel # coordonnées des points de Gergonne et de Nagel
    global xI,yI,RI # coordonnées du centre (I) et rayon (RI) du cercle inscrit
    global xiA,yiA,xiB,yiB,xiC,yiC # coordonnées des points de contact entre le cercle inscrit et les côtés du triangle
    global xeA,yeA,xeB,yeB,xeC,yeC # coordonnées des points de contact entre les cercles exinscrits et les côtés du triangle
    global k

    k=0.9999*k
    if flag==1 :
        can.delete(ALL)
        # animation
        xA,yA,xB,yB,xC,yC=xA+k*dxA,yA+k*dyA,xB+k*dxB,yB+k*dyB,xC+k*dxC,yC+k*dyC

        # résolution du triangle
        a,b,c=hypot(xC-xB,yC-yB),hypot(xA-xC,yA-yC),hypot(xA-xB,yA-yB)
        p=(a+b+c)/2 # demi périmètre (p)
        RI=sqrt((p-a)*(p-b)*(p-c)/p)#  rayon (RI) du cercle inscrit
        if p==a:A=0
        if p==b:B=0
        if p==c:C=0
        if p==a or p==b or p==c:RI,RO=0,infini
        else:
            A,B,C=2*atan(RI/(p-a)),2*atan(RI/(p-b)),2*atan(RI/(p-c))# angles aux sommets
            RO=a*b*c/RI/p/4#  rayon (RO) du cercle circonscrit
        RE=RO/2 # rayon (RE) du cercle d'Euler

        # coordonnées des milieux des côtés BC, CA, AB et du centre de gravité G ( isobarycentre : A[1], B[1], C[1] )
        barycentre(0,1,1);xmA,ymA=x,y
        barycentre(1,0,1);xmB,ymB=x,y
        barycentre(1,1,0);xmC,ymC=x,y
        barycentre(1,1,1);xG,yG=x,y

        # coordonnées des pieds des hauteurs issues des trois sommets A, B, C et de l'orthocentre H : barycentre de A[tan(A)], B[tan(B)], C[tan(C)]
        barycentre(0,tan(B),tan(C));xhA,yhA=x,y
        barycentre(tan(A),0,tan(C));xhB,yhB=x,y
        barycentre(tan(A),tan(B),0);xhC,yhC=x,y
        barycentre(tan(A),tan(B),tan(C));xH,yH=x,y

       # coordonnées du centre (O)  du cercle circonscrit  : barycentre de A[sin(2*A)], B[sin(2*B)], C[sin(2*C)]
        barycentre(sin(2*A),sin(2*B),sin(2*C));xO,yO=x,y

        # coordonnées du centre (E) du cercle d'Euler
        xE,yE=(xO+xH)/2,(yO+yH)/2

        # coordonnées des milieux des segments joignant les trois sommets à l'orthocentre
        xaA,yaA= (xH+xA)/2,(yH+yA)/2
        xbB,ybB= (xH+xB)/2,(yH+yB)/2
        xcC,ycC= (xH+xC)/2,(yH+yC)/2

        # coordonnées du point de Gergonne : barycentre de A[(p-b)*(p-c)], B[(p-c)*(p-a)], C[(p-a)*(p-b)]
        barycentre((p-b)*(p-c),(p-c)*(p-a),(p-a)*(p-b));xGergonne,yGergonne=x,y

        # coordonnées du point de Nagel : barycentre de A[p-a], B[p-b], C[p-c]
        barycentre(p-a,p-b,p-c);xNagel,yNagel=x,y

        # coordonnées du centre (I) du cercle inscrit : barycentre de A[a], B[b], C[c]
        barycentre(a,b,c);xI,yI=x,y

        # coordonnées des points de contact entre le cercle inscrit et les côtés du triangle
        if p==a:xiA,yiA=0,0
        else:barycentre(0,(p-c)*(p-a),(p-a)*(p-b));xiA,yiA=x,y
        if p==b:xiB,yiB=0,0
        else:barycentre((p-b)*(p-c),0,(p-a)*(p-b));xiB,yiB=x,y
        if p==c:xiC,yiC=0,0
        else:barycentre((p-b)*(p-c),(p-c)*(p-a),0);xiC,yiC=x,y

        # coordonnées des points de contact entre les cercles exinscrit et les côtés du triangle
        xeA,yeA=2*xmA+-xiA,2*ymA+-yiA
        xeB,yeB=2*xmB+-xiB,2*ymB+-yiB
        xeC,yeC=2*xmC+-xiC,2*ymC+-yiC

        # maintien du triangle dans le plan de jeu
        if xA<8 or xA>L-8:dxA,dxB,dxC=-dxA,-dxB,-dxC
        if xB<8 or xB>L-8:dxA,dxB,dxC=-dxA,-dxB,-dxC
        if xC<8 or xC>L-8:dxA,dxB,dxC=-dxA,-dxB,-dxC
        if yA<8 or yA>H-8:dyA,dyB,dyC=-dyA,dyB,dyC
        if yB<8 or yB>H-8:dyA,dyB,dyC=-dyA,-dyB,-dyC
        if yC<8 or yC>H-8:dyA,dyB,dyC=dyA,dyB,-dyC

        #lancement de l'animation des différentes figures
        if tt==1 and gg==0 and hh==0 and oo==0 and ee==0 and ii==0 and gn==0:animation_triangle()
        if tt==0 and gg==1 and hh==0 and oo==0 and ee==0 and ii==0 and gn==0:centre_de_gravite()
        if tt==0 and gg==0 and hh==1 and oo==0 and ee==0 and ii==0 and gn==0:ortho_centre()
        if tt==0 and gg==0 and hh==0 and oo==1 and ee==0 and ii==0 and gn==0:cercle_circonscrit()
        if tt==0 and gg==0 and hh==0 and oo==0 and ee==1 and ii==0 and gn==0:Euler()
        if tt==0 and gg==0 and hh==0 and oo==0 and ee==0 and ii==1 and gn==0:cercle_inscrit()
        if tt==0 and gg==0 and hh==0 and oo==0 and ee==0 and ii==0 and gn==1:Gergonne_Nagel()
        if tt==0 and gg==0 and hh==0 and oo==0 and ee==0 and ii==0 and gn==0 and ss==1:synthese()

def barycentre(k1,k2,k3):
        " cette fonction donne les coordonnées x et y du barycentre des points A, B, C auxquels sont affectés les coefficients k1, k2, k3"
        global x,y
        m,n,o=k1,k2,k3
        x,y=(m*xA+n*xB+o*xC)/(m+n+o),(m*yA+n*yB+o*yC)/(m+n+o)

def animation_triangle():
    " A,B,C sont les sommets du triangle"
    global flag,tt,gg,hh,oo,ee,ii,gn
    flag,tt,gg,hh,oo,ee,ii,gn=1,1,0,0,0,0,0,0
    texte="A,B,C     sommets"
    information.config(text=texte)
    can.create_text(150,500,text="Le triangle a pour sommets A, B, C",fill="white")
    triangle()
    root.after(10,animer)
    
def triangle():
    "dessin du triangle"
    cote_AB=can.create_line(xA,yA,xB,yB,fill="red",width=2)
    cote_BC=can. create_line(xB,yB,xC,yC,fill="red",width=2)
    cote_CA=can. create_line(xC,yC,xA,yA,fill="red",width=2)
    sommet_A=can.create_oval(xA-8,yA-8,xA+8,yA+8,fill="red",width=1)
    sommet_B=can.create_oval(xB-8,yB-8,xB+8,yB+8,fill="red",width=1)
    sommet_C=can.create_oval(xC-8,yC-8,xC+8,yC+8,fill="red",width=1)
    lettre_A=can.create_text(xA,yA,text="A",fill="white")
    lettre_B=can.create_text(xB,yB,text="B",fill="white")
    lettre_C=can.create_text(xC,yC,text="C",fill="white")

def centre_de_gravite():
    " mA,mB,mC sont les milieux des côtés du triangle et G le centre de gravité"
    global flag,tt,gg,hh,oo,ee,ii
    flag,tt,gg,hh,oo,ee,ii,gn=1,0,1,0,0,0,0,0
    texte="A,B,C     sommets\nG     Centre de gravité"
    information.config(text=texte)
    can.create_text(150,500,text="Le centre de gravité G est à l' intersection \ndes droites issues des sommets A, B, C et \npassant par les milieux des côtés BC, CA, AB",fill="white")
    ligne_mA_A=can.create_line(xA,yA,xmA,ymA,fill='#007030',width=2)
    ligne_mB_B=can.create_line(xB,yB,xmB,ymB,fill='#007030',width=2)
    ligne_mC_C=can.create_line(xC,yC,xmC,ymC,fill='#007030',width=2)
    triangle()
    mA=can.create_oval(xmA-3,ymA-3,xmA+3,ymA+3,fill="pink",width=1)
    mB=can.create_oval(xmB-3,ymB-3,xmB+3,ymB+3,fill="pink",width=1)
    mC=can.create_oval(xmC-3,ymC-3,xmC+3,ymC+3,fill="pink",width=1)
    marqueur_G=can.create_oval(xG-8,yG-8,xG+8,yG+8,fill="pink",width=1)
    lettre_G=can.create_text(xG,yG,text="G",fill="black")
    root.after(10,animer)

def ortho_centre():
    " hA,hB,hC sont les pieds des hauteurs issues des sommets du triangle et H l'orthocentre"
    global flag,tt,gg,hh,oo,ee,ii,gn
    flag,tt,gg,hh,oo,ee,ii,gn=1,0,0,1,0,0,0,0
    texte="A,B,C     sommets\nH    orthocentre"
    information.config(text=texte)
    can.create_text(150,500,text="L' orthocentre H est à l' intersection \ndes hauteurs issues des sommets A, B, C",fill="white")
    ligne_hA_A=can.create_line(xA,yA,xhA,yhA,fill='#007030',width=2)
    ligne_hB_B=can.create_line(xB,yB,xhB,yhB,fill='#007030',width=2)
    ligne_hC_C=can.create_line(xC,yC,xhC,yhC,fill='#007030',width=2)
    ligne_hA_H=can.create_line(xH,yH,xhA,yhA,fill='#007030',width=2)
    ligne_hB_H=can.create_line(xH,yH,xhB,yhB,fill='#007030',width=2)
    ligne_hC_H=can.create_line(xH,yH,xhC,yhC,fill='#007030',width=2)
    triangle()
    hA=can.create_oval(xhA-3,yhA-3,xhA+3,yhA+3,fill="light blue",width=1)
    hB=can.create_oval(xhB-3,yhB-3,xhB+3,yhB+3,fill="light blue",width=1)
    hC=can.create_oval(xhC-3,yhC-3,xhC+3,yhC+3,fill="light blue",width=1)
    marqueur_H=can.create_oval(xH-8,yH-8,xH+8,yH+8,fill="light blue",width=1)
    lettre_H=can.create_text(xH,yH,text="H",fill="black")
    root.after(10,animer)

def cercle_circonscrit():
    "centre (O) et rayon (RO) du cercle circonscrit "
    global flag,tt,gg,hh,oo,ee,ii,gn
    flag,tt,gg,hh,oo,ee,ii,gn=1,0,0,0,1,0,0,0
    texte='''A,B,C     sommets\nO     centre du cercle circonscrit'''
    information.config(text=texte)
    can.create_text(150,500,text="Le centre (O) du cercle circonscrit est à  \nl' intersection des médiatrices des\ncôtés BC, CA, AB",fill="white")
    cercle_circonscrit=can.create_oval(xO-RO,yO-RO,xO+RO,yO+RO,outline='gold',width=1)
    ligne_mA_CT=can.create_line(xO,yO,xmA,ymA,fill='#007030',width=2)
    ligne_mB_CT=can.create_line(xO,yO,xmB,ymB,fill='#007030',width=2)
    ligne_mC_CT=can.create_line(xO,yO,xmC,ymC,fill='#007030',width=2)
    triangle()
    mA=can.create_oval(xmA-3,ymA-3,xmA+3,ymA+3,fill="gold",width=1)
    mB=can.create_oval(xmB-3,ymB-3,xmB+3,ymB+3,fill="gold",width=1)
    mC=can.create_oval(xmC-3,ymC-3,xmC+3,ymC+3,fill="gold",width=1)
    centre_cercle_circonscrit=can.create_oval(xO-8,yO-8,xO+8,yO+8,fill="gold",width=1)
    lettre_O=can.create_text(xO,yO,text="O",fill="black")
    root.after(10,animer)

def Euler():
    "centre (E) et rayon (RE) du cercle d'Euler et droite d'Euler"
    global flag,tt,gg,hh,oo,ee,ii,gn
    flag,tt,gg,hh,oo,ee,ii,gn=1,0,0,0,0,1,0,0
    texte="A,B,C     sommets\nG     Centre de gravité\nH    orthocentre\nO     centre du cercle circonscrit\nE     centre du cercle d' Euler"
    information.config(text=texte)
    can.create_text(250,500,text= '''Le cercle d' Euler passe par les 9 points suivants :
        - les milieux des trois côtés du triangle
        - les pieds des hauteurs issues des trois sommets
        - les milieux des segments joignant les trois sommets à l'orthocentre

La droite d' Euler relie les 4 points suivants:   G, H, O, E
        avec la relation    EO / EG = HO / OG ( = 3)''',fill="white")
    triangle()
    droite_Euler_1=can.create_line(xO,yO,xG,yG,fill="white",width=1)
    droite_Euler_2=can.create_line(xH,yH,xG,yG,fill="white",width=1)
    centre_cercle_Euler=can.create_oval(xE-8,yE-8,xE+8,yE+8,fill="white",width=1)
    cercle_Euler=can.create_oval(xE-RE,yE-RE,xE+RE,yE+RE,outline="white",width=1)
    lettre_E=can.create_text(xE,yE,text="E",fill="black")
    centre_cercle_circonscrit=can.create_oval(xO-8,yO-8,xO+8,yO+8,fill="gold",width=1)
    lettre_O=can.create_text(xO,yO,text="O",fill="black")
    marqueur_G=can.create_oval(xG-8,yG-8,xG+8,yG+8,fill="pink",width=1)
    lettre_G=can.create_text(xG,yG,text="G",fill="black")
    marqueur_H=can.create_oval(xH-8,yH-8,xH+8,yH+8,fill="light blue",width=1)
    lettre_H=can.create_text(xH,yH,text="H",fill="black")
    aA=can.create_oval(xaA-3,yaA-3,xaA+3,yaA+3,fill="green",width=1)
    bB=can.create_oval(xbB-3,ybB-3,xbB+3,ybB+3,fill="green",width=1)
    cC=can.create_oval(xcC-3,ycC-3,xcC+3,ycC+3,fill="green",width=1)
    mA=can.create_oval(xmA-3,ymA-3,xmA+3,ymA+3,fill="pink",width=1)
    mB=can.create_oval(xmB-3,ymB-3,xmB+3,ymB+3,fill="pink",width=1)
    mC=can.create_oval(xmC-3,ymC-3,xmC+3,ymC+3,fill="pink",width=1)
    hA=can.create_oval(xhA-3,yhA-3,xhA+3,yhA+3,fill="light blue",width=1)
    hB=can.create_oval(xhB-3,yhB-3,xhB+3,yhB+3,fill="light blue",width=1)
    hC=can.create_oval(xhC-3,yhC-3,xhC+3,yhC+3,fill="light blue",width=1)
    root.after(10,animer)

def cercle_inscrit():
    "centre (I) et rayon (RI) du cercle inscrit et droite reliant les points de Gergonne et de Nagel"
    global flag,tt,gg,hh,oo,ee,ii,gn
    flag,tt,gg,hh,oo,ee,ii,gn=1,0,0,0,0,0,1,0
    texte="A,B,C     sommets\nG     Centre de gravité\nI     centre du Cercle inscrit\nN     point de Nagel\nGe     point de Gergonne"
    information.config(text=texte)
    can.create_text(150,500,text="Le centre (I) du cercle inscrit est à l' intersection\ndes bissectrices issues des sommets    A, B, C",fill="white")
    ligne_A_I=can.create_line(xI,yI,xA,yA,fill='#007030',width=2)
    ligne_B_I=can.create_line(xI,yI,xB,yB,fill='#007030',width=2)
    ligne_C_I=can.create_line(xI,yI,xC,yC,fill='#007030',width=2)
    ligne_iA_I=can.create_line(xI,yI,xiA,yiA,fill='#007030',width=1)
    ligne_iB_I=can.create_line(xI,yI,xiB,yiB,fill='#007030',width=1)
    ligne_iC_I=can.create_line(xI,yI,xiC,yiC,fill='#007030',width=1)
    cercle_inscrit=can.create_oval(xI-RI,yI-RI,xI+RI,yI+RI,outline='yellow',width=1)
    triangle()
    centre_cercle_inscrit=can.create_oval(xI-8,yI-8,xI+8,yI+8,fill="yellow",width=1)
    lettre_I=can.create_text(xI,yI,text="I",fill="black")
    marqueur_iA=can.create_oval(xiA-3,yiA-3,xiA+3,yiA+3,fill="yellow",width=1)
    marqueur_iB=can.create_oval(xiB-3,yiB-3,xiB+3,yiB+3,fill="yellow",width=1)
    marqueur_iC=can.create_oval(xiC-3,yiC-3,xiC+3,yiC+3,fill="yellow",width=1)
    root.after(10,animer)

def Gergonne_Nagel():
    "centre (I) et rayon (RI) du cercle inscrit et droite reliant les points de Gergonne et de Nagel"
    global flag,tt,gg,hh,oo,ee,ii,gn
    flag,tt,gg,hh,oo,ee,ii,gn=1,0,0,0,0,0,0,1
    texte="A,B,C     sommets\nN     point de Nagel\nGe     point de Gergonne"
    information.config(text=texte)
    can.create_text(250,500,text= '''Le point de Gergonne est à l'intersection des droites issues des sommets et passant
par les points de contact du cercle inscrit avec les côtés du triangle
    
Le point de Nagel est à l'intersection des droites issues des sommets et passant par
les points de contact des cercles exinscrits avec les côtés du triangle

La droite de Nagel relie les 3 points suivants : N, G, I
        avec  la relation    IG = GN / 2''',fill="white")
    cercle_inscrit=can.create_oval(xI-RI,yI-RI,xI+RI,yI+RI,outline='#007030',width=1)
    ligne_iA_A=can.create_line(xA,yA,xiA,yiA,fill='#007030',width=2)
    ligne_iB_B=can.create_line(xB,yB,xiB,yiB,fill='#007030',width=2)
    ligne_iC_C=can.create_line(xC,yC,xiC,yiC,fill='#007030',width=2)
    ligne_eA_A=can.create_line(xA,yA,xeA,yeA,fill='#007030',width=2)
    ligne_eB_B=can.create_line(xB,yB,xeB,yeB,fill='#007030',width=2)
    ligne_eC_C=can.create_line(xC,yC,xeC,yeC,fill='#007030',width=2)
    triangle()
    droite_Nagel=can.create_line(xI,yI,xNagel,yNagel,fill="white",width=1)
    centre_cercle_inscrit=can.create_oval(xI-8,yI-8,xI+8,yI+8,fill="yellow",width=1)
    lettre_I=can.create_text(xI,yI,text="I",fill="black")
    point_de_Gergonne=can.create_oval(xGergonne-8,yGergonne-8,xGergonne+8,yGergonne+8,fill="light blue",width=1)
    lettre_Ge=can.create_text(xGergonne,yGergonne,text="Ge",fill="black")
    point_de_Nagel=can.create_oval(xNagel-8,yNagel-8,xNagel+8,yNagel+8,fill="orange",width=1)
    lettre_N=can.create_text(xNagel,yNagel,text="N",fill="black")
    marqueur_G=can.create_oval(xG-8,yG-8,xG+8,yG+8,fill="pink",width=1)
    lettre_G=can.create_text(xG,yG,text="G",fill="black")
    marqueur_iA=can.create_oval(xiA-3,yiA-3,xiA+3,yiA+3,fill="light blue",width=1)
    marqueur_iB=can.create_oval(xiB-3,yiB-3,xiB+3,yiB+3,fill="light blue",width=1)
    marqueur_iC=can.create_oval(xiC-3,yiC-3,xiC+3,yiC+3,fill="light blue",width=1)
    marqueur_eA=can.create_oval(xeA-3,yeA-3,xeA+3,yeA+3,fill="orange",width=1)
    marqueur_eB=can.create_oval(xeB-3,yeB-3,xeB+3,yeB+3,fill="orange",width=1)
    marqueur_eC=can.create_oval(xeC-3,yeC-3,xeC+3,yeC+3,fill="orange",width=1)
    root.after(10,animer)

def synthese():
    " figure de synthèse"
    global flag,tt,gg,hh,oo,ee,ii,gn,ss
    flag,tt,gg,hh,oo,ee,ii,gn,ss=1,0,0,0,0,0,0,0,1
    texte="A,B,C     sommets\nG     Centre de gravité\nH    orthocentre\nO     centre du cercle circonscrit\nE     centre du cercle d' Euler\nI     centre du cercle inscrit\nN     point de Nagel\nGe     point de Gergonne"
    information.config(text=texte)
    can.create_text(150,500,text="Le centre (O) du cercle circonscrit est à  \nl' intersection des médiatrices des\ncôtés BC, CA, AB",fill="white")
    triangle()
    droite_Euler_1=can.create_line(xO,yO,xG,yG,fill="white",width=1)
    droite_Euler_2=can.create_line(xH,yH,xG,yG,fill="white",width=1)
    droite_Nagel=can.create_line(xI,yI,xNagel,yNagel,fill="white",width=1)
    marqueur_G=can.create_oval(xG-8,yG-8,xG+8,yG+8,fill="pink",width=1)
    lettre_G=can.create_text(xG,yG,text="G",fill="black")
    marqueur_H=can.create_oval(xH-8,yH-8,xH+8,yH+8,fill="light blue",width=1)
    lettre_H=can.create_text(xH,yH,text="H",fill="black")
    centre_cercle_circonscrit=can.create_oval(xO-8,yO-8,xO+8,yO+8,fill="gold",width=1)
    lettre_O=can.create_text(xO,yO,text="O",fill="black")
    centre_cercle_Euler=can.create_oval(xE-8,yE-8,xE+8,yE+8,fill="white",width=1)
    lettre_E=can.create_text(xE,yE,text="E",fill="black")
    centre_cercle_inscrit=can.create_oval(xI-8,yI-8,xI+8,yI+8,fill="yellow",width=1)
    lettre_I=can.create_text(xI,yI,text="I",fill="black")
    point_de_Gergonne=can.create_oval(xGergonne-8,yGergonne-8,xGergonne+8,yGergonne+8,fill="light blue",width=1)
    lettre_Ge=can.create_text(xGergonne,yGergonne,text="Ge",fill="black")
    point_de_Nagel=can.create_oval(xNagel-8,yNagel-8,xNagel+8,yNagel+8,fill="orange",width=1)
    lettre_N=can.create_text(xNagel,yNagel,text="N",fill="black")
    root.after(10,animer)

def stop():
    global flag
    flag=0
    dxA,dyA,dxB,dyB,dxC,dyC=0,0,0,0,0,0

def quitter():
    ans=askokcancel('',"Voulez-vous réellement quitter ?")
    if ans:root.quit()

######## Programme principal ############################################

root = Tk()
root.title("#>>>>>>>| DROITE et CERCLE d' EULER |<<<<<<<# By HCD and XEOLIN")

root.bind('<Button-3>',pop_up)
root.bind('<Alt-F12>',pop_up)# commande au clavier du menu pop-up

# données initiales:
L,H=1200*f,800*f # largeur  et hauteur du plan
flag,tt,gg,hh,oo,ee,ii,gn,ss=0,0,0,0,0,0,0,0,0
infini=tan(pi/2)
xA,yA,xB,yB,xC,yC=100*f,100*f,50.,500*f,700*f,700*f
dxA,dyA,dxB,dyB,dxC,dyC=0.2*f,0.2*f,0.2*f,0.2*f,0.2*f,-0.2*f

can=Canvas(root,bg='dark green',height=H,width=L)
can.grid(row=1,column=1,rowspan=2)
can2=Canvas(root,bg='brown',highlightbackground='brown')
can2.grid(row=1,column=2,sticky=N)

information=Label(can2,text="",height=16,width=36,relief=GROOVE,bg="brown",fg="white",justify=LEFT,command=None)
information.pack(padx=4,pady=4,side=BOTTOM,anchor=SW)
Button(can2,text='Quitter le jeu !',height=1,width=35,relief=GROOVE,bg="white",command=quitter).pack(padx=5,pady=5,side=BOTTOM,anchor=SW)
Button(can2,text='Stop !',height=1,width=35,relief=GROOVE,bg="white",activebackground="dark green",activeforeground="white",command=stop).pack(padx=4,pady=4,side=BOTTOM,anchor=SW)
Button(can2,text='Figure de synthèse',height=1,width=35,relief=GROOVE,bg="white",activebackground="dark green",activeforeground="white",command=synthese).pack(padx=4,pady=4,side=BOTTOM,anchor=SW)
Button(can2,text='Points de Gergonne et de Nagel',height=1,width=35,relief=GROOVE,bg="white",activebackground="dark green",activeforeground="white",command=Gergonne_Nagel).pack(padx=4,pady=4,side=BOTTOM,anchor=SW)
Button(can2,text='Cercle inscrit',height=1,width=35,relief=GROOVE,bg="white",activebackground="dark green",activeforeground="white",command=cercle_inscrit).pack(padx=4,pady=4,side=BOTTOM,anchor=SW)
Button(can2,text='''Cercle et droite d' Euler''',height=1,width=35,relief=GROOVE,bg="white",activebackground="dark green",activeforeground="white",command=Euler).pack(padx=4,pady=4,side=BOTTOM,anchor=SW)
Button(can2,text='Cercle circonscrit',height=1,width=35,relief=GROOVE,bg="white",activebackground="dark green",activeforeground="white",command=cercle_circonscrit).pack(padx=4,pady=4,side=BOTTOM,anchor=SW)
Button(can2,text='Orthocentre',height=1,width=35,relief=GROOVE,bg="white",activebackground="dark green",activeforeground="white",command=ortho_centre).pack(padx=4,pady=4,side=BOTTOM,anchor=SW)
Button(can2,text='Centre de gravité',height=1,width=35,relief=GROOVE,bg="white",activebackground="dark green",activeforeground="white",command=centre_de_gravite).pack(padx=4,pady=4,side=BOTTOM,anchor=SW)
Button(can2,text='Triangle',height=1,width=35,relief=GROOVE,bg="white",activebackground="dark green",activeforeground="white",command=animation_triangle).pack(padx=4,pady=4,side=BOTTOM,anchor=SW)
ss=Scale(from_ =2,to=20,showvalue=10,length=50,command=naruto)
ss.grid(row=0,column=0)
kmin,kmax,kdef=0,10,1
vitesse_jeu=Scale(can2,length=215,orient=HORIZONTAL,sliderlength=11,label="Vitesse de l'animation    (entre 0 et 10)", from_ =kmin, to =kmax, troughcolor ='white',command =vitesse)
vitesse_jeu.pack(padx=1,pady=1,side=BOTTOM,anchor=SW)
vitesse_jeu.set(kdef)

root.mainloop()
root.destroy()  

Commentaire de xeolin le 09/06/2006 20:00:11

24 min 9 s

voila ct simple...

(voila une fonction nommée naruto :)  )

Commentaire de xeolin le 09/06/2006 20:48:46

regarde mes 2 sources

Commentaire de HCD le 10/06/2006 15:18:32

Sir XEOLINE !
La version 10 reprend la fonction "Naruto" que tu as insérée dans le script.
Je l'ai complétée pour que le triangle reste toujours à l'intérieur de la fenêtre.
Merci en tout cas, car je n'avais pas trouvé.
Le script est en effet très chargé en commentaires; mais je préfère le laisser comme cela pour le moment pour ceux qui chercheront à étudier le problème de math et aussi pour les débutants.
Je n'ai pas encore regardé tes deux sources : je veux le faire "à tête reposée", donc en début de semaine prochaine.
OK pour les mangas, je me doutais de quelque chose !
Quant au .hack//sing , je veux bien regarder, mais où ????
Au fait, peux-tu me donner un exemple pour faire une "capture d'écran" : je ne sais pas.
Dernier point, je termine actuellement une nouvelle source sur les 9 cercles de Napoléon.
Le problème est le suivant : on a un cercle dont on a perdu le centre; comment faire pour le retrouver avec un compas seulement ?
Napoléon, l'empereur, était aussi fort en géométrie. Il a trouvé la solution !
A suivre et A+
HCD

Commentaire de xeolin le 11/06/2006 17:20:26

il est vrais que hack//sing ne passe plus sur game one mais tu peut te référer a la colection des .hack//

il y a quelque jeux-video qui sont sortits...
mais pas exelents...

sinon pour faire une capture d'écrant : je sais pas.
et toi sait tu comment faire croire a windows que tu utilise la toucehe caps-locks

maintenant tu nous fait encore une source sur les géometrie...

soit plus creatif...

moi g créé un virus, 3 class, 2 utilitaires pour windows, 1programme de compression (pas genial), 3 otre de codage, 8 qui servent a rien, 1 qui fait planter python, 1 idem mé pour windows, et pour finir un qui eiteindre window dé qu'il se demare...

voil a c apeu pré tout et oui une IA pouris..

mé change de type de programme..

Commentaire de HCD le 11/06/2006 22:12:34

Tu as raison, il faut que je change de type de programme. Je commence à tourner en rond ...
Mais pas au point de créer des virus ou des trucs qui "éteignent" ou font "planter".
J'ai passé l'age !!!
J'ai quand-même mis sur le site une nouvelle source : "Le centre du cercle retrouvé par Napoléon", puisque j'ai terminé le code aujourd'hui.
Mais rien de bien nouveau en fait sur l'écriture elle-même.

Ta question  : " Sais-tu comment faire croire à Windows que tu utilises la touche < caps-lock > ?"
Réponse : franchement, je ne sais pas.

Je vais regarder tes 2 nouvelles sources la semaine prochaine.
HCD

 Ajouter un commentaire




Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 4,836 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales