Como posso converter coordenadas em um quadrado para coordenadas em um círculo?

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

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

Foi útil?

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 (u, v) são coordenadas de disco circular e fortes <> (x, y) são coordenadas quadrados.

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.

 circular bando Brady


 quadrado Boston Celtics

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top