Como posso converter coordenadas em um quadrado para coordenadas em um círculo?
-
06-07-2019 - |
Pergunta
Estou desenvolvendo um jogo de vídeo indie, e vêm operando sob a suposição de que porque o thumbstick no meu controlador tem uma gama circular de movimento, ele retorna coordenadas "circular"; isto é, as coordenadas cartesianas constrangidos para uma área circular (de raio 1). Na verdade, as coordenadas são "quadrado"; por exemplo, os registos de posição thumbstick superior direito quando x = 1, y = 1. Quando eu converter as coordenadas de cartesiano para polar, a magnitude pode exceder 1 -. Que tem o efeito de que o jogador pode se mover mais rápido na diagonal do que eles podem verticalmente ou horizontalmente
Assim, para esclarecer, eu quero gravar a posição de um thumbstick analógico em termos de direção e magnitude, onde a magnitude é entre 0 e 1. As coordenadas thumbstick retorna em um plano quadrado, tão simplesmente converter as coordenadas de cartesiano para polar não é suficiente. Acho que preciso para converter a coordenada espaço , mas que está pressionando os limites do meu cérebro do macaco.
Solução
Mapeamento de uma praça a um círculo . Há também uma visualização agradável para o mapeamento. Você recebe:
xCircle = xSquare * sqrt(1 - 0.5*ySquare^2)
yCircle = ySquare * sqrt(1 - 0.5*xSquare^2)
Outras dicas
O mapeamento não é única. Há muitas outras soluções para esta questão.
Por exemplo, esse mapeamento também funcionará
u = x v (X ^ + y² - x²y²) / v (X ^ + y²)
v = y v (X ^ + y² - x²y²) / v (X ^ + y²)
onde
Uma imagem vale mais que mil palavras, então aqui estão algumas imagens para ilustrar a não-singularidade do mapeamento e seu inverso.
For a C++ implementation
deste outro mapeamento, vá para
http://squircular.blogspot.com/2015/09/fg-squircle -mapping.html
Consulte http://squircular.blogspot.com para mais imagens dos resultados do mapeamento.
Veja também "Métodos Analíticos para Quadratura do Disco" para um documento de reflexão diferentes equações de mapeamento com provas e derivações.
Divida cada valor pela magnitude para normalizar todos os valores em um vetor unitário, por exemplo.
magn = sqrt(x * x + y * y);
newx = magn > 1.0 ? x / magn : x;
newy = magn > 1.0 ? y / magn : y;
No entanto, isso pode ter o efeito de recorte a magnitude vez de normalização para os valores interiores .. Ou seja, você vai ter o mesmo valor para um controlador empurrado "totalmente" na parte superior esquerda e um controlador quase totalmente inserida na mesma direção.