Comment puis-je convertir des coordonnées sur un carré en coordonnées sur un cercle?

StackOverflow https://stackoverflow.com/questions/1621831

  •  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.

Était-ce utile?

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²)

(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.

 groupe Brady circulaire

 squared Boston Celtics

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top