Je pensais aux plates-formes et aux ennemis qui tournaient en rond dans les vieux jeux 2D, et je me demandais comment cela se faisait. Je comprends les équations paramétriques, et il est trivial d'utiliser sin et cos pour le faire, mais un NES ou un SNES pourrait-il faire des appels trig en temps réel? J'admets une grande ignorance, mais je pensais que ces opérations étaient coûteuses. Existe-t-il un moyen intelligent de calculer ce mouvement à moindre coût?
J'ai travaillé sur la dérivation d'un algorithme à partir d'identités de somme de trigonomètres qui n'utiliseraient que des triggers précalculés, mais cela semble compliqué.
Réponses:
Sur le matériel tel que vous le décrivez, une solution courante au cas général consiste simplement à produire une table de recherche pour les fonctions de trigonométrie qui vous intéressaient, parfois en conjonction avec des représentations à virgule fixe pour les valeurs.
Le problème potentiel de cette technique est qu'elle consomme de l'espace mémoire, bien que vous puissiez minimiser cela en optant pour une résolution inférieure des données dans votre table ou en profitant de la nature périodique de certaines fonctions pour stocker moins de données et les refléter lors de l'exécution.
Cependant, pour traverser spécifiquement les cercles - soit pour les pixelliser, soit pour déplacer quelque chose le long d'un, une variante de l'algorithme de ligne de Bresenham peut être utilisée . L'algorithme réel de Bresenham , bien sûr, est également utile pour traverser des lignes qui ne sont pas dans les huit directions "primaires" à peu de frais.
la source
Il y a une variation de l' algorithme de Bresenham par James Frith , qui devrait être encore plus rapide car il élimine complètement la multiplication. Il n'a pas besoin de table de recherche pour y parvenir, bien que l'on puisse stocker les résultats dans une table si le rayon reste constant. Étant donné que l'algorithme de Bresenham et de Frith utilisent une symétrie 8 fois, cette table de recherche serait relativement courte.
la source
xoff++ + xoff
et--yoff + yoff
. Votre liste de modifications corrigera cela, envisagez de le fixer en place plutôt que comme une pointe sur la note. (Voir la section 5, paragraphe 4 du standard C ++ pour des exemples et le standard qui l'appelle explicitement)balance += xoff++ + xoff
etbalance -= --yoff + yoff
. J'ai laissé cela inchangé, car c'était la façon dont l'algorithme de Frith avait été écrit à l'origine, avec le correctif ajouté plus tard par lui-même (voir ici ). Fixé maintenant.Vous pouvez également utiliser une version approximative des fonctions trigonométriques à l'aide de Taylor Expansions http://en.wikipedia.org/wiki/Taylor_series
Par exemple, vous pouvez avoir une approximation raisonnable du sinus en utilisant ses quatre premiers termes de la série Taylor
la source
Un algorithme génial pour voyager uniformément sur un cercle est l' algorithme de Goertzel . Il ne nécessite que 2 multiplications et 2 ajouts par étape, aucune table de recherche et un état très minimal (4 chiffres).
Définissez d'abord certaines constantes, éventuellement codées en dur, en fonction de la taille de pas requise (dans ce cas, 2π / 64):
L'algorithme utilise 4 nombres comme état, initialisé comme ceci:
Et enfin la boucle principale:
Cela peut alors durer éternellement. Voici les 50 premiers points:
L'algorithme peut bien sûr fonctionner sur du matériel à virgule fixe. La victoire nette contre Bresenham est la vitesse constante sur le cercle.
la source