Forum Liberty Basic France

Débutant » Horloge analogique Prétexte pour aborder la tortue
Le 07/03/2021 à 20h05

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 741
La tortue ? Quoiqu'est-ce ? Une incursion dans le domaine de la tortue, une autre manière de faire du graphisme qu'avec l'habituel repère orthonormé et son acolyte le cercle trigonométrique.

On dessine en donnant des ordres comme "avance de tant de pixels", "tourne à gauche", "tourne à droite", "tourne de tant de degrés". Oui, on parle bien de degrés, finies les conversions à faire en radians pour afficher une oblique. En plus, la notation des angles est bien plus naturelle, avec les degrés que nous connaissons depuis toujours, et qui ont la bonne idée d'être disposés comme les graduations du compas des navigateurs : le 0° s'appelle Nord, le 90° est l'Est, 180 le Sud, et 270... eh bien, l'Ouest

Deux petits bémols :
1. à chaque fois qu'on envoie une instruction, je ne serais pas surpris qu'il y ait une petite erreur, probablement infinitésimale, mais qui au final devrait se voir. Je n'ai pas testé trois milions de "avance de 10 pixels" et "tourne de 1°" pour voir si on tourne vraiment en rond.
2. le système garde en mémoire la dernière position et la dernière orientation, si on veut une droite orientée à 30° puis une autre orientée à 70°, on ne peut pas lancer un "turn 30" puis un "turn 70", la deuxième droite serait dessinée à 30+70=100° : il faut remettre à zéro l'orientation en retirant le même angle avec un signe opposé, ou tenir compte de l'orientation de la première droite pour calculer celle de la seconde.

Un petit exemple pour mieux comprendre :
Code VB :
 
nomainwin
WindowHeight=600
WindowWidth=800
graphicbox #h.cad, 180, 20, 401, 401
open "Dessin avec la tortue" for window as #h
    #h, "trapclose [quitter]"
 
    #h.cad, "down ; fill darkgray"	'couleur de fond du graphicbox
    #h.cad, "color yellow ; size 1"	'couleur et taille du crayon
    #h.cad, "home"   'place la tortue au milieu du graphique (fenêtre ou graphicbox)
    #h.cad, "turn 30"'tourne de 30 degrés à droite
    #h.cad, "go 75"  'avance de 75 pixels
    #h.cad, "turn 70"'tourne de 70 degrés à droite
    #h.cad, "go 75"  'avance de 75 pixels

    wait
 
[quitter]
    close #h
    end
 


Et voilà l'horloge :
Code VB :
 
'horloge
nomainwin
WindowHeight=600
WindowWidth=800
graphicbox #h.cad, 180, 20, 401, 401
open "Horloge" for window as #h
    #h, "trapclose [quitter]"
 
    gosub [initialisation_horloge]
 
    'actualisation de l'heure
    [top]
    ancienh$=h$
    gosub [donne_heure]
    if h$<>ancienh$ then gosub [affiche_heure]
        'affiche l'heure seulement lorsqu'elle a changé
    scan'évite que la boucle [top] tourne indéfiniment
        'ce qui permet la détection d'évènement utilisateur
        '(frappes clavier, clics souris...)
    goto [top]
 
    wait
 
[quitter]
    close #h
    end
 
[initialisation_horloge]
    'dessin des graduations des minutes
    #h.cad, "down ; fill darkgray"
    #h.cad, "color yellow ; size 1"
    mn=360/60
    for a=1 to 60
        #h.cad, "home"
        #h.cad, "turn ";mn
        #h.cad, "go 150"
    next
    'masquage des parties inutiles des graduations
    #h.cad, "home"
    #h.cad, "backcolor darkgray ; color darkgray ; circlefilled 140"
 
    'dessin des graduations des heures
    #h.cad, "color yellow ; size 3"
    hr=360/12
    for a=1 to 12
        #h.cad, "home"
        #h.cad, "turn ";hr
        #h.cad, "go 150"
    next
    'masquage des parties inutiles des graduations
    #h.cad, "home"
    #h.cad, "backcolor darkgray ; color darkgray ; circlefilled 120"
 
    'dessin des aiguilles
    gosub [donne_heure]
    gosub [affiche_heure]
 
    return
 
[donne_heure]
    h$=left$(time$(),5) 'on ne garder qu'heures et minutes
    heure=val(left$(h$,2))
    minute=val(right$(h$,2))
 
    'déterminer ante- ou post-meridiem
    if heure>12 then
        heure=heure-12
        indic$="PM"
    else
        indic$="AM"
    end if
 
    return
 
[affiche_heure]
 
    'on efface l'heure précédente
    #h.cad, "home"
    #h.cad, "backcolor darkgray ; color darkgray ; circlefilled 120"
 
    'on affiche la nouvelle heure
    'heures
    degres=heure*hr+minute*0.5
    #h.cad, "color yellow"
    #h.cad, "home"
    #h.cad, "turn ";degres
    #h.cad, "go 80"
    #h.cad, "turn ";degres*-1
    '
    'minutes
    degres=minute*mn
    #h.cad, "color yellow"
    #h.cad, "home"
    #h.cad, "turn ";degres
    #h.cad, "go 100"
    #h.cad, "turn ";degres*-1
 
    'avant ou après midi
    #h.cad, "stringwidth? indic$ lar"
    #h.cad, "place ";200-lar/2;" ";230
    #h.cad, "\"+indic$
 
    return
 
____________________
Just BASIC v2.0 :
  • utilisation courante avec GNU/Linux Mageia7+ Wine (Pas trouvé d'incohérences ou de bug de compilation à ce jour)
  • utilisation occasionnelle ou vérification/débugage difficile avec Windows XP sur un petit eeepc

   
Le 25/03/2021 à 11h21

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2484
Pas mal. :) Une 'trotteuse pour les secondes serait bienvenue
On peut se demander pourquoi on a pas fait des horloges 24 heures par tours (pour les tunnels, caves et autres catacombes...)

Hey, ton post devrait être dans "général", puisque c'est fonctionnel.
"Débutant" c'est pour les questions.
Purée y a pas moyen de renommer les catégories,grrr...
____________________
Roro

   
Le 28/03/2021 à 21h31

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 741
Merci pour le "pas mal", et "non" pour le changement de catégorie : il est volontairement placé dans "débutant", pour l'utilisation de la tortue. a+
____________________
Just BASIC v2.0 :
  • utilisation courante avec GNU/Linux Mageia7+ Wine (Pas trouvé d'incohérences ou de bug de compilation à ce jour)
  • utilisation occasionnelle ou vérification/débugage difficile avec Windows XP sur un petit eeepc

   
Débutant » Horloge analogique Prétexte pour aborder la tortue  

 |  |

1 Utilisateur en ligne : 0 Administrateur, 0 Modérateur, 0 Membre et 1 Visiteur
Utilisateur en ligne : Aucun membre connecté
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie