Como posicionar um nó ao longo de uma órbita circular em torno de um centro fixo com base em coordenadas do mouse (JavaFX)?
-
06-07-2019 - |
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)
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