Tout ce qu'il faut savoir sur les triangles ( ou presque... )

Programmation d'applications complexes
Avatar de l’utilisateur
plabouro472
Messages : 38
Inscription : sam. 23/juil./2022 10:17

Tout ce qu'il faut savoir sur les triangles ( ou presque... )

Message par plabouro472 »

Image

Bissectrices
Médiatrices
Médianes
Hauteurs
Cercle inscrit
Cercle circonscrit
Longueur des segments
Angles des segments
Type de triangle
Calcule les intersections de droites
Etc...

3 fichiers :
- "Principal.pb"
- "Triangles.pbf"
- "Module Triangle.pb"

Positionnement des points :
- Par saisie des valeurs dans le GadgetText
- Par déplacement à l'aide des flêches du pavé numérique
Flêche = +10
CTRL Flêche = +1

Rien de bien compliqué.


Le programme pricipale
"Principal.pb"

Code : Tout sélectionner

; PureBasic V6.12
; Principal.pb
; *****************
XIncludeFile "Triangles.pbf"
XIncludeFile "Module Triangle.pb"

; *****************
OpenWindow_0()


; *****************
#Pl_Rouge = $000080
#Pl_Vert = $008000
#Pl_Bleu = $800000
#Pl_Jaune = $00FFFF
#Pl_Cyan = $FFFF00
#Pl_Magenta = $FF00FF
#Pl_Blanc = $FFFFFF
#Pl_Gris = $808080

; Les raccourcis clavier pour le déplacement des points
Enumeration Clavier
 #Pl_Gauche_1
 #Pl_Droite_1
 #Pl_Haut_1
 #Pl_Bas_1
 #Pl_Gauche_10
 #Pl_Droite_10
 #Pl_Haut_10
 #Pl_Bas_10
EndEnumeration

