Discuss Scratch

kevinsmith1
New to Scratch
3 posts

Besoin d'aide pour un projet

Bonjour, j'aurai besoin d'aide pour finaliser un projet.
Mise en situation : Un cercle C de centre O. À l’instant 0, Lucie la puce se trouve au point L0 de C. Lucie saute sur un autre point du cercle, décrivant successivement les points L1, L2, L3, etc. L’angle α fait par deux points consécutifs avec le centre O de C est toujours le même.

Le but c'est de savoir en combien de points differents et tours Lucie reviendra a son point de depart L0.
Afin de tester n'importe qu'elle angle, j'ai refais la situation sur scratch.
Q est le compteur representant le nombre de points differents
T est le compteur representant le nomber de tours.

Cependant, je n'arrive pas a faire marcher le compteur de tours T.
Pourriez vous m'aider, merci d'avance.

Voici mon project :
https://scratch.mit.edu/projects/188393060/
ma15fo43
Scratcher
1000+ posts

Besoin d'aide pour un projet

Que veux-tu dire par “tour” ?

No longer active on Scratch, I build stuff with TypeScript and Kotlin nowadays. (#3 all-time poster in French forums)
SBissay
Scratcher
500+ posts

Besoin d'aide pour un projet

Essayons de manière mathématique pour voir :

On va supposer que α est entier.

Pour faire un tour complet, il faut faire 360° tout pile.
Ce qui veut dire que si l'angle total parcouru par Lucie la puce est un multiple de 360, alors elle sera revenue à son point de départ.

Or, elle avance en faisant α degrés.

On cherche donc le nombre de mouvements n, le plus petit possible, tel que n * α soit un multiple de 360, autrement dit qu'il existe un m entier tel que n * α = 360 * m.

Du coup, on a là un problème d'arithmétique :

Si α est un diviseur de 360, on a tout simplement m = 1 et n = 360 / α.

Tout le sel de la question vient du cas α non diviseur de 360.
Et là la question devient : comment je fais en sorte qu'en multipliant α j'obtienne un multiple de 360 ?
Et la réponse est : grâce au PPCM !
En effet, PPCM(α, 360) va me donner le plus petit multiple de 360 (non nul !) que je vais pouvoir en multipliant α par un entier.

Du coup, une fois que j'ai ce PPCM, le problème redevient le même : le nombre de déplacement nécessaires est PPCM(α, 360) / α.

Pour le nombre de tours, c'est tout simplement PPCM(α, 360) / 360
(et ça fonctionne même quand α divise 360, vu que dans ce cas PPCM(α, 360) = 360).


Pour le nombre de tours en temps réel dans ton programme, c'est un peu plus compliqué :
La direction du personnage est stockée par un nombre entre -180 et 180 (avec le 0 en haut), ce qui n'est pas très pratique.
Pour ramener ce nombre à un nombre entre 0 et 360, on peut faire deux choses :

si <(direction) < [0]> alors
mettre [dir v] à ((direction) + (360))
sinon
mettre [dir v] à (direction)
end

ou bien plus simplement :
mettre [dir v] à ((direction) modulo (360))

Maintenant, on démarre à 0, et on entame un nouveau tour quand on dépasse les 360.
La meilleure idée que j'ai pour le moment est de stocker la direction calculée plus haut, puis quand tu te déplaces, de vérifier si la nouvelle direction, modulo 360, est inférieure à l'ancienne. Si c'est le cas, augmenter le compteur de tours.
Puis stocker la nouvelle direction, toujours modulo 360.
Le problème c'est qu'on tourne dans le mauvais sens, donc en fait il faut prendre l'opposé de la direction ( = -1 * direction).

En gros, ça donne ça :
Au début du programme :
mettre [dir v] à [0]

Puis dans ta boucle, après l'incrémentation de Q par 1, par exemple :
si <(dir) > (((-1) * (direction)) modulo (360))> alors
ajouter à [Tour= v] (1)
end
mettre [dir v] à (((-1) * (direction)) modulo (360))

Generative art :              Pivot  :               Sudoku :
kevinsmith1
New to Scratch
3 posts

Besoin d'aide pour un projet

Bonjour, merci infiniment pour votre si bien detailee.
En suivant vos indications, le programme marche tres bien pour α < 360. Cependant si α > 360, le programme affique que 1 tour (quand Lucie revient au point de depart).

Aurait-il un moyen de mettre un capteur au point x=52 y=0 (le point de depart de Lucie), pour que a chaque fois que Lucie passe par ce point, on rajoute +1 aux tours. J'avais deja essaye de mettre un point pour que quand Lucie le touche on fasse +1 tour, mais vu la taille du lutin ce n'etait pas precis et le stylo qui repasse par dessus effaca le point.

Merci beaucoup pour votre aide!
SBissay
Scratcher
500+ posts

Besoin d'aide pour un projet

Mais de rien.

Pour la demande, c'est en fait beaucoup plus simple : tu peux supprimer tout ce qui utilise la variable “dir” (réponse précédente).

Et dans ta boucle
répéter (réponse) fois

end

Tu peux ajouter ça :
si <<(abscisse x) = [51]> et <(ordonnée y) = [2]>> alors
ajouter à [Tour= v] (1)
end

Generative art :              Pivot  :               Sudoku :
kevinsmith1
New to Scratch
3 posts

Besoin d'aide pour un projet

Merci beaucoup, le programme marche parfaitement.

Le but de ce projet etait de voir s'il existe un angle α, tel que Lucie ne revienne. Mathematiquement si α est un irrationel, Lucie ne devrait pas revenir a son point de depart. Je voulais m'en assurer sur scratch, mais apparament la precision n'est pas assez forte. Par exemple pour racine de 2, le programme s'arrete au bout d'un tour, sauf qu'en realite Lucie ne s'arrete pas au bout d'un tour pour racine de 2.

Merci de m'avoir aide.
SBissay
Scratcher
500+ posts

Besoin d'aide pour un projet

Ah oui, la précision ne sera jamais suffisante sur un ordinateur quand tu travailles avec des flottants, vu qu'il arrondit forcément (et du coup tout devient rationnel).

Il faudrait utiliser un programme qui fait du calcul formel, mais c'est plus compliqué à trouver

Generative art :              Pivot  :               Sudoku :

Powered by DjangoBB