
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