; Les touches flêchées déplace de 10
AddKeyboardShortcut( Window_0 , #PB_Shortcut_Left , #Pl_Gauche_10 )
AddKeyboardShortcut( Window_0 , #PB_Shortcut_Right , #Pl_Droite_10 )
AddKeyboardShortcut( Window_0 , #PB_Shortcut_Up , #Pl_Haut_10 )
AddKeyboardShortcut( Window_0 , #PB_Shortcut_Down , #Pl_Bas_10 )
; Les touches flêchées avec CTRL déplace de 1
AddKeyboardShortcut( Window_0 , #PB_Shortcut_Control | #PB_Shortcut_Left , #Pl_Gauche_1 )
AddKeyboardShortcut( Window_0 , #PB_Shortcut_Control | #PB_Shortcut_Right , #Pl_Droite_1 )
AddKeyboardShortcut( Window_0 , #PB_Shortcut_Control | #PB_Shortcut_Up , #Pl_Haut_1 )
AddKeyboardShortcut( Window_0 , #PB_Shortcut_Control | #PB_Shortcut_Down , #Pl_Bas_1 )


; Variables
; Initialisation la grille
;Calcule le centre et le pas de la grille
Global .i ImageDeFond
Global .w CentreX , CentreY
Global .w NbPoints = 40
Global .w H = GadgetWidth ( Canvas_Dessin )
Global .w L = GadgetHeight ( Canvas_Dessin )
Global .w CentreX = L/2
Global .w CentreY = H/2
Global .w Pas = L / NbPoints
ImageDeFond = CreateImage ( #PB_Any , DesktopScaledX( L ) , DesktopScaledY( H ) , 24 , #Black )


; *****************
; Les procédures divers
Procedure MaJ_Gadgets ( )
 Triangle::SetPointA ( Val( GetGadgetText( String_X1 ) ) , Val( GetGadgetText( String_Y1 ) ) , #Pl_Rouge )
 Triangle::SetPointB ( Val( GetGadgetText( String_X2 ) ) , Val( GetGadgetText( String_Y2 ) ) , #Pl_Vert )
 Triangle::SetPointC ( Val( GetGadgetText( String_X3 ) ) , Val( GetGadgetText( String_Y3 ) ) , #Pl_Bleu )

 ; restitue les valeurs triées dans les StringGadget
 SetGadgetColor ( String_XA , #PB_Gadget_FrontColor , Triangle::GetColNo ( 0 ) )
 SetGadgetText ( String_XA , Str(Triangle::GetXA ( ) ) )
 SetGadgetColor ( String_YA , #PB_Gadget_FrontColor , Triangle::GetColNo ( 0 ) )
 SetGadgetText ( String_YA , Str(Triangle::GetYA ( ) ) )
 
 SetGadgetColor ( String_XB , #PB_Gadget_FrontColor , Triangle::GetColNo ( 1 ) )
 SetGadgetText ( String_XB , Str(Triangle::GetXB ( ) ) )
 SetGadgetColor ( String_YB , #PB_Gadget_FrontColor , Triangle::GetColNo ( 1 ) )
 SetGadgetText ( String_YB , Str(Triangle::GetYB ( ) ) )
 
 SetGadgetColor ( String_XC , #PB_Gadget_FrontColor , Triangle::GetColNo ( 2 ) )
 SetGadgetText ( String_XC , Str(Triangle::GetXC ( ) ) )
 SetGadgetColor ( String_YC , #PB_Gadget_FrontColor , Triangle::GetColNo ( 2 ) )
 SetGadgetText ( String_YC , Str(Triangle::GetYC ( ) ) )
 
EndProcedure
Procedure AfficheResultat ( )
 ; Affichage de valeurs calculées dans les GadgetText
 SetGadgetText ( String_LongueurA , StrF( Triangle::GetLongA() , 3 ) )
 SetGadgetText ( String_LongueurB , StrF( Triangle::GetLongB() , 3 ) )
 SetGadgetText ( String_LongueurC , StrF( Triangle::GetLongC() , 3 ) )
 
 SetGadgetText ( String_AngleA , StrF( Degree( Triangle::GetAnglA()) , 3 ) )
 SetGadgetText ( String_AngleB , StrF( Degree( Triangle::GetAnglB()) , 3 ) )
 SetGadgetText ( String_AngleC , StrF( Degree( Triangle::GetAnglC()) , 3 ) )
 
 ; Affiche le type de triangle
 A$ =""
 If Triangle::IsRectAngle () : A$ + "RectAngle "
 ElseIf Triangle::IsAcutAngle () : A$ + "AcutAngle "
 ElseIf Triangle::IsObtusAngle () : A$ + "ObtusAngle "
 EndIf
 If Triangle::IsEquilateral () : A$ + "Equilateral "
 ElseIf Triangle::IsIsocele () : A$ + "Isocele "
 ElseIf Triangle::IsScalene () : A$ + "Scalene "
 EndIf
 SetGadgetText ( String_TriangleType , A$ )

 
 ; A afficher dans une zone de texte
 Protected .i NoLigne = 0
 ClearGadgetItems( Editor_Resultat )
 AddGadgetItem( Editor_Resultat , NoLigne, "Longueur AB = " + StrF( Triangle::GetLongAB() , 3 ) ) : NoLigne + 1
 AddGadgetItem( Editor_Resultat , NoLigne, "Longueur BC = " + StrF( Triangle::GetLongBC() , 3 ) ) : NoLigne + 1
 AddGadgetItem( Editor_Resultat , NoLigne, "Longueur CA = " + StrF( Triangle::GetLongCA() , 3 ) ) : NoLigne + 1
 AddGadgetItem( Editor_Resultat , NoLigne, "" ) : NoLigne + 1
 
 AddGadgetItem( Editor_Resultat , NoLigne, "Angle AB = " + StrF( Degree( Triangle::GetAnglAB() ) , 3 ) + "°" ) : NoLigne + 1
 AddGadgetItem( Editor_Resultat , NoLigne, "Angle BC = " + StrF( Degree( Triangle::GetAnglBC() ) , 3 ) + "°" ) : NoLigne + 1
 AddGadgetItem( Editor_Resultat , NoLigne, "Angle CA = " + StrF( Degree( Triangle::GetAnglCA() ) , 3 ) + "°" ) : NoLigne + 1
 AddGadgetItem( Editor_Resultat , NoLigne, "" ) : NoLigne + 1
 
 AddGadgetItem( Editor_Resultat , NoLigne, "Angle BaC = " + StrF( Degree( Triangle::GetAnglBaC() ) , 3 ) + "°" ) : NoLigne + 1
 AddGadgetItem( Editor_Resultat , NoLigne, "Angle CbA = " + StrF( Degree( Triangle::GetAnglCbA() ) , 3 ) + "°" ) : NoLigne + 1
 AddGadgetItem( Editor_Resultat , NoLigne, "Angle AcB = " + StrF( Degree( Triangle::GetAnglAcB() ) , 3 ) + "°" ) : NoLigne + 1
 AddGadgetItem( Editor_Resultat , NoLigne, "" ) : NoLigne + 1
 
 AddGadgetItem( Editor_Resultat , NoLigne, "Milieu AB X = " + StrF( Triangle::GetxMilieuAB() , 3 ) ) : NoLigne + 1
 AddGadgetItem( Editor_Resultat , NoLigne, "Milieu AB Y = " + StrF( Triangle::GetyMilieuAB() , 3 ) ) : NoLigne + 1
 AddGadgetItem( Editor_Resultat , NoLigne, "" ) : NoLigne + 1
 
 AddGadgetItem( Editor_Resultat , NoLigne, "Milieu BC X = " + StrF( Triangle::GetxMilieuBC() , 3 ) ) : NoLigne + 1
 AddGadgetItem( Editor_Resultat , NoLigne, "Milieu BC Y = " + StrF( Triangle::GetyMilieuBC() , 3 ) ) : NoLigne + 1
 AddGadgetItem( Editor_Resultat , NoLigne, "" ) : NoLigne + 1
 
 AddGadgetItem( Editor_Resultat , NoLigne, "Milieu CA X = " + StrF( Triangle::GetxMilieuCA() , 3 ) ) : NoLigne + 1
 AddGadgetItem( Editor_Resultat , NoLigne, "Milieu CA Y = " + StrF( Triangle::GetyMilieuCA() , 3 ) ) : NoLigne + 1
 AddGadgetItem( Editor_Resultat , NoLigne, "" ) : NoLigne + 1
 
 AddGadgetItem( Editor_Resultat , NoLigne, "Hauteur A = " + StrF( Triangle::GetHauteurA() , 3 ) ) : NoLigne + 1
 AddGadgetItem( Editor_Resultat , NoLigne, "Hauteur B = " + StrF( Triangle::GetHauteurB() , 3 ) ) : NoLigne + 1
 AddGadgetItem( Editor_Resultat , NoLigne, "Hauteur C = " + StrF( Triangle::GetHauteurC() , 3 ) ) : NoLigne + 1
 AddGadgetItem( Editor_Resultat , NoLigne, "" ) : NoLigne + 1
 
 
 AddGadgetItem( Editor_Resultat , NoLigne, "Le centre des médiatrices = Centre du cercle circonscrit" ) : NoLigne + 1
 AddGadgetItem( Editor_Resultat , NoLigne, "Centre X = " + StrF( Triangle::GetxCentreCirconscrit() , 3 ) ) : NoLigne + 1
 AddGadgetItem( Editor_Resultat , NoLigne, "Centre Y = " + StrF( Triangle::GetyCentreCirconscrit() , 3 ) ) : NoLigne + 1
 AddGadgetItem( Editor_Resultat , NoLigne, "" ) : NoLigne + 1
 
 AddGadgetItem( Editor_Resultat , NoLigne, "Le centre des bissectrices = Centre du cercle inscrit" ) : NoLigne + 1
 AddGadgetItem( Editor_Resultat , NoLigne, "Centre X = " + StrF( Triangle::GetxCentreInscrit() , 3 ) ) : NoLigne + 1
 AddGadgetItem( Editor_Resultat , NoLigne, "Centre Y = " + StrF( Triangle::GetyCentreInscrit() , 3 ) ) : NoLigne + 1
 AddGadgetItem( Editor_Resultat , NoLigne, "" ) : NoLigne + 1
 
EndProcedure
Procedure RedessineTout ( )
 ; Redessine tout
 If StartDrawing( CanvasOutput( Canvas_Dessin ) )
 ; Copie l'image de fond sur le canvas ( effacement du dessin )
 SetOrigin ( 0 , 0 )
 DrawImage ( ImageID( ImageDeFond ) , 0 , 0 )
 
 SetOrigin ( CentreX , CentreY )
 DrawingMode ( #PB_2DDrawing_Outlined )
 
 ; Dessine les segments
 LineXY ( Triangle::GetXA() , -Triangle::GetYA() , Triangle::GetXB() , -Triangle::GetYB() , #Pl_Jaune )
 LineXY ( Triangle::GetXB() , -Triangle::GetYB() , Triangle::GetXC() , -Triangle::GetYC() , #Pl_Cyan )
 LineXY ( Triangle::GetXC() , -Triangle::GetYC() , Triangle::GetXA() , -Triangle::GetYA() , #Pl_Magenta )
 
 ; Dessine les points
 DrawingMode ( #PB_2DDrawing_Default ) 
 Circle ( Triangle::GetXA() , -Triangle::GetYA() , 3 , Triangle::GetColA() ) ; #Pl_Rouge 
 Circle ( Triangle::GetXB() , -Triangle::GetYB() , 3 , Triangle::GetColB() ) ; #Pl_Vert
 Circle ( Triangle::GetXC() , -Triangle::GetYC() , 3 , Triangle::GetColC() ) ; #Pl_Bleu
 
 ; Dessine les point milieux des segments
 Circle ( Triangle::GetxMilieuAB() , -Triangle::GetyMilieuAB() , 3 , #Pl_Jaune )
 Circle ( Triangle::GetxMilieuBC() , -Triangle::GetyMilieuBC() , 3 , #Pl_Cyan )
 Circle ( Triangle::GetxMilieuCA() , -Triangle::GetyMilieuCA() , 3 , #Pl_Magenta )
 
 DrawingMode ( #PB_2DDrawing_Outlined )
 ; dessine les médiatrices
 If GetGadgetState( Checkbox_Mediatrice ) = #PB_Checkbox_Checked
 LineXY ( Triangle::GetxMilieuAB() , -Triangle::GetyMilieuAB() , Triangle::GetxCentreCirconscrit() , -Triangle::GetyCentreCirconscrit() , #Pl_Gris )
 LineXY ( Triangle::GetxMilieuBC() , -Triangle::GetyMilieuBC() , Triangle::GetxCentreCirconscrit() , -Triangle::GetyCentreCirconscrit() , #Pl_Gris )
 LineXY ( Triangle::GetxMilieuCA() , -Triangle::GetyMilieuCA() , Triangle::GetxCentreCirconscrit() , -Triangle::GetyCentreCirconscrit() , #Pl_Gris )
 EndIf 
 
 ; Dessine les médianes
 If GetGadgetState( Checkbox_Mediane ) = #PB_Checkbox_Checked
 LineXY ( Triangle::GetxMilieuBC() , -Triangle::GetyMilieuBC() , Triangle::GetXA() , -Triangle::GetYA() , #Pl_Cyan )
 LineXY ( Triangle::GetxMilieuCA() , -Triangle::GetyMilieuCA() , Triangle::GetXB() , -Triangle::GetYB() , #Pl_Magenta )
 LineXY ( Triangle::GetxMilieuAB() , -Triangle::GetyMilieuAB() , Triangle::GetXC() , -Triangle::GetYC() , #Pl_Jaune )
 EndIf
 
 ; dessine les hauteurs
 If GetGadgetState( Checkbox_Hauteur ) = #PB_Checkbox_Checked
 LineXY ( Triangle::GetXbaseA() , -Triangle::GetYbaseA() , Triangle::GetXA() , -Triangle::GetYA() , Triangle::GetColA() )
 LineXY ( Triangle::GetXbaseB() , -Triangle::GetYbaseB() , Triangle::GetXB() , -Triangle::GetYB() , Triangle::GetColB() )
 LineXY ( Triangle::GetXbaseC() , -Triangle::GetYbaseC() , Triangle::GetXC() , -Triangle::GetYC() , Triangle::GetColC() )
 EndIf
 
 ; dessine le point d'intersection des médiatrices
 ;Circle ( Triangle::GetxInterAB() , -Triangle::GetyInterAB() , 6 , #Pl_Jaune )
 ;Circle ( Triangle::GetxInterBC() , -Triangle::GetyInterBC() , 4 , #Pl_Cyan )
 ;Circle ( Triangle::GetxInterCA() , -Triangle::GetyInterCA() , 2 , #Pl_Magenta )
 
 ; dessine les bissectrices
 If GetGadgetState( Checkbox_Bissectrice ) = #PB_Checkbox_Checked
 LineXY ( Triangle::GetXA() , -Triangle::GetYA() , Triangle::GetxCentreInscrit() , -Triangle::GetyCentreInscrit() , #Pl_Blanc )
 LineXY ( Triangle::GetXB() , -Triangle::GetYB() , Triangle::GetxCentreInscrit() , -Triangle::GetyCentreInscrit() , #Pl_Blanc )
 LineXY ( Triangle::GetXC() , -Triangle::GetYC() , Triangle::GetxCentreInscrit() , -Triangle::GetyCentreInscrit() , #Pl_Blanc )
 EndIf
 
 ; dessine le cercle Inscrit
 If GetGadgetState( Checkbox_Inscrit ) = #PB_Checkbox_Checked
 Circle ( Triangle::GetxCentreInscrit() , -Triangle::GetyCentreInscrit() , Triangle::GetRayonInscrit() , #Pl_Blanc )
 EndIf
 
 ; dessine le centre Circonscrit
 If GetGadgetState( Checkbox_Circonscrit ) = #PB_Checkbox_Checked
 Circle ( Triangle::GetxCentreCirconscrit() , -Triangle::GetyCentreCirconscrit() , Triangle::GetRayonCirconscrit() , #Pl_Gris )
 EndIf
 
 StopDrawing( )
 EndIf
 
EndProcedure

; *****************
; Les procédures d'événements
Procedure ButtonMove_Change (EventType)
 Select EventGadget( )
 Case Button_Move1
 SetGadgetState ( Button_Move2 , 0 )
 SetGadgetState ( Button_Move3 , 0 )
 ;CaseEnd
 
 Case Button_Move2
 SetGadgetState ( Button_Move1 , 0 )
 SetGadgetState ( Button_Move3 , 0 )
 ;CaseEnd
 
 Case Button_Move3
 SetGadgetState ( Button_Move1 , 0 )
 SetGadgetState ( Button_Move2 , 0 )
 ;CaseEnd
 EndSelect
 
EndProcedure
Procedure StringGadget_Change (EventType)
 If EventType = #PB_EventType_Change
 MaJ_Gadgets ( )
 AfficheResultat ( )
 RedessineTout ( )
 EndIf
EndProcedure
Procedure CheckBoxGadget_Change (EventType)
 RedessineTout ( )
EndProcedure



; *****************
; Initialisation

; Dessinne la grille sur le canvas
If StartDrawing ( CanvasOutput ( Canvas_Dessin ) )
 ; Defini l'origine et plaque le fond sur le canvas
 SetOrigin( 0 , 0 )
 DrawImage ( ImageID( ImageDeFond ) , 0 , 0 )
 ; Defini le mode de dessin
 DrawingMode ( #PB_2DDrawing_Default )
 FrontColor ( #Gray )
 ; Dessinne la grille sur le canvas
 For y = 0 To NbPoints
 For X = 0 To NbPoints
 Plot ( X * Pas , Y * Pas , #Gray )
 Next X
 Next Y
 ; Trace les axes
 Line ( 0 , CentreY , L , 1 )
 Line ( CentreX , 0 , 1 , H )
 Circle ( CentreX , CentreY , 3 )
 StopDrawing ( ) ; Fin du tracé
EndIf
; Copie le contenu du canvas dans l'image de fond
If StartDrawing ( ImageOutput ( ImageDeFond ) )
 DrawImage ( GetGadgetAttribute( Canvas_Dessin , #PB_Canvas_Image) , 0 , 0 )
 StopDrawing ( )
EndIf

MaJ_Gadgets ( )
AfficheResultat ( )
RedessineTout ( )


; *****************
; La boucle principale
Repeat
 Evenement = WaitWindowEvent()
 Select EventWindow()
 Case Window_0
 Window_0_Events(Evenement)
 Select Evenement
 Case #PB_Event_Menu
 Select EventMenu()
 Case #Pl_Gauche_1
 If GetGadgetState ( Button_Move1 ) : SetGadgetText ( String_X1 , Str( Val( GetGadgetText( String_X1 ) ) - 1 ) )
 ElseIf GetGadgetState ( Button_Move2 ) : SetGadgetText ( String_X2 , Str( Val( GetGadgetText( String_X2 ) ) - 1 ) )
 ElseIf GetGadgetState ( Button_Move3 ) : SetGadgetText ( String_X3 , Str( Val( GetGadgetText( String_X3 ) ) - 1 ) )
 EndIf
 ;CaseEnd
 Case #Pl_Droite_1
 If GetGadgetState ( Button_Move1 ) : SetGadgetText ( String_X1 , Str( Val( GetGadgetText( String_X1 ) ) + 1 ) )
 ElseIf GetGadgetState ( Button_Move2 ) : SetGadgetText ( String_X2 , Str( Val( GetGadgetText( String_X2 ) ) + 1 ) )
 ElseIf GetGadgetState ( Button_Move3 ) : SetGadgetText ( String_X3 , Str( Val( GetGadgetText( String_X3 ) ) + 1 ) )
 EndIf
 ;CaseEnd
 Case #Pl_Haut_1
 If GetGadgetState ( Button_Move1 ) : SetGadgetText ( String_Y1 , Str( Val( GetGadgetText( String_Y1 ) ) + 1 ) )
 ElseIf GetGadgetState ( Button_Move2 ) : SetGadgetText ( String_Y2 , Str( Val( GetGadgetText( String_Y2 ) ) + 1 ) )
 ElseIf GetGadgetState ( Button_Move3 ) : SetGadgetText ( String_Y3 , Str( Val( GetGadgetText( String_Y3 ) ) + 1 ) )
 EndIf
 ;CaseEnd
 Case #Pl_Bas_1
 If GetGadgetState ( Button_Move1 ) : SetGadgetText ( String_Y1 , Str( Val( GetGadgetText( String_Y1 ) ) - 1 ) )
 ElseIf GetGadgetState ( Button_Move2 ) : SetGadgetText ( String_Y2 , Str( Val( GetGadgetText( String_Y2 ) ) - 1 ) )
 ElseIf GetGadgetState ( Button_Move3 ) : SetGadgetText ( String_Y3 , Str( Val( GetGadgetText( String_Y3 ) ) - 1 ) )
 EndIf
 ;CaseEnd
 Case #Pl_Gauche_10
 If GetGadgetState ( Button_Move1 ) : SetGadgetText ( String_X1 , Str( Val( GetGadgetText( String_X1 ) ) - 10 ) )
 ElseIf GetGadgetState ( Button_Move2 ) : SetGadgetText ( String_X2 , Str( Val( GetGadgetText( String_X2 ) ) - 10 ) )
 ElseIf GetGadgetState ( Button_Move3 ) : SetGadgetText ( String_X3 , Str( Val( GetGadgetText( String_X3 ) ) - 10 ) )
 EndIf
 ;CaseEnd
 Case #Pl_Droite_10
 If GetGadgetState ( Button_Move1 ) : SetGadgetText ( String_X1 , Str( Val( GetGadgetText( String_X1 ) ) + 10 ) )
 ElseIf GetGadgetState ( Button_Move2 ) : SetGadgetText ( String_X2 , Str( Val( GetGadgetText( String_X2 ) ) + 10 ) )
 ElseIf GetGadgetState ( Button_Move3 ) : SetGadgetText ( String_X3 , Str( Val( GetGadgetText( String_X3 ) ) + 10 ) )
 EndIf
 ;CaseEnd
 Case #Pl_Haut_10
 If GetGadgetState ( Button_Move1 ) : SetGadgetText ( String_Y1 , Str( Val( GetGadgetText( String_Y1 ) ) + 10 ) )
 ElseIf GetGadgetState ( Button_Move2 ) : SetGadgetText ( String_Y2 , Str( Val( GetGadgetText( String_Y2 ) ) + 10 ) )
 ElseIf GetGadgetState ( Button_Move3 ) : SetGadgetText ( String_Y3 , Str( Val( GetGadgetText( String_Y3 ) ) + 10 ) )
 EndIf
 ;CaseEnd
 Case #Pl_Bas_10
 If GetGadgetState ( Button_Move1 ) : SetGadgetText ( String_Y1 , Str( Val( GetGadgetText( String_Y1 ) ) - 10 ) )
 ElseIf GetGadgetState ( Button_Move2 ) : SetGadgetText ( String_Y2 , Str( Val( GetGadgetText( String_Y2 ) ) - 10 ) )
 ElseIf GetGadgetState ( Button_Move3 ) : SetGadgetText ( String_Y3 , Str( Val( GetGadgetText( String_Y3 ) ) - 10 ) )
 EndIf
 ;CaseEnd
 EndSelect
 MaJ_Gadgets ( )
 AfficheResultat ( )
 RedessineTout ( )
 
 EndSelect
 ;CaseEnd
 
 EndSelect
 
Until Evenement = #PB_Event_CloseWindow ; Ferme toutes les fenêtres en quittant l'une d'elle



Le formulaire
"Triangles.pbf"

Code : Tout sélectionner

;
; This code is automatically generated by the Form Designer.
; Manual modification is possible to adjust existing commands, but anything else will be dropped when the code is compiled.
; Event procedures need to be put in another source file.
;

Global Window_0

Global Canvas_Dessin, Text_OA, String_XA, String_YA, Text_OB, String_XB, String_YB, Text_OC, String_XC, String_YC, Text_Longueur, String_LongueurA, String_AngleA, Text_Angle, String_LongueurB, String_AngleB, String_LongueurC, String_AngleC, Text_X, Text_Y, String_X1, String_Y1, Text_X1, Text_Y1, String_X2, String_Y2, Text_X2, Text_Y2, String_X3, String_Y3, Text_X3, Text_Y3, Editor_Resultat, Button_Move1, Button_Move2, Button_Move3, Frame_Afficher, Checkbox_Mediatrice, Checkbox_Hauteur, Checkbox_Inscrit, Checkbox_Bissectrice, Checkbox_Circonscrit, Checkbox_Mediane, String_TriangleType

Enumeration FormFont
 #Font_Window_0_0
EndEnumeration

LoadFont(#Font_Window_0_0,"Consolas", 10)

Declare StringGadget_Change(EventType)
Declare CheckBoxGadget_Change(EventType)
Declare ButtonMove_Change(EventType)

Procedure OpenWindow_0(x = 0, y = 0, width = 800, height = 600)
 Window_0 = OpenWindow(#PB_Any, x, y, width, height, "", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered)
 Canvas_Dessin = CanvasGadget(#PB_Any, 10, 90, 401, 401)
 Text_OA = TextGadget(#PB_Any, 430, 30, 30, 20, "OA", #PB_Text_Center)
 String_XA = StringGadget(#PB_Any, 470, 30, 70, 20, "0", #PB_String_ReadOnly)
 String_YA = StringGadget(#PB_Any, 550, 30, 70, 20, "0", #PB_String_ReadOnly)
 Text_OB = TextGadget(#PB_Any, 430, 60, 30, 20, "OB", #PB_Text_Center)
 String_XB = StringGadget(#PB_Any, 470, 60, 70, 20, "0", #PB_String_ReadOnly)
 String_YB = StringGadget(#PB_Any, 550, 60, 70, 20, "0", #PB_String_ReadOnly)
 Text_OC = TextGadget(#PB_Any, 430, 90, 30, 20, "OC", #PB_Text_Center)
 String_XC = StringGadget(#PB_Any, 470, 90, 70, 20, "0", #PB_String_ReadOnly)
 String_YC = StringGadget(#PB_Any, 550, 90, 70, 20, "0", #PB_String_ReadOnly)
 Text_Longueur = TextGadget(#PB_Any, 620, 10, 70, 20, "Longueur", #PB_Text_Center)
 String_LongueurA = StringGadget(#PB_Any, 630, 30, 70, 20, "0", #PB_String_Numeric | #PB_String_ReadOnly)
 String_AngleA = StringGadget(#PB_Any, 710, 30, 70, 20, "0", #PB_String_Numeric | #PB_String_ReadOnly)
 Text_Angle = TextGadget(#PB_Any, 710, 10, 70, 20, "Angle", #PB_Text_Center)
 String_LongueurB = StringGadget(#PB_Any, 630, 60, 70, 20, "0", #PB_String_Numeric | #PB_String_ReadOnly)
 String_AngleB = StringGadget(#PB_Any, 710, 60, 70, 20, "0", #PB_String_Numeric | #PB_String_ReadOnly)
 String_LongueurC = StringGadget(#PB_Any, 630, 90, 70, 20, "0", #PB_String_Numeric | #PB_String_ReadOnly)
 String_AngleC = StringGadget(#PB_Any, 710, 90, 70, 20, "0", #PB_String_Numeric | #PB_String_ReadOnly)
 Text_X = TextGadget(#PB_Any, 480, 10, 70, 20, "X", #PB_Text_Center)
 Text_Y = TextGadget(#PB_Any, 550, 10, 70, 20, "Y", #PB_Text_Center)
 String_X1 = StringGadget(#PB_Any, 40, 30, 40, 20, "-100")
 SetGadgetColor(String_X1, #PB_Gadget_FrontColor,RGB(128,0,0))
 String_Y1 = StringGadget(#PB_Any, 100, 30, 40, 20, "100")
 SetGadgetColor(String_Y1, #PB_Gadget_FrontColor,RGB(128,0,0))
 Text_X1 = TextGadget(#PB_Any, 40, 10, 40, 20, "X1", #PB_Text_Center)
 Text_Y1 = TextGadget(#PB_Any, 100, 10, 40, 20, "Y1", #PB_Text_Center)
 String_X2 = StringGadget(#PB_Any, 160, 30, 40, 20, "100")
 SetGadgetColor(String_X2, #PB_Gadget_FrontColor,RGB(0,128,0))
 String_Y2 = StringGadget(#PB_Any, 220, 30, 40, 20, "100")
 SetGadgetColor(String_Y2, #PB_Gadget_FrontColor,RGB(0,128,0))
 Text_X2 = TextGadget(#PB_Any, 160, 10, 40, 20, "X2")
 Text_Y2 = TextGadget(#PB_Any, 220, 10, 40, 20, "Y2", #PB_Text_Center)
 String_X3 = StringGadget(#PB_Any, 280, 30, 40, 20, "100")
 SetGadgetColor(String_X3, #PB_Gadget_FrontColor,RGB(0,0,128))
 String_Y3 = StringGadget(#PB_Any, 340, 30, 40, 20, "-100")
 SetGadgetColor(String_Y3, #PB_Gadget_FrontColor,RGB(0,0,128))
 Text_X3 = TextGadget(#PB_Any, 280, 10, 40, 20, "X3", #PB_Text_Center)
 Text_Y3 = TextGadget(#PB_Any, 340, 10, 40, 20, "Y3", #PB_Text_Center)
 Editor_Resultat = EditorGadget(#PB_Any, 420, 120, 370, 470, #PB_Editor_ReadOnly)
 SetGadgetFont(Editor_Resultat, FontID(#Font_Window_0_0))
 Button_Move1 = ButtonGadget(#PB_Any, 40, 60, 100, 20, "Bouger point 1", #PB_Button_Toggle)
 GadgetToolTip(Button_Move1, "Fêches = +10 : CTRL Fêches = +1")
 Button_Move2 = ButtonGadget(#PB_Any, 160, 60, 100, 20, "Bouger point 2", #PB_Button_Toggle)
 GadgetToolTip(Button_Move2, "Fêches = +10 : CTRL Fêches = +1")
 Button_Move3 = ButtonGadget(#PB_Any, 280, 60, 100, 20, "Bouger point 3", #PB_Button_Toggle)
 GadgetToolTip(Button_Move3, "Fêches = +10 : CTRL Fêches = +1")
 Frame_Afficher = FrameGadget(#PB_Any, 60, 500, 300, 60, "Afficher", #PB_Frame_Flat)
 Checkbox_Mediatrice = CheckBoxGadget(#PB_Any, 170, 530, 80, 20, "Médiatrice")
 Checkbox_Hauteur = CheckBoxGadget(#PB_Any, 70, 510, 80, 20, "Hauteur")
 Checkbox_Inscrit = CheckBoxGadget(#PB_Any, 270, 510, 80, 20, "Inscrit")
 Checkbox_Bissectrice = CheckBoxGadget(#PB_Any, 170, 510, 80, 20, "Bissectrice")
 Checkbox_Circonscrit = CheckBoxGadget(#PB_Any, 270, 530, 80, 20, "Circonscrit")
 Checkbox_Mediane = CheckBoxGadget(#PB_Any, 70, 530, 80, 20, "Mediane")
 String_TriangleType = StringGadget(#PB_Any, 60, 570, 300, 20, "Type", #PB_String_ReadOnly)
EndProcedure

Procedure Window_0_Events(event)
 Select event
 Case #PB_Event_CloseWindow
 ProcedureReturn #False

 Case #PB_Event_Menu
 Select EventMenu()
 EndSelect

 Case #PB_Event_Gadget
 Select EventGadget()
 Case String_X1
  StringGadget_Change(EventType())  
 Case String_Y1
  StringGadget_Change(EventType())  
 Case String_X2
  StringGadget_Change(EventType())  
 Case String_Y2
  StringGadget_Change(EventType())  
 Case String_X3
  StringGadget_Change(EventType())  
 Case String_Y3
  StringGadget_Change(EventType())  
 Case Button_Move1
  ButtonMove_Change(EventType())  
 Case Button_Move2
  ButtonMove_Change(EventType())  
 Case Button_Move3
  ButtonMove_Change(EventType())  
 Case Checkbox_Mediatrice
  CheckBoxGadget_Change(EventType())  
 Case Checkbox_Hauteur
  CheckBoxGadget_Change(EventType())  
 Case Checkbox_Inscrit
  CheckBoxGadget_Change(EventType())  
 Case Checkbox_Bissectrice
  CheckBoxGadget_Change(EventType())  
 Case Checkbox_Circonscrit
  CheckBoxGadget_Change(EventType())  
 Case Checkbox_Mediane
  CheckBoxGadget_Change(EventType())  
 EndSelect
 EndSelect
 ProcedureReturn #True
EndProcedure



Le module
"Module Triangle.pb"

Code : Tout sélectionner


DeclareModule Triangle
 ; ******** Constantes et variables Publiques ***************
 
 
 ; ******** Declaration des procedures Publiques ***************
 Declare SetPointA ( Dx.w , Dy.w , Col.i )
 Declare SetPointB ( Dx.w , Dy.w , Col.i )
 Declare SetPointC ( Dx.w , Dy.w , Col.i )
 
 Declare .i GetColA ( )
 Declare .i GetColB ( )
 Declare .i GetColC ( )
 
 Declare .i GetColNo ( N.a)

 Declare .f GetLongueur ( Dx.f , Dy.f )
 Declare .f GetAnglegRad ( Dx.f , Dy.f )
 Declare .f GetDx  ( Longueur.f , AnglegRad.f )
 Declare .f GetDy  ( Longueur.f , AnglegRad.f )
 
 Declare .f GetxIntersectionAB ( DxA1.f , DyA1.f , DxB1.f , DyB1.f , DxA2.f , DyA2.f , DxB2.f , DyB2.f )
 Declare .f GetyIntersectionAB ( DxA1.f , DyA1.f , DxB1.f , DyB1.f , DxA2.f , DyA2.f , DxB2.f , DyB2.f ) 
 
 Declare .w GetXA  ( )
 Declare .w GetYA  ( )
 
 Declare .w GetXB  ( )
 Declare .w GetYB  ( )
 
 Declare .w GetXC  ( )
 Declare .w GetYC  ( )
 
 Declare .f GetLongA ( )
 Declare .f GetLongB ( )
 Declare .f GetLongC ( )
 
 Declare .f GetAnglA ( )
 Declare .f GetAnglB ( )
 Declare .f GetAnglC ( )
 
 Declare .f GetLongAB ( )
 Declare .f GetLongBC ( )
 Declare .f GetLongCA ( )
 
 Declare .f GetAnglAB ( )
 Declare .f GetAnglBC ( )
 Declare .f GetAnglCA ( )
 Declare .f GetAnglBA ( )
 Declare .f GetAnglCB ( )
 Declare .f GetAnglAC ( )
 
 Declare .f GetHauteurA ( )
 Declare .f GetHauteurB ( )
 Declare .f GetHauteurC ( )
 
 Declare .f GetXbaseA ( )
 Declare .f GetYbaseA ( )
 
 Declare .f GetXbaseB ( )
 Declare .f GetYbaseB ( )
 
 Declare .f GetXbaseC ( )
 Declare .f GetYbaseC ( )
 
 Declare .f GetxMilieuAB ( )
 Declare .f GetyMilieuAB ( )
 
 Declare .f GetxMilieuBC ( )
 Declare .f GetyMilieuBC ( )
 
 Declare .f GetxMilieuCA ( )
 Declare .f GetyMilieuCA ( )
 
 Declare .f GetAnglBaC ( )
 Declare .f GetAnglCbA ( )
 Declare .f GetAnglAcB ( )
 
 Declare .f GetxInterMedianeAB ( )
 Declare .f GetyInterMedianeAB ( )
 
 Declare .f GetxInterMedianeBC ( )
 Declare .f GetyInterMedianeBC ( )
 
 Declare .f GetxInterMedianeCA ( )
 Declare .f GetyInterMedianeCA ( )
 
 Declare .f GetxCentreInscrit ( )
 Declare .f GetyCentreInscrit ( )
 Declare .f GetRayonInscrit ( )
 
 Declare .f GetxCentreCirconscrit ( )
 Declare .f GetyCentreCirconscrit ( )
 Declare .f GetRayonCirconscrit ( )
 
 Declare .a IsAcutAngle ( )
 Declare .a IsRectAngle ( )
 Declare .a IsObtusAngle ( )
 
 Declare .a IsScalene ( )
 Declare .a IsIsocele ( )
 Declare .a IsEquilateral ( )
 
 
EndDeclareModule


Module Triangle
 ; ******** Constantes et variables privées ***************
 #Pl_090 = #PI / 2
 #Pl_180 = #PI
 #Pl_360 = #PI * 2
 
 Structure Point_Triangle
 x .w
 y .w
 Long .f
 Angle .f
 Couleur .i
 AngleR .f
 No .a
 EndStructure
 Global Dim P.Point_Triangle( 2 )
 
 ; Variables temporaires
 Global .f X1tmp , X2tmp
 Global .f Y1tmp , Y2tmp
 Global .f Long1Tmp , Long2Tmp
 Global .f Angl1Tmp , Angl2Tmp
 
 Global .w XA0 , XB0 , XC0
 Global .w YA0 , YB0 , YC0
 Global .i ColA0 , ColB0 , ColC0
 Global .i ColA , ColB , ColC
 
 ; Coordonnees des points A ,B ,C dans l'ordre trigo
 Global .w XA , XB , XC
 Global .w YA , YB , YC
 Global .w XbaseA , XbaseB , XbaseC
 Global .w YbaseA , YbaseB , YbaseC
 
 ; Distance du point par rapport a l'origine
 Global .f LongA , LongB , LongC
 
 ; Angle des point par rapport a l'origine
 Global .f AnglA , AnglB , AnglC
 
 ; Hauteur des point par rapport a leur base
 Global .f HauteurA , HauteurB , HauteurC
 
 ; Distance entre 2 points
 Global .f LongAB , LongBC , LongCA
 
 ; Angle forme par 2 coordonnes de points
 Global .f AnglAB , AnglBC , AnglCA
 Global .f AnglBA , AnglCB , AnglAC
 
 ; Angle forme par 2 segments de droites
 Global .f AnglBaC , AnglCbA , AnglAcB
 Global .f DegBaC , DegCbA , DegAcB
 
 ; Milieu entre 2 coordonnees de points
 Global .f xMilieuAB , xMilieuBC , xMilieuCA
 Global .f yMilieuAB , yMilieuBC , yMilieuCA
 
 ; Intersection entre 2 Medianes
 Global .f xInterMedianeAB , xInterMedianeBC , xInterMedianeCA
 Global .f yInterMedianeAB , yInterMedianeBC , yInterMedianeCA
 
 ; Centre du cercle inscrit
 Global .f xCentreInscrit , yCentreInscrit , RayonInscrit
 
 ; Centre du cercle circonscrit
 Global .f xCentreCirconscrit , yCentreCirconscrit , RayonCirconscrit
 
 
 ; ******** Procedures Privées ***************
 Procedure .w Mini ( Dx.w , Dy.w )
 If Dx < Dy : ProcedureReturn Dx : EndIf
 ProcedureReturn Dy
 EndProcedure
 Procedure .w Maxi ( Dx.w , Dy.w )
 If Dx > Dy : ProcedureReturn Dx : EndIf
 ProcedureReturn Dy
 EndProcedure
 
 Procedure OrganiseData ( )
 ; Les angles sont donnés par rapport à l'origine
 ; Il faut réorganise les point dans l'ordre trigo par papport au point centrale du triangle pour le calcule des angles
 Protected .f xMini , yMini
 Protected .f xMaxi , yMaxi
 Protected .f xCentre , yCentre
 
 ; Récupération des données
 P( 0 )\x = XA0
 P( 0 )\y = YA0
 P( 0 )\Long = GetLongueur ( P( 0 )\x , P( 0 )\y )
 P( 0 )\Angle = GetAnglegRad ( P( 0 )\x , P( 0 )\y )
 P( 0 )\Couleur = ColA0
 P( 0 )\No = 0
 
 P( 1 )\x = XB0
 P( 1 )\y = YB0
 P( 1 )\Long = GetLongueur ( P( 1 )\x , P( 1 )\y )
 P( 1 )\Angle = GetAnglegRad ( P( 1 )\x , P( 1 )\y )
 P( 1 )\Couleur = ColB0
 P( 1 )\No = 1
 
 P( 2 )\x = XC0
 P( 2 )\y = YC0
 P( 2 )\Long = GetLongueur ( P( 2 )\x , P( 2 )\y )
 P( 2 )\Angle = GetAnglegRad ( P( 2 )\x , P( 2 )\y )
 P( 2 )\Couleur = ColC0
 P( 2 )\No = 2
 
 ; Fixe un point centrale au triangle
 xMini = Mini( P( 0 )\x , Mini( P( 1 )\x , P( 2 )\x ) )
 yMini = Mini( P( 0 )\y , Mini( P( 1 )\y , P( 2 )\y ) )
 xMaxi = Maxi( P( 0 )\x , Maxi( P( 1 )\x , P( 2 )\x ) )
 yMaxi = Maxi( P( 0 )\y , Maxi( P( 1 )\y , P( 2 )\y ) )
 xCentre = (xMini + xMaxi)/2
 yCentre = (yMini + yMaxi)/2
 ; Calcule l'angle des points par rapport point central
 P( 0 )\AngleR = GetAnglegRad( P( 0 )\x - xCentre , P( 0 )\y - yCentre )
 P( 1 )\AngleR = GetAnglegRad( P( 1 )\x - xCentre , P( 1 )\y - yCentre )
 P( 2 )\AngleR = GetAnglegRad( P( 2 )\x - xCentre , P( 2 )\y - yCentre )
 
 ; Trie les points par grandeur d'angle croissant
 SortStructuredArray( P() , #PB_Sort_Ascending , OffsetOf( Point_Triangle\AngleR ) , TypeOf( Point_Triangle\AngleR ) )
 
 ; restitue les valeurs triées dans les variables
 XA = P( 0 )\x : YA = P( 0 )\y : ColA = P( 0 )\Couleur
 XB = P( 1 )\x : YB = P( 1 )\y : ColB = P( 1 )\Couleur
 XC = P( 2 )\x : YC = P( 2 )\y : ColC = P( 2 )\Couleur
 ; Les coordonnées des points sont maitenant organisées dans le sens trigo
 
 EndProcedure
 Procedure CalculeValeurs ( )
 ; Calcule les valeurs
 ; Les coordonnées de points doivent être données dans le sens trigo
 ; On va les réorganiser
 OrganiseData ( ) 
 ; Maintenant, on peut faire les calcules d'angles sans problème
 
 ; Calcul de la distance du point par rapport a l'origine
 LongA = GetLongueur ( XA , YA )
 LongB = GetLongueur ( XB , YB )
 LongC = GetLongueur ( XC , YC )
 
 ; Calcul de l'angle du point par rapport a l'origine
 AnglA = GetAnglegRad ( XA , YA )
 AnglB = GetAnglegRad ( XB , YB )
 AnglC = GetAnglegRad ( XC , YC )
 
 ; Calcul de la distance entre 2 points
 LongAB = GetLongueur ( XB-XA , YB-YA )
 LongBC = GetLongueur ( XC-XB , YC-YB )
 LongCA = GetLongueur ( XA-XC , YA-YC )
 
 ; Calcul l'angle formé par 2 points
 AnglAB = GetAnglegRad ( XB-XA , YB-YA )
 AnglBA = GetAnglegRad ( XA-XB , YA-YB )
 AnglBC = GetAnglegRad ( XC-XB , YC-YB )
 AnglCB = GetAnglegRad ( XB-XC , YB-YC )
 AnglCA = GetAnglegRad ( XA-XC , YA-YC )
 AnglAC = GetAnglegRad ( XC-XA , YC-YA )
 
 ; Calcul l'angle formé par 2 segments de droites
 AnglBaC = Abs( ( AnglAC - AnglAB ) )  ; Centre a du point B vers C
 If AnglBaC > #Pl_180 : AnglBaC = Abs( AnglBaC - #Pl_360 ) : EndIf ; Correction pour les angles suppeieur à 180° (PI)
 ; Le cumule d'arrondi lors des calcules engendrent des erreurs de précisions, on arrondi donc au 4eme chiffre après la virgule
 DegBaC = Int( Round( Degree( AnglBaC ) * 10000 , #PB_Round_Nearest ) ) / 10000
 
 AnglCbA = Abs( ( AnglBA - AnglBC ) )  ; Centre b du point C vers A
 If AnglCbA > #Pl_180 : AnglCbA = Abs( AnglCbA - #Pl_360 ) : EndIf ; Correction pour les angles suppeieur à 180° (PI)
 ; Le cumule d'arrondi lors des calcules engendrent des erreurs de précisions, on arrondi donc au 4eme chiffre après la virgule
 DegCbA = Int( Round( Degree( AnglCbA ) * 10000 , #PB_Round_Nearest ) ) / 10000
 
 AnglAcB = Abs( ( AnglCB - AnglCA ) )  ; Centre c du point A vers B
 If AnglAcB > #Pl_180 : AnglAcB = Abs( AnglAcB - #Pl_360 ) : EndIf ; Correction pour les angles suppeieur à 180° (PI)
 ; Le cumule d'arrondi lors des calcules engendrent des erreurs de précisions, on arrondi donc au 4eme chiffre après la virgule
 DegAcB = Int( Round( Degree( AnglAcB ) * 10000 , #PB_Round_Nearest ) ) / 10000
 
 ; Calcul le milieu du segment AB
 xMilieuAB = ( XA + XB ) / 2
 yMilieuAB = ( YA + YB ) / 2
 ; Calcul le milieu du segment BC
 xMilieuBC = ( XB + XC ) / 2
 yMilieuBC = ( YB + YC ) / 2
 ; Calcul le milieu du segment CA
 xMilieuCA = ( XC + XA ) / 2
 yMilieuCA = ( YC + YA ) / 2
 
 ; *** Calcule le centre des Mediane *** 
 ; Calcule le point d'intersection de 2 droite à partir de leurs coordonnées
 ; Mediane du point A , Mediane du point B
 xInterMedianeAB = GetxIntersectionAB( XA , YA , xMilieuBC , yMilieuBC , XB , YB , xMilieuCA , yMilieuCA )
 yInterMedianeAB = GetyIntersectionAB( XA , YA , xMilieuBC , yMilieuBC , XB , YB , xMilieuCA , yMilieuCA )
 ; Mediane du point B , Mediane du point C
 xInterMedianeBC = GetxIntersectionAB( XB , YB , xMilieuCA , yMilieuCA , XC , YC , xMilieuAB , yMilieuAB )
 yInterMedianeBC = GetyIntersectionAB( XB , YB , xMilieuCA , yMilieuCA , XC , YC , xMilieuAB , yMilieuAB )
 ; Mediane du point C , Mediane du point A
 xInterMedianeCA = GetxIntersectionAB( XC , YC , xMilieuAB , yMilieuAB , XA , YA , xMilieuBC , yMilieuBC )
 yInterMedianeCA = GetyIntersectionAB( XC , YC , xMilieuAB , yMilieuAB , XA , YA , xMilieuBC , yMilieuBC )
 
 ; *** Centre du cercle inscrit *** 
 ; Bissectrice de l'angle au point A : On ajoute à l'angle de la droite AB le demi angle BC de centre a 
 X1tmp = XA + GetDx( LongAB , AnglAB + AnglBaC / 2 )
 Y1tmp = YA + GetDy( LongAB , AnglAB + AnglBaC / 2 )
 ; Bissectrice de l'angle au point B : On ajoute à l'angle de la droite BC le demi angle CA de centre b 
 X2tmp = XB + GetDx( LongBC , AnglBC + AnglCbA / 2 )
 Y2tmp = YB + GetDy( LongBC , AnglBC + AnglCbA / 2 )
 ; Le centre inscrit est le point d'intersection des 2 Bissectrices
 xCentreInscrit = GetxIntersectionAB( XA , YA , X1tmp , Y1tmp , XB , YB , X2tmp , Y2tmp )
 yCentreInscrit = GetyIntersectionAB( XA , YA , X1tmp , Y1tmp , XB , YB , X2tmp , Y2tmp )
 
 ; *** Rayon du cercle inscrit *** 
 ; bc sera la droite perpendiculaire a BC ayant pour origine le centre du cercle inscrit
 X1tmp = xCentreInscrit + GetDx( LongBC , AnglCB + #Pl_090 )
 Y1tmp = yCentreInscrit + GetDy( LongBC , AnglCB + #Pl_090 )
 ; Calcule l'intersection de la perpendiculaire bc avec la droite BC
 X2tmp = GetxIntersectionAB( xCentreInscrit , yCentreInscrit , X1tmp , Y1tmp , XB , YB , XC , YC )
 Y2tmp = GetyIntersectionAB( xCentreInscrit , yCentreInscrit , X1tmp , Y1tmp , XB , YB , XC , YC )
 ; Le rayon est la distance entre le centre inscrit et le point d'intersection de la perpendiculaire bc avec la droite BC
 RayonInscrit = GetLongueur ( X2tmp - xCentreInscrit , Y2tmp - yCentreInscrit )
 
 ; *** Centre du cercle circonscrit *** 
 ; Segment de droite perpendiculaire à la droite AB en son milieu
 X1tmp = xMilieuAB + GetDx( LongAB , AnglAB + #Pl_090 )
 Y1tmp = yMilieuAB + GetDy( LongAB , AnglAB + #Pl_090 )
 ; Segment de droite perpendiculaire à la droite BC en son milieu
 X2tmp = xMilieuBC + GetDx( LongBC , AnglBC + #Pl_090 )
 Y2tmp = yMilieuBC + GetDy( LongBC , AnglBC + #Pl_090 )
 ; Le centre circonscrit est le point d'intersection des 2 droites
 xCentreCirconscrit = GetxIntersectionAB( xMilieuAB , yMilieuAB , X1tmp , Y1tmp , xMilieuBC , yMilieuBC , X2tmp , Y2tmp )
 yCentreCirconscrit = GetyIntersectionAB( xMilieuAB , yMilieuAB , X1tmp , Y1tmp , xMilieuBC , yMilieuBC , X2tmp , Y2tmp )
 ; Le rayon est la distance entre le Centre Circonscrit le point A
 RayonCirconscrit = GetLongueur ( xCentreCirconscrit - XA , yCentreCirconscrit - YA )
 
 ; *** Calcule les hauteurs ***
 ; Hauteur du point A
 ; Pivote le triangle pour ammener la base BC à un angle de 0°
 ; On positionne le point de base 
 Long1Tmp = GetDx( LongAB , AnglBA - AnglBC )
 ; On récupère la hauteur
 HauteurA = GetDy( LongAB , AnglBA - AnglBC )
 ; On redresse le triangle pour récupèrer les coordonnées du point de base
 XbaseA = XB + GetDx( Long1Tmp , AnglBC )
 YbaseA = YB + GetDy( Long1Tmp , AnglBC )
 
 ; Hauteur du point B
 ; Pivote le triangle pour ammener la base CA à un angle de 0°
 ; On positionne le point de base 
 Long1Tmp = GetDx( LongBC , AnglCB - AnglCA )
 ; On récupère la hauteur
 HauteurB = GetDy( LongBC , AnglCB - AnglCA )
 ; On redresse le triangle pour récupèrer les coordonnées du point de base
 XbaseB = XC + GetDx( Long1Tmp , AnglCA )
 YbaseB = YC + GetDy( Long1Tmp , AnglCA )
 
 ; Hauteur du point C
 ; Pivote le triangle pour ammener la base AB à un angle de 0°
 ; On positionne le point de base 
 Long1Tmp = GetDx( LongCA , AnglAC - AnglAB )
 ; On récupère la hauteur
 HauteurC = GetDy( LongCA , AnglAC - AnglAB )
 ; On redresse le triangle pour récupèrer les coordonnées du point de base
 XbaseC = XA + GetDx( Long1Tmp , AnglAB )
 YbaseC = YA + GetDy( Long1Tmp , AnglAB )
 
 EndProcedure
 
 
 
 ; ******** Procedures Publiques ************
 Procedure SetPointA ( Dx.w , Dy.w , Col.i )
 XA0 = Dx
 YA0 = Dy
 ColA0 = Col
 CalculeValeurs ( )
 EndProcedure
 Procedure SetPointB ( Dx.w , Dy.w , Col.i )
 XB0 = Dx
 YB0 = Dy
 ColB0 = Col
 CalculeValeurs ( )
 EndProcedure
 Procedure SetPointC ( Dx.w , Dy.w , Col.i )
 XC0 = Dx
 YC0 = Dy
 ColC0 = Col
 CalculeValeurs ( )
 EndProcedure
 
 Procedure .i GetColA ( )
 ProcedureReturn ColA
 EndProcedure
 Procedure .i GetColB ( )
 ProcedureReturn ColB
 EndProcedure
 Procedure .i GetColC ( )
 ProcedureReturn ColC
 EndProcedure
 
 Procedure .i GetColNo ( N.a )
 ProcedureReturn P( N )\Couleur
 EndProcedure
 
 Procedure .f GetLongueur ( Dx.f , Dy.f )
 ProcedureReturn Sqr( Dx*Dx + Dy*Dy )
 EndProcedure
 Procedure .f GetAnglegRad ( Dx.f , Dy.f )
 Protected ValTmp .f = ATan2( Dx , Dy )
 If ValTmp < 0
 ValTmp + ( 2 * #PI )
 EndIf
 ProcedureReturn ValTmp
 EndProcedure
 Procedure .f GetDx  ( Longueur.f , AnglegRad.f )
 ProcedureReturn Longueur * Cos( AnglegRad )
 EndProcedure
 Procedure .f GetDy  ( Longueur.f , AnglegRad.f )
 ProcedureReturn Longueur * Sin( AnglegRad )
 EndProcedure
 
 Procedure .f GetxIntersectionAB ( DxA1.f , DyA1.f , DxB1.f , DyB1.f , DxA2.f , DyA2.f , DxB2.f , DyB2.f )
 Protected .f a1 , B1
 Protected .f a2 , B2
 Protected .f DeltaX
 ; Y = aX + B
 ; a = Coefficient de pente
 DeltaX = ( DxB1 - DxA1 )
 If DeltaX = 0 : DeltaX = 1e-7 : EndIf ; Valeur trés petie pour ne pas diviser par 0
 a1 = ( DyB1 - DyA1 ) / DeltaX ; DeltaY / DeltaX du point 1
 
 DeltaX = ( DxB2 - DxA2 )
 If DeltaX = 0 : DeltaX = 1e-7 : EndIf ; Valeur trés petie pour ne pas diviser par 0
 a2 = ( DyB2 - DyA2 ) / DeltaX ; DeltaY / DeltaX du point 2
 
 ; B = Decalage de la hauteur par rapport a l'origine
 B1 = DyA1 - a1 * DxA1 
 B2 = DyA2 - a2 * DxA2 
 ; Interssection : pour quelle valeur de X on a Y1 = Y2
 ; Interssection : a1X + B1 = a2X + B2
 ; Interssection : a1X - a2X = B2 - B1
 ; Interssection : X * (a1 - a2) = B2 - B1
 ; Interssection : X = (B2 - B1) / (a1 - a2)
 ; Interssection : Y = a1 * ( (B2 - B1) / (a1 - a2) ) + B1
 ProcedureReturn (B2 - B1) / (a1 - a2)
 EndProcedure
 Procedure .f GetyIntersectionAB ( DxA1.f , DyA1.f , DxB1.f , DyB1.f , DxA2.f , DyA2.f , DxB2.f , DyB2.f )
 Protected .f a1 , B1
 Protected .f a2 , B2
 Protected .f DeltaX
 ; Y = aX + B
 ; a = Coefficient de pente
 DeltaX = ( DxB1 - DxA1 )
 If DeltaX = 0 : DeltaX = 1e-7 : EndIf ; Valeur trés petie pour ne pas diviser par 0
 a1 = ( DyB1 - DyA1 ) / DeltaX ; DeltaY / DeltaX du point 1
 
 DeltaX = ( DxB2 - DxA2 )
 If DeltaX = 0 : DeltaX = 1e-7 : EndIf ; Valeur trés petie pour ne pas diviser par 0
 a2 = ( DyB2 - DyA2 ) / DeltaX ; DeltaY / DeltaX du point 2
 
 ; B = Decalage de la hauteur par rapport a l'origine
 B1 = DyA1 - a1 * DxA1 
 B2 = DyA2 - a2 * DxA2 
 ; Interssection : pour quelle valeur de X on a Y1 = Y2
 ; Interssection : a1X + B1 = a2X + B2
 ; Interssection : a1X - a2X = B2 - B1
 ; Interssection : X * (a1 - a2) = B2 - B1
 ; Interssection : X = (B2 - B1) / (a1 - a2)
 ; Interssection : Y = a1 * ( (B2 - B1) / (a1 - a2) ) + B1
 ProcedureReturn a1 * ( (B2 - B1) / (a1 - a2) ) + B1
 EndProcedure
 
 Procedure .w GetXA  ( )
 ProcedureReturn XA
 EndProcedure
 Procedure .w GetYA  ( )
 ProcedureReturn YA
 EndProcedure
 
 Procedure .w GetXB  ( )
 ProcedureReturn XB
 EndProcedure
 Procedure .w GetYB  ( )
 ProcedureReturn YB
 EndProcedure
 
 Procedure .w GetXC  ( )
 ProcedureReturn XC
 EndProcedure
 Procedure .w GetYC  ( )
 ProcedureReturn YC
 EndProcedure
 
 Procedure .f GetLongA ( )
 ProcedureReturn LongA
 EndProcedure
 Procedure .f GetLongB ( )
 ProcedureReturn LongB
 EndProcedure
 Procedure .f GetLongC ( )
 ProcedureReturn LongC
 EndProcedure
 
 Procedure .f GetAnglA ( )
 ProcedureReturn AnglA
 EndProcedure
 Procedure .f GetAnglB ( )
 ProcedureReturn AnglB
 EndProcedure
 Procedure .f GetAnglC ( )
 ProcedureReturn AnglC
 EndProcedure
 
 
 Procedure .f GetLongAB ( )
 ProcedureReturn LongAB
 EndProcedure
 Procedure .f GetLongBC ( )
 ProcedureReturn LongBC
 EndProcedure
 Procedure .f GetLongCA ( )
 ProcedureReturn LongCA
 EndProcedure
 
 Procedure .f GetAnglAB ( )
 ProcedureReturn AnglAB
 EndProcedure
 Procedure .f GetAnglBC ( )
 ProcedureReturn AnglBC
 EndProcedure
 Procedure .f GetAnglCA ( )
 ProcedureReturn AnglCA
 EndProcedure
 Procedure .f GetAnglBA ( )
 ProcedureReturn AnglBA
 EndProcedure
 Procedure .f GetAnglCB ( )
 ProcedureReturn AnglCB
 EndProcedure
 Procedure .f GetAnglAC ( )
 ProcedureReturn AnglAC
 EndProcedure
 
 Procedure .f GetHauteurA ( )
 ProcedureReturn HauteurA
 EndProcedure
 Procedure .f GetHauteurB ( )
 ProcedureReturn HauteurB
 EndProcedure
 Procedure .f GetHauteurC ( )
 ProcedureReturn HauteurC
 EndProcedure
 
 Procedure .f GetXbaseA ( )
 ProcedureReturn XbaseA
 EndProcedure
 Procedure .f GetYbaseA ( )
 ProcedureReturn YbaseA
 EndProcedure
 
 Procedure .f GetXbaseB ( )
 ProcedureReturn XbaseB
 EndProcedure
 Procedure .f GetYbaseB ( )
 ProcedureReturn YbaseB
 EndProcedure
 
 Procedure .f GetXbaseC ( )
 ProcedureReturn XbaseC
 EndProcedure
 Procedure .f GetYbaseC ( )
 ProcedureReturn YbaseC
 EndProcedure
 
 Procedure .f GetxMilieuAB ( )
 ProcedureReturn xMilieuAB
 EndProcedure
 Procedure .f GetyMilieuAB ( )
 ProcedureReturn yMilieuAB
 EndProcedure
 
 Procedure .f GetxMilieuBC ( )
 ProcedureReturn xMilieuBC
 EndProcedure
 Procedure .f GetyMilieuBC ( )
 ProcedureReturn yMilieuBC
 EndProcedure
 
 Procedure .f GetxMilieuCA ( )
 ProcedureReturn xMilieuCA
 EndProcedure
 Procedure .f GetyMilieuCA ( )
 ProcedureReturn yMilieuCA
 EndProcedure
 
 Procedure .f GetAnglBaC ( )
 ProcedureReturn AnglBaC
 EndProcedure
 Procedure .f GetAnglCbA ( )
 ProcedureReturn AnglCbA
 EndProcedure
 Procedure .f GetAnglAcB ( )
 ProcedureReturn AnglAcB
 EndProcedure
 
 Procedure .f GetxInterMedianeAB ( )
 ProcedureReturn xInterMedianeAB
 EndProcedure
 Procedure .f GetyInterMedianeAB ( )
 ProcedureReturn yInterMedianeAB
 EndProcedure
 
 Procedure .f GetxInterMedianeBC ( )
 ProcedureReturn xInterMedianeBC
 EndProcedure
 Procedure .f GetyInterMedianeBC ( )
 ProcedureReturn yInterMedianeBC
 EndProcedure
 
 Procedure .f GetxInterMedianeCA ( )
 ProcedureReturn xInterMedianeCA
 EndProcedure
 Procedure .f GetyInterMedianeCA ( )
 ProcedureReturn yInterMedianeCA
 EndProcedure
 
 ; Le centre inscrit est le point d'intersection des 2 Bissectrices
 Procedure .f GetxCentreInscrit ( )
 ProcedureReturn xCentreInscrit
 EndProcedure
 Procedure .f GetyCentreInscrit ( )
 ProcedureReturn yCentreInscrit
 EndProcedure
 Procedure .f GetRayonInscrit ( )
 ProcedureReturn RayonInscrit
 EndProcedure
 
 Procedure .f GetxCentreCirconscrit ( )
 ProcedureReturn xCentreCirconscrit
 EndProcedure
 Procedure .f GetyCentreCirconscrit ( )
 ProcedureReturn yCentreCirconscrit
 EndProcedure
 Procedure .f GetRayonCirconscrit ( )
 ProcedureReturn RayonCirconscrit
 EndProcedure
 
 Procedure .a IsAcutAngle ( )
 ; Possède 3 angles aigus
 ProcedureReturn Bool( (DegBaC<90) And (DegCbA<90) And (DegAcB<90) )
 EndProcedure
 Procedure .a IsRectAngle ( )
 ; Possède 1 angle droit et 2 aigus
 ProcedureReturn Bool( (DegBaC = 90) Or (DegCbA = 90) Or (DegAcB = 90) )
 EndProcedure
 Procedure .a IsObtusAngle ( )
 ; Possède 1 angle obtus et 2 aigus
 ProcedureReturn Bool( (DegBaC > 90) Or (DegCbA > 90) Or (DegAcB > 90) )
 EndProcedure
 
 Procedure .a IsScalene ( )
 ; 3 Cotés de longueurs différentes
 ProcedureReturn Bool( LongAB <> LongBC And LongBC <> LongCA And LongCA <> LongAB )
 EndProcedure
 Procedure .a IsIsocele ( )
 ; 2 Cotés de longueurs égales
 ProcedureReturn Bool( ( LongAB = LongBC And LongCA <> LongAB ) Or ( LongBC = LongCA And LongAB <> LongBC ) Or ( LongCA = LongAB And LongBC <> LongCA ) )
 EndProcedure
 Procedure .a IsEquilateral ( )
 ; 3 Cotés de longueurs égales
 ProcedureReturn Bool( LongAB = LongBC And LongBC = LongCA And LongCA = LongAB )
 EndProcedure
 
 ; ******* Initialisation *******
 ; Rien à initialiser ici
 
EndModule

Dernière modification par plabouro472 le dim. 23/févr./2025 10:02, modifié 1 fois.
Avatar de l’utilisateur
kernadec
Messages : 1606
Inscription : ven. 25/avr./2008 11:14

Re: Tout ce qu'il faut savoir sur les triangles ( ou presque... )

Message par kernadec »

bjr plabouro472
Belle application educative
Merci pour le partage :D
Cordialement
Avatar de l’utilisateur
SPH
Messages : 4937
Inscription : mer. 09/nov./2005 9:53

Re: Tout ce qu'il faut savoir sur les triangles ( ou presque... )

Message par SPH »

Merci Plabour pour cette démonstration de force sur les triangles. Et merci à toi pour faire vivre le forum FR. :wink:

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
Avatar de l’utilisateur
plabouro472
Messages : 38
Inscription : sam. 23/juil./2022 10:17

Re: Tout ce qu'il faut savoir sur les triangles ( ou presque... )

Message par plabouro472 »

SPH a écrit : mer. 16/oct./2024 10:20 Merci Plabour pour cette démonstration de force sur les triangles. Et merci à toi pour faire vivre le forum FR. :wink:
Merci à toi, il me semble normal de partager. C'est un forum.
Répondre