마우스 좌표 (JAVAFX)를 기반으로 고정 중심 주위에 원형 궤도를 따라 노드를 배치하는 방법은 무엇입니까?

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

문제

나는 기본적인 Javafx 게임 개발에 들어가려고 노력하고 있으며 나는 일부 원 수학과 혼동되고 있습니다.

반경이 50 인 (x : 250, y : 250)에 원이 있습니다.

나의 목표는 마우스의 위치에 따라 위의 원의 둘레에 더 작은 원을 만드는 것입니다.

혼란스러워하는 곳은 좌표 공간과 그 뒤에있는 트리그와 함께입니다.

내 문제는 화면의 X/Y 공간이 0,0에 중심이 없다는 사실에서 비롯됩니다. 그러나 화면의 왼쪽 상단은 0,0이고 오른쪽 하단은 500,500입니다.

내 계산은 다음과 같습니다.

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;

앱이 마우스를 움직일 때 계산 한 각도 (Angle_deg)를 인쇄하고 출력이 다음과 같습니다.

마우스가있을 때 (클록 시계 반대 방향으로 이동) :

  • 원 바로 위와 센터와 수평 인라인으로 각도는 -0입니다.
  • 왼쪽과 수직 중앙에 각도는 -90입니다.
  • 원 바로 아래와 중심과의 수평 인라인, 각도는 0입니다.
  • 오른쪽과 수직 중심에 각도는 90입니다.

그렇다면 0, 90, 180, 270을 만들려면 어떻게해야합니까 ??

나는 그것이 작아야한다는 것을 알고 있지만, 그것이 무엇인지 생각할 수 없습니다 ...

도움을 주셔서 감사합니다 (그리고 이것은 과제가 아닙니다)

도움이 되었습니까?

해결책

atan(height/length) 각도를 얻기에는 충분하지 않습니다. "Division-by-Zero"의 가능성뿐만 아니라 각 사분면을 보상해야합니다. 대부분의 프로그래밍 언어 라이브러리는 호출되는 방법을 제공합니다 atan2 두 가지 논쟁을 취하는 것; y 그리고 x. 이 방법은이 계산을 수행합니다.

자세한 내용 Wikipedia : atan2

다른 팁

각도를 계산하지 않고 도망 갈 수 있습니다. 대신 원의 중심 (250,250)과 마우스 위치 (xpos, ypos)를 사용하여 선을 정의하십시오. 길이가 원의 반경과 같을 때 선이 원을 교차합니다.

// 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);

마우스가 원의 중앙에 있지 않다는 것을 확인하십시오. 그렇지 않으면 line_len이 0이고 마우스가 블랙홀에 빨려 들어갑니다.

거기에 "그래픽 보석"이라는 훌륭한 책 이런 종류의 문제에 도움이 될 수 있습니다. 알고리즘 및 소스 코드 (CI Think)의 요리 책이며 테스트 된 기능을 사용하여 문제를 신속하게 해결할 수 있습니다. 나는 당신의 손을 잡는 것이 좋습니다 - 그것은 표면에 대한 정상 및 충돌 감지를 통해 상당히 복잡한 작업을 수행하기 위해 코드를 추가해야 할 때 큰 시간을 절약했습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top