Cercle et droite d' euler animés dans un triangle

Soyez le premier à donner votre avis sur cette source.

Vue 7 704 fois - Téléchargée 282 fois


Description

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 / Exemple :


#! /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()

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Messages postés
86
Date d'inscription
jeudi 18 août 2005
Statut
Membre
Dernière intervention
20 février 2007

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
Messages postés
336
Date d'inscription
samedi 26 novembre 2005
Statut
Membre
Dernière intervention
8 novembre 2011
1
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..
Messages postés
86
Date d'inscription
jeudi 18 août 2005
Statut
Membre
Dernière intervention
20 février 2007

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
Messages postés
336
Date d'inscription
samedi 26 novembre 2005
Statut
Membre
Dernière intervention
8 novembre 2011
1
regarde mes 2 sources
Messages postés
336
Date d'inscription
samedi 26 novembre 2005
Statut
Membre
Dernière intervention
8 novembre 2011
1
24 min 9 s

voila ct simple...

(voila une fonction nommée naruto :) )
Afficher les 19 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.