Une Horloge analogique

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
microdevweb
Messages : 1802
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Une Horloge analogique

Message par microdevweb »

Bonjour,

Je ne sais pas si je poste au bonne endroit, voici un bout de code que je me suis amuser à faire pour afficher l'heure système dans une horloge analogique. Le graphisme (entièrement en code) n'est vraiment pas terrible (surtout le crénage dans les aiguilles) mais le code peut peut'être en inspiré certains (la base formule de rotation est reprise d'un code de Dobro un grand merci à lui).
Image

Code : Tout sélectionner

Structure Aiguille
  x.l
  y.l
EndStructure
;- * Variables Globales *
Global gRayon_Horloge=50,gEpaisseur_Couronne=10,gCouleur_Horloge=$B3DEF5,gCouleur_Couronne=$696969,gCouleur_Aiguille=$000000
Global gPosX_Horloge=50,gPosY_Horloge=50,gCouleur_Chiffre=$000000,ID_FONT
Global gTaille_Canvas=(gRayon_Horloge*2)+((gRayon_Horloge*2)*25)/100
Global gEpaisseur_Aiguille=2,gBas_Aiguille_Heure=5,gMarge_Aiguille_Heure=8
Global gBas_Aiguille_Minute=5,gMarge_Aiguille_Minute=4,gEpaisseur_Aiguille_minute=2
Global gBas_Aiguille_Seconde=5,gMarge_Aiguille_seconde=2,gEpaisseur_Aiguille_Seconde=1
;-* Les listes
Global NewList Ai_Heure.Aiguille() ;Liste qui vas reprendre tous les points pour des aiguille de l'heure
Global NewList Ai_Minute.Aiguille() ;Liste qui vas reprendre tous les points pour des aiguille des minutes
Global NewList Ai_Seconde.Aiguille() ;Liste qui vas reprendre tous les points pour des aiguille des seconde
;-*Initialisation du programme *
If Not OpenWindow(0,0,0,800,800,"Horloge",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  MessageRequester("Erreur","Erreur à l'ouverture de la fenêtre principale...")
  End
EndIf
;Le canvas qui vas servir de surface de dessin à l'horloge
CanvasGadget(0,gPosX_Horloge,gPosY_Horloge,gTaille_Canvas,gTaille_Canvas)
;Chargement des font
ID_FONT=LoadFont(0,"Arial",16)
;-*Déclaration des procédures
Declare Dessine_Horloge()
Declare Dessine_Chiffres()
Declare Dessine_Aguille()
Declare Init_Heure()
Declare Init_Minute()
Declare Init_Seconde()
;-* Boucle principale *
Repeat
  Event=WindowEvent()
  StartDrawing(CanvasOutput(0))
  Box(0,0,GadgetWidth(0),GadgetHeight(0),$FFFFFF)
  Dessine_Horloge()
  Dessine_Chiffres()
  Init_Heure()
  Init_Minute()
  Init_Seconde()
  Dessine_Aguille()
  StopDrawing()
Until Event=#PB_Event_CloseWindow

;-* Liste des procédures
Procedure Dessine_Horloge()
  ;Calcul du centre du canvas
  Protected x,y
  x=GadgetWidth(0)/2
  y=GadgetHeight(0)/2
  ;Dessin de la couronne de l'horloge
  Circle(x,y,gRayon_Horloge+gEpaisseur_Couronne,gCouleur_Couronne)
  ;Dessin de l'intérieur de l'horloge
  Circle(x,y,gRayon_Horloge,gCouleur_Horloge)
EndProcedure

Procedure Dessine_Chiffres()
  Protected x,y,N,CHI$
  DrawingFont(ID_FONT)
  DrawingMode(#PB_2DDrawing_Transparent)
  x=GadgetWidth(0)/2
  y=GadgetHeight(0)/2-gRayon_Horloge
  DrawText(x-(TextWidth("12")/2),y,"12",gCouleur_Chiffre)
  y=gRayon_Horloge*2-(TextHeight("9")/2)
  DrawText(x-(TextWidth("9")/2),y,"9",gCouleur_Chiffre)
  x=gRayon_Horloge*2
  y=GadgetHeight(0)/2-(TextHeight("3")/2)
  DrawText(x-(TextWidth("3")/2),y,"3",gCouleur_Chiffre)
  x=gEpaisseur_Couronne
  DrawText(x+(TextWidth("6")/2),y,"6",gCouleur_Chiffre)
  DrawingMode(#PB_2DDrawing_Default)
EndProcedure

Procedure Dessine_Aguille()
  ForEach Ai_Heure()
    Plot(Ai_Heure()\x,Ai_Heure()\y,gCouleur_Aiguille)
    Next
  ForEach Ai_Minute()
    Plot(Ai_Minute()\x,Ai_Minute()\y,gCouleur_Aiguille)
  Next 
  ForEach Ai_Seconde()
    Plot(Ai_Seconde()\x,Ai_Seconde()\y,gCouleur_Aiguille)
  Next 
EndProcedure

Procedure Init_Heure()
  ClearList(Ai_Heure())
  x3=gTaille_Canvas/2
  y3=gTaille_Canvas/2
  Heure$=FormatDate("%hh",Date())
  Minute$=FormatDate("%ii",Date())
  ; Le 180° est à 12 heure les degré tourne dans le sens anti horaire d'ou le moins 30°
  ; Pour les minutes on decompte un 60ème de 30 degré
  degres=180-((Val(Heure$)*30)+((Val(Minute$)*30)/60))
  For y=(gTaille_Canvas/2)-gBas_Aiguille_Heure To gTaille_Canvas/2+(gRayon_Horloge-gMarge_Aiguille_Heure)
    For x=(gTaille_Canvas/2)-(gEpaisseur_Aiguille/2) To (gTaille_Canvas/2)+gEpaisseur_Aiguille
      XA=x3+(x-x3) * Cos (degres* #PI /180) +( Y-y3)* Sin (degres* #PI /180)
      YA=y3-(x-x3) * Sin (degres* #PI /180) + (Y-y3)* Cos (degres* #PI /180)
      AddElement(Ai_Heure())
      Ai_Heure()\x=XA
      Ai_Heure()\y=YA
    Next
  Next
EndProcedure

Procedure Init_Minute()
  ClearList(Ai_Minute())
  x3=gTaille_Canvas/2
  y3=gTaille_Canvas/2
  Minute$=FormatDate("%ii",Date())
  secondes$=FormatDate("%ss",Date())
  degres=180-(Val(Minute$)*6)
  For y=(gTaille_Canvas/2)-gBas_Aiguille_Minute To gTaille_Canvas/2+(gRayon_Horloge-gMarge_Aiguille_Minute)
    For x=(gTaille_Canvas/2)-(gEpaisseur_Aiguille_minute/2) To (gTaille_Canvas/2)+gEpaisseur_Aiguille_minute
      XA=x3+(x-x3) * Cos (degres* #PI /180) +( Y-y3)* Sin (degres* #PI /180)
      YA=y3-(x-x3) * Sin (degres* #PI /180) + (Y-y3)* Cos (degres* #PI /180)
      AddElement(Ai_Minute())
      Ai_Minute()\x=XA
      Ai_Minute()\y=YA
    Next
  Next
EndProcedure

Procedure Init_Seconde()
  ClearList(Ai_Seconde())
  x3=gTaille_Canvas/2
  y3=gTaille_Canvas/2
  secondes$=FormatDate("%ss",Date())
  degres=180-(Val(secondes$)*6)
  For y=(gTaille_Canvas/2)-gBas_Aiguille_Seconde To gTaille_Canvas/2+(gRayon_Horloge-gMarge_Aiguille_seconde)
    For x=(gTaille_Canvas/2)-(gEpaisseur_Aiguille_Seconde/2) To (gTaille_Canvas/2)+gEpaisseur_Aiguille_Seconde
      XA=x3+(x-x3) * Cos (degres* #PI /180) +( Y-y3)* Sin (degres* #PI /180)
      YA=y3-(x-x3) * Sin (degres* #PI /180) + (Y-y3)* Cos (degres* #PI /180)
      AddElement(Ai_Seconde())
      Ai_Seconde()\x=XA
      Ai_Seconde()\y=YA
    Next
  Next
EndProcedure
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Une Horloge analogique

Message par Backup »

.....
Dernière modification par Backup le lun. 18/août/2014 17:14, modifié 1 fois.
Avatar de l’utilisateur
kernadec
Messages : 1606
Inscription : ven. 25/avr./2008 11:14

Re: Une Horloge analogique

Message par kernadec »

bonjour
sur XP ligne 7

Code : Tout sélectionner

Global gPosX_Horloge=10..... 
l'horloge n'est pas centrée, il faudrait "Horloge=0"

Cordialement
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Une Horloge analogique

Message par Backup »

ben oui , il y a une difference entre XP et seven ...
j'ai d'ailleurs signalé ce probleme a propos d'un Horloge (aussi ;) )
Avatar de l’utilisateur
venom
Messages : 3138
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

Re: Une Horloge analogique

Message par venom »

Dobro a écrit :ben oui , il y a une difference entre XP et seven ...
Étrange ton code sous mon seven fait bien décaler l'horloge :lol: :wink:

ps: Sympa cette petite horloge. Bravo






@++
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Une Horloge analogique

Message par Backup »

ha.. bah la difference doit encore venir de ma carte graphique ... (GTX 570M)
Avatar de l’utilisateur
SPH
Messages : 4947
Inscription : mer. 09/nov./2005 9:53

Re: Une Horloge analogique

Message par SPH »

erreur ligne 22

!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
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Une Horloge analogique

Message par Ar-S »

SPH a écrit :erreur ligne 22
rassure moi, tu utilises une version de PB gérant les CanvasGadget, sinon cherche pas plus loin :D
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Une Horloge analogique

Message par Ar-S »

Petit ajout du test de l'OS pour automatiquement gérer ce problème de marge.

Code : Tout sélectionner

Structure Aiguille
  x.l
  y.l
EndStructure
;- * Variables Globales *
Global gRayon_Horloge=50,gEpaisseur_Couronne=10,gCouleur_Horloge=$B3DEF5,gCouleur_Couronne=$696969,gCouleur_Aiguille=$000000
Global gPosX_Horloge,gPosY_Horloge=1,gCouleur_Chiffre=$000000,ID_FONT
Global gTaille_Canvas=(gRayon_Horloge*2)+((gRayon_Horloge*2)*25)/100
Global gEpaisseur_Aiguille=2,gBas_Aiguille_Heure=5,gMarge_Aiguille_Heure=8
Global gBas_Aiguille_Minute=5,gMarge_Aiguille_Minute=4,gEpaisseur_Aiguille_minute=2
Global gBas_Aiguille_Seconde=5,gMarge_Aiguille_seconde=2,gEpaisseur_Aiguille_Seconde=1
;-* Les listes
Global NewList Ai_Heure.Aiguille() ;Liste qui vas reprendre tous les points pour des aiguille de l'heure
Global NewList Ai_Minute.Aiguille() ;Liste qui vas reprendre tous les points pour des aiguille des minutes
Global NewList Ai_Seconde.Aiguille() ;Liste qui vas reprendre tous les points pour des aiguille des seconde
;-*Initialisation du programme *
If Not OpenWindow(0,0,0,gTaille_Canvas,gTaille_Canvas,"Horloge",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  MessageRequester("Erreur","Erreur à l'ouverture de la fenêtre principale...")
  End
EndIf

;- Test OS ajout Ar-S //
If OSVersion()>#PB_OS_Windows_XP
  gPosX_Horloge = 0
Else
  gPosX_Horloge = 10
EndIf  

;Le canvas qui vas servir de surface de dessin à l'horloge
CanvasGadget(0,gPosX_Horloge,gPosY_Horloge,gTaille_Canvas,gTaille_Canvas)
;Chargement des font
ID_FONT=LoadFont(0,"Arial",16)
;-*Déclaration des procédures
Declare Dessine_Horloge()
Declare Dessine_Chiffres()
Declare Dessine_Aguille()
Declare Init_Heure()
Declare Init_Minute()
Declare Init_Seconde()
;-* Boucle principale *
Repeat
  event=WindowEvent()
  StartDrawing(CanvasOutput(0))
    Box(0,0,GadgetWidth(0),GadgetHeight(0),$FFFFFF)
    Dessine_Horloge()
    Dessine_Chiffres()
    Init_Heure()
    Init_Minute()
    Init_Seconde()
    Dessine_Aguille()
  StopDrawing()
Until event=#PB_Event_CloseWindow

;-* Liste des procédures
Procedure Dessine_Horloge()
  ;Calcul du centre du canvas
  Protected x,y
  x=GadgetWidth(0)/2
  y=GadgetHeight(0)/2
  ;Dessin de la couronne de l'horloge
  Circle(x,y,gRayon_Horloge+gEpaisseur_Couronne,gCouleur_Couronne)
  ;Dessin de l'intérieur de l'horloge
  Circle(x,y,gRayon_Horloge,gCouleur_Horloge)
EndProcedure

Procedure Dessine_Chiffres()
  Protected x,y,N,CHI$
  DrawingFont(ID_FONT)
  DrawingMode(#PB_2DDrawing_Transparent)
  x=GadgetWidth(0)/2
  y=GadgetHeight(0)/2-gRayon_Horloge
  DrawText(x-(TextWidth("12")/2),y,"12",gCouleur_Chiffre)
  y=gRayon_Horloge*2-(TextHeight("9")/2)
  DrawText(x-(TextWidth("9")/2),y,"9",gCouleur_Chiffre)
  x=gRayon_Horloge*2
  y=GadgetHeight(0)/2-(TextHeight("3")/2)
  DrawText(x-(TextWidth("3")/2),y,"3",gCouleur_Chiffre)
  x=gEpaisseur_Couronne
  DrawText(x+(TextWidth("6")/2),y,"6",gCouleur_Chiffre)
  DrawingMode(#PB_2DDrawing_Default)
EndProcedure

Procedure Dessine_Aguille()
  ForEach Ai_Heure()
    Plot(Ai_Heure()\x,Ai_Heure()\y,gCouleur_Aiguille)
  Next
  ForEach Ai_Minute()
    Plot(Ai_Minute()\x,Ai_Minute()\y,gCouleur_Aiguille)
  Next
  ForEach Ai_Seconde()
    Plot(Ai_Seconde()\x,Ai_Seconde()\y,gCouleur_Aiguille)
  Next
EndProcedure

Procedure Init_Heure()
  ClearList(Ai_Heure())
  x3=gTaille_Canvas/2
  y3=gTaille_Canvas/2
  Heure$=FormatDate("%hh",Date())
  Minute$=FormatDate("%ii",Date())
  ; Le 180° est à 12 heure les degré tourne dans le sens anti horaire d'ou le moins 30°
  ; Pour les minutes on decompte un 60ème de 30 degré
  degres=180-((Val(Heure$)*30)+((Val(Minute$)*30)/60))
  For y=(gTaille_Canvas/2)-gBas_Aiguille_Heure To gTaille_Canvas/2+(gRayon_Horloge-gMarge_Aiguille_Heure)
    For x=(gTaille_Canvas/2)-(gEpaisseur_Aiguille/2) To (gTaille_Canvas/2)+gEpaisseur_Aiguille
      XA=x3+(x-x3) * Cos (degres* #PI /180) +( y-y3)* Sin (degres* #PI /180)
      YA=y3-(x-x3) * Sin (degres* #PI /180) + (y-y3)* Cos (degres* #PI /180)
      AddElement(Ai_Heure())
      Ai_Heure()\x=XA
      Ai_Heure()\y=YA
    Next
  Next
EndProcedure

Procedure Init_Minute()
  ClearList(Ai_Minute())
  x3=gTaille_Canvas/2
  y3=gTaille_Canvas/2
  Minute$=FormatDate("%ii",Date())
  secondes$=FormatDate("%ss",Date())
  degres=180-(Val(Minute$)*6)
  For y=(gTaille_Canvas/2)-gBas_Aiguille_Minute To gTaille_Canvas/2+(gRayon_Horloge-gMarge_Aiguille_Minute)
    For x=(gTaille_Canvas/2)-(gEpaisseur_Aiguille_minute/2) To (gTaille_Canvas/2)+gEpaisseur_Aiguille_minute
      XA=x3+(x-x3) * Cos (degres* #PI /180) +( y-y3)* Sin (degres* #PI /180)
      YA=y3-(x-x3) * Sin (degres* #PI /180) + (y-y3)* Cos (degres* #PI /180)
      AddElement(Ai_Minute())
      Ai_Minute()\x=XA
      Ai_Minute()\y=YA
    Next
  Next
EndProcedure

Procedure Init_Seconde()
  ClearList(Ai_Seconde())
  x3=gTaille_Canvas/2
  y3=gTaille_Canvas/2
  secondes$=FormatDate("%ss",Date())
  degres=180-(Val(secondes$)*6)
  For y=(gTaille_Canvas/2)-gBas_Aiguille_Seconde To gTaille_Canvas/2+(gRayon_Horloge-gMarge_Aiguille_seconde)
    For x=(gTaille_Canvas/2)-(gEpaisseur_Aiguille_Seconde/2) To (gTaille_Canvas/2)+gEpaisseur_Aiguille_Seconde
      XA=x3+(x-x3) * Cos (degres* #PI /180) +( y-y3)* Sin (degres* #PI /180)
      YA=y3-(x-x3) * Sin (degres* #PI /180) + (y-y3)* Cos (degres* #PI /180)
      AddElement(Ai_Seconde())
      Ai_Seconde()\x=XA
      Ai_Seconde()\y=YA
    Next
  Next
EndProcedure

; EPB
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: Une Horloge analogique

Message par G-Rom »

Ar-S a écrit :
SPH a écrit :erreur ligne 22
rassure moi, tu utilises une version de PB gérant les CanvasGadget, sinon cherche pas plus loin :D
il attend une version qui sera bientôt dispo sur torrent411... :roll:
Avatar de l’utilisateur
SPH
Messages : 4947
Inscription : mer. 09/nov./2005 9:53

Re: Une Horloge analogique

Message par SPH »

G-Rom a écrit :
Ar-S a écrit :
SPH a écrit :erreur ligne 22
rassure moi, tu utilises une version de PB gérant les CanvasGadget, sinon cherche pas plus loin :D
il attend une version qui sera bientôt dispo sur torrent411... :roll:
J'etais le premier a proposer une signature prouvant que j'ai un compte PB !
J'ai PB 4.51 (je ne sais pas a combien on en est aujourd'hui)

Et j'ai toujours l'erreur ligne 30

!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
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Re: Une Horloge analogique

Message par comtois »

SPH a écrit :J'ai PB 4.51 (je ne sais pas a combien on en est aujourd'hui)

Et j'ai toujours l'erreur ligne 30
Tu devrais essayer avec la version 3.72 :P
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Une Horloge analogique

Message par Backup »

SPH a écrit :J'ai PB 4.51 (je ne sais pas a combien on en est aujourd'hui)
j'hallucine !

qu'est ce qui justifie que tu n’évolues pas ta version ?
comment peut tu ignorer qu'elle version on en est ??

si ce n'est peut etre bien que tu utilise une version Pirate ... désolé, mais on est en droit de douter , lorsqu'on te lis .. :roll:

Fred devrai vérifier avec toi quel compte tu as (ton login sur le Site de téléchargement), par message privé , et te Virer du forum si tu pirate, parce que là ça ferai un moment que ça dure :roll:


Ps: Ar-s : chez moi sur Seven 64 bit
voici ce que j'obtiens

Image

je pense que ma carte graphique y est pour quelque chose , voir Directx11
Avatar de l’utilisateur
SPH
Messages : 4947
Inscription : mer. 09/nov./2005 9:53

Re: Une Horloge analogique

Message par SPH »

Dobro a écrit :Fred devrai vérifier avec toi quel compte tu as (ton login sur le Site de téléchargement), par message privé , et te Virer du forum si tu pirate, parce que là ça ferai un moment que ça dure :roll:
Chiche :!:

!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
microdevweb
Messages : 1802
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: Une Horloge analogique

Message par microdevweb »

Olala j'ai déclenché le combat des Titans....

Ps: Pour Dobro même problème avec les aiguilles très vilain crénage (snifff...) comment faire

seven 64 bits (PB 4.70 béta et maintenant 5.0 béta)
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Répondre