Discuss Scratch
- Discussion Forums
- » Français
- » Besoin d'aide pour un projet
- 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/
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 :
ou bien plus simplement :
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 :
Puis dans ta boucle, après l'incrémentation de Q par 1, par exemple :
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))
- 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!
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
Tu peux ajouter ça :
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
- 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.
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.
- Discussion Forums
- » Français
- » Besoin d'aide pour un projet