Comment puis-je convertir des coordonnées sur un carré en coordonnées sur un cercle?
-
06-07-2019 - |
Question
Je développe un jeu vidéo indépendant et je suppose que, du fait que la manette de contrôle sur ma manette a une amplitude de mouvement circulaire, elle renvoie "circulaire". les coordonnées; c'est-à-dire que les coordonnées cartésiennes sont contraintes à une zone circulaire (de rayon 1). En fait, les coordonnées sont "carrées"; par exemple, la position de la manette en haut à droite enregistre comme x = 1, y = 1. Lorsque je convertis les coordonnées cartésiennes en coordonnées polaires, la magnitude peut dépasser 1, ce qui a pour effet de permettre au joueur de se déplacer plus rapidement en diagonale que verticalement ou horizontalement.
Donc, pour clarifier, je veux enregistrer la position d’une manette analogique en termes de direction et de magnitude, où elle est comprise entre 0 et 1. La manette renvoie les coordonnées sur un plan carré, convertissant donc simplement les coordonnées de Cartésien à polaire ne suffit pas. Je pense que je dois convertir la coordonnée espace , mais cela repousse les limites de mon cerveau de singe.
La solution
Voir Associer un carré à un cercle . Il y a aussi une belle visualisation pour la cartographie. Vous obtenez:
xCircle = xSquare * sqrt(1 - 0.5*ySquare^2)
yCircle = ySquare * sqrt(1 - 0.5*xSquare^2)
Autres conseils
Le mappage n'est pas unique. Il existe de nombreuses autres solutions à cette question.
Par exemple, ce mappage fonctionnera également
u = x v (x² + y² - x²y²) / v (x² + y²)
v = y v (x² + y² - x²y²) / v (x² + y²)
où (u, v) sont les coordonnées d'un disque circulaire et (x, y) sont des coordonnées carrées.
Une image vaut mille mots. Voici donc quelques images pour illustrer la non-unicité de la cartographie et de son inverse.
Pour une implémentation C ++
de cet autre mappage, allez à
http://squircular.blogspot.com/2015/09/fg-squircle -mapping.html
Voir http://squircular.blogspot.com pour plus d'images du résultat de la cartographie.
Voir aussi "Méthodes analytiques pour la quadrature du disque" pour un article traitant de différentes équations de mappage avec des preuves et dérivations.
Divisez chaque valeur par la magnitude pour normaliser toutes les valeurs en un vecteur unitaire, par exemple
.magn = sqrt(x * x + y * y);
newx = magn > 1.0 ? x / magn : x;
newy = magn > 1.0 ? y / magn : y;
Toutefois, cela peut avoir pour effet de découper la magnitude au lieu de normaliser les valeurs intérieures. Autrement dit, vous obtiendrez la même valeur pour un contrôleur poussé "entièrement". en haut à gauche et un contrôleur presque poussé à fond dans la même direction.