Redstone Calculer le sinus d'un angle

[GISED] Link

Torches, poudre et repeaters. What else ?
4 Mars 2012
341
76
140
29
VNSA, 2740 Moutier
vnsa.ch
586293ThundeRedResearchDepartment2.jpg


Calcul du sinus d'un angle
Calcul du sinus d'un angle
(en combinatoire)
Bonjour à tous, amateur de redstone.

On va voir ici comment faire un circuit qui nous calcule le sinus d'un angle. Vous avez peur ?Pas de soucis, si on commence par le début et qu'on avance gentiment jusqu'à la fin, tout devrait bien se passer.

Donc posons le problème :

Nous donnons une valeur qui correspondra à un angle, et nous recevrons une valeur qui correspondra à son sinus. Alors, plusieurs point à régler d’emblée :
  1. Un angle peut être exprimé en radian ou en degré (ou autre mais pas utile ici),
  2. Le sinus d'un angle est toujours compris entre -1 et 1. Donc des valeurs à virgules, et ça, c'est pas cool.
  3. La précision est quelque chose de très critique, que je vais détailler plus loin
Alors, on va tenter de faciliter la tâche : Et de l'utilisateur, Et de celui qui devra réaliser le circuit, en disant ceci :
  1. La valeur d'entrée du circuit sera comprise entre 0 et 90 (donc un angle en degré). Un circuit additionnel devra être utilisé pour gérer les signes et toujours rester dans cette plage de valeur (modulo de la division de l'angle ?).
  2. Pour éviter les virgules, notre circuit nous donnera des valeurs comprises entre 0 et 255 (8 bits). Il suffira alors de diviser la valeur obtenue par 255 pour avoir la vraie valeur du sinus.
  3. Au sujet de la précision, on verra que ça peut vite varier selon l'angle donné
Tout est clair ? On peut commencer ? Bien... mais, euh... On va où maintenant avec ça ? Eh bien, on va se diriger vers les entrailles des

:fou::fou::fou::fou::fou: Mathématiques :fou::fou::fou::fou::fou:
Chapitre 1 : Développement de Taylor :cool:

Je passe, je vais pas faire des maths ici, c'est un terrain trop dangereux.
Voir : développement limité du sinus

Donc, selon ce théorème, on peut écrire le sinus autour du point x=0 comme suit (faites moi confiance) :​
Code:
      1      3
x - ( --- * x  )  // avec x en Radian !!!!
      6

Je m'arrête volontairement à la 3ème puissance, car sinon on va avoir un circuit dont la taille va exploser. Et la précision . . . Très bonne entre 0 et 60°, après, c'est à vous de juger. On en reparlera avec les graphes plus bas.

Chapitre 2 : La formule magique :confused:

Bien, maintenant que vous savez comment obtenir un sinus (c'est cool nan ?), il faut encore :​
  1. Transformer mon angle de degré en radian (l'entrée est en degré, la formule utilise des radians)
  2. Diminuer le nombre de multiplication (parce que chaud quand même...)
  3. Diminuer le nombre de constante
  4. Mettre en forme le résultat pour qu'il soit compris entre 0 et 255
  5. Toujours, toujours, toujours avoir dans la tête cette histoire de précision, c'est très important
La partie qui suit est mise en forme à l'aide de mathematica, pour des questions de lisibilité.
327453Thoriep1.jpg

622556Thoriep2.jpg

Pour le shift : Diviser par une puissance de 2 c'est comme si on décalait la valeur binaire de log2(x) à droite. Ici pour plus d'info.

Okay, Je sais, la théorie c'est chiant, mais dans notre cas, c'était indispensable. Mais retenez cette formule, et on va voir un graphe pour estimer notre précision :​
313317fonctionapprox2.jpg

Bien bien... Alors qu'est-ce que cette belle fonction va nous donner ? regardons !
260480Rsumdusinus.png


C'est quoi ces Floor :rolleyes:

Floor(), cela signifie qu'on a pris uniquement la valeur entière de la division, arrondie vers le bas (Floor (1,8) = 1 ). Parce que je travaille en 8 bits, il y a des fois des résultats qui dépasse un peu, donc je m'arrange pour prendre les 8 qui m'intéressent et je met à la poubelle tout le reste. Donc, évidemment, ça crée des "saut", c'est ce qu'on voit sur le graphe en haut.

Ici on voit tout de suite la précision... Il est évident qu'on a va prendre C=76. Les testes ont montrés qu'on était encore assez précis.

Et voici les testes :
113398Graphiquederreur.png

La courbe jaune-orange représente l'erreur du à la résolution de 8 bit (sin(87°) =255 ... donc pas top) .

Et pis dans minecraft gros Malin ? :mad:

Tu as été patient ? Alors ça donne qqch qui peut ressembler à ça :
44757220141001234453.png

Une petite vue

28643020141001234549.png

en bas : l'entrée, et les lampes en haut : le résultat sur 8 bits !

Il suffira de diviser la valeur que vous recevez par 255 et vous aurez votre sinus !
 
Dernière édition: