Como posicionar um nó ao longo de uma órbita circular em torno de um centro fixo com base em coordenadas do mouse (JavaFX)?

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

Pergunta

Estou tentando entrar em algum desenvolvimento básico jogo JavaFX e eu estou ficando confuso com alguma matemática círculo.

I tem um círculo em (x, y: 250: 250). Com um raio de 50

Meu objetivo é fazer um círculo menor para ser colocado sobre a circunferência do círculo acima com base na posição do mouse.

Onde Im ficando confuso é com o espaço de coordenadas eo Trig por trás de tudo.

Meus problemas vêm do fato de que o X / Y espaço na tela não está centrada em 0,0. Mas a parte superior esquerda da tela é 0,0 e na parte inferior direita é 500.500.

Meus cálculos são:

var xpos:Number = mouseEvent.getX();
var ypos:Number = mouseEvent.getY();

var center_pos_x:Number = 250;
var center_pos_y:Number = 250;

var length = ypos - center_pos_y;
var height = xpos - center_pos_x;

var angle_deg = Math.toDegrees(Math.atan(height / length));
var angle_rad = Math.toRadians(angle_deg);

var radius = 50;

moving_circ_xpos = (radius * Math.cos(angle_rad)) + center_pos_x;
moving_circ_ypos = (radius * Math.sin(angle_rad)) + center_pos_y;

Eu fiz a impressão aplicativo fora do ângulo (angle_deg) que eu ter calculado quando eu passar o mouse e minha saída está abaixo:

Quando o rato é (em graus que se deslocam para a esquerda):

  • directamente acima do círculo e horizontalmente em linha com o centro, o ângulo é -0
  • para a esquerda e verticalmente centrado, o ângulo é de -90
  • directamente abaixo do círculo e horizontalmente em linha com o centro, o ângulo é de 0
  • para a direita e verticalmente centrado, o ângulo é de 90

Então, o que posso fazer para torná-lo 0, 90, 180, 270 ??

Eu sei que deve ser algo pequeno, mas eu simplesmente não posso pensar no que é ...

Obrigado por qualquer ajuda (E não, isso não é uma atribuição)

Foi útil?

Solução

atan(height/length) não é suficiente para obter o ângulo. Você precisa compensar cada quadrante, bem como a possibilidade de "divisão por zero". A maioria das bibliotecas de linguagem de programação fornecer um método chamado atan2 que tomam dois argumentos; y e x. Este método faz este cálculo para você.

Mais informações sobre Wikipedia: atan2

Outras dicas

Você pode fugir sem calcular o ângulo. Em vez disso, use o centro de seu círculo (250.250) e da posição do mouse (xPos, ypos) para definir uma linha. A linha cruza seu círculo quando seu comprimento é igual ao raio do seu círculo:

// Calculate distance from center to mouse.
xlen = xpos - x_center_pos;
ylen = ypos - y_center_pos;

line_len = sqrt(xlen*xlen + ylen*ylen);  // Pythagoras: x^2 + y^2 = distance^2

// Find the intersection with the circle.
moving_circ_xpos = x_center_pos + (xlen * radius / line_len);
moving_circ_ypos = y_center_pos + (ylen * radius / line_len);

Apenas verifique se o mouse não está no centro de seu círculo, ou os line_len será zero eo mouse será sugado para um buraco negro.

Há um grande livro chamado "Graphics Gems" que podem ajudar com este tipo de problema. É um livro de receitas de algoritmos e código fonte (em C eu acho), e permite que você rapidamente resolver um problema usando a funcionalidade testada. Recomendo totalmente chegar as suas mãos sobre ele -. Ele me salvou grande momento quando eu rapidamente necessário para adicionar código para fazer operações bastante complexas com normais para superfícies e detecção de colisão

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