11
votes

Comment convertir des coordonnées sur un carré pour coordonner les coordonnées sur un cercle?

Je développe un jeu vidéo indépendant et je travaille sous l'hypothèse selon laquelle la clémasse de mon contrôleur a une gamme de mouvement circulaire, elle renvoie des coordonnées "circulaires"; C'est-à-dire que les coordonnées cartésiennes contraintes à une zone circulaire (du rayon 1). En fait, les coordonnées sont "carrées"; E.G., la position de la passe-clé en haut à droite enregistre comme x = 1, y = 1. Lorsque je convertit les coordonnées de Cartesian en Polar, la magnitude peut dépasser 1 - ce qui a pour effet que le joueur puisse se déplacer plus rapidement en diagonale que possible verticalement ou horizontalement.

Ainsi, pour clarifier, je souhaite enregistrer la position d'une molette analogique en termes d'une direction et d'une magnitude, où la magnitude est comprise entre 0 et 1. La molette retourne les coordonnées sur un plan carré, ce qui permet simplement de convertir les coordonnées de Cartesian à Polar n'est pas suffisant. Je pense que je dois convertir la coordonnée espace , mais qui appuie sur les limites de mon cerveau de singe.


6 commentaires

Est-ce que fait la place "entière" ou renvoie-t-il des coordonnées qui se trouvent dans quelque chose qui ressemble déjà à un cercle? Par exemple. Assurez-vous que vous pouvez (ou ne pouvez pas) prendre la magnitude SQRT.


Quoi (x, y) obtenez-vous avec le bâton vers le haut? De plus, votre stick est-il analogique ou commutateur? Pouvez-vous obtenir des valeurs telles que (0.5,0.5)?


Oui, les coordonnées sont distribuées sur un carré, y compris les coins.


Ensuite, je pourrais supprimer ma réponse. :-) On dirait que le logiciel de pilote pré-déformer les valeurs.


Nosredna: Je pense que tu as raison. Quelque chose (pilote? DirectInput?) Mappe aux coordonnées sur un carré. Je me demande pourquoi. Je préférerais presque toujours un cercle.


@Metaphile Ne soyez pas un tel cercle.


3 Réponses :


0
votes

Divisez chaque valeur par la magnitude pour normaliser toutes les valeurs à un vecteur d'unité, par exemple xxx

Cependant, cela peut avoir l'effet de couper la magnitude au lieu de normaliser les valeurs intérieures. C'est-à-dire que vous aurez la même valeur pour un contrôleur poussé "complètement" dans le haut à gauche et un contrôleur presque poussé complètement dans la même direction.


1 commentaires

Je ne veux vraiment pas clipser la magnitude. J'ai déjà un moratzone. Les deux ensemble réduiraient considérablement la plage de mouvement effective du bâton. Je pense que Eemeli a la bonne idée.



19
votes

voir Cartographie d'un carré à un cercle . Il y a aussi une belle visualisation pour la cartographie. Vous obtenez: xxx


1 commentaires

Basé sur la visualisation, je pense que c'est exactement ce que je veux. Merci!



13
votes

Le mappage n'est pas unique. Il y a beaucoup d'autres solutions à cette question.

Par exemple, cette cartographie fonctionnera également

u = x √ (x² + y² - x²y²) / √ (x² + y²)

v = y √ (x² + y² - x²y²) / √ (x² + y²)

(u, v) sont des coordonnées de disque circulaire et (x, y) sont des coordonnées carrées.

Une image vaut mille mots, alors voici quelques images pour illustrer le non-unicité de la cartographie et de son inverse.

 bouquet de brady circulaire

 carré Boston Celtics

pour une implémentation C ++ de cette autre cartographie, allez à
http://squirculaire.blogspot.com/2015/09/fg-squircle -Mapping.html
Voir http://squircular.blogspot.com pour plus d'images de la cartographie des résultats.

Voir aussi "Méthodes d'analyse pour la mise en place du disque" pour un papier discutant de différentes équations de cartographie avec des preuves et dérivations.


2 commentaires

Joli. Comment avez-vous généré les chiffres (langue / bibliothèque)?


J'ai écrit un programme de traitement d'image simple en C ++ qui utilise différentes équations de cartographie par pixel. Voir le lien vers un lien de code. Libpng est une lecture utile et d'écrire des fichiers PNG