Page 1 sur 4

Une Horloge analogique

Publié : ven. 31/août/2012 12:14
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

Re: Une Horloge analogique

Publié : ven. 31/août/2012 12:37
par Backup
.....

Re: Une Horloge analogique

Publié : ven. 31/août/2012 13:15
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

Re: Une Horloge analogique

Publié : ven. 31/août/2012 13:44
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 ;) )

Re: Une Horloge analogique

Publié : ven. 31/août/2012 16:37
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






@++

Re: Une Horloge analogique

Publié : ven. 31/août/2012 16:59
par Backup
ha.. bah la difference doit encore venir de ma carte graphique ... (GTX 570M)

Re: Une Horloge analogique

Publié : ven. 31/août/2012 17:02
par SPH
erreur ligne 22

Re: Une Horloge analogique

Publié : ven. 31/août/2012 17:11
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

Re: Une Horloge analogique

Publié : ven. 31/août/2012 17:15
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

Re: Une Horloge analogique

Publié : ven. 31/août/2012 18:05
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:

Re: Une Horloge analogique

Publié : ven. 31/août/2012 18:32
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

Re: Une Horloge analogique

Publié : ven. 31/août/2012 18:46
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

Re: Une Horloge analogique

Publié : ven. 31/août/2012 19:15
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

Re: Une Horloge analogique

Publié : ven. 31/août/2012 20:59
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 :!:

Re: Une Horloge analogique

Publié : ven. 31/août/2012 21:26
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)