2013-07-28 2 views
2

저는 몇 시간 동안 답변을 찾고 있었지만 아무 것도 나타나지 않았습니다. 이것이 중복 된 것이라면 사과하지만 StackOverflow에서 내 특정 문제에 대한 해결책을 찾지 못했습니다.이상하게 행동하는 Java의 두 점 사이의 각도 찾기

나는 점과 y 축 사이의 각도 발견 기능이 : 나는 답을 알고

getAngle(1,1); //returns 90.00000250447816 
getAngle(5,5); //returns 51.34019265119512 
getAngle(10,10); //returns 48.012787449847956 
getAngle(100,100); //returns 45.287917631417216 
getAngle(1000,1000); //returns 45.02866072599646 

: 나는 그것을 호출 할 때

public static double getAngle(float x1,float y1) { 
    float y_x = 0; 
    float y_y = 1; 
    float p_x = x1; 
    float p_y = y1; 

    float theta = (float)Math.atan2((p_x-y_x),(p_y-y_y)); 
    return (float)Math.toDegrees(theta) 
} 

그런 다음, 내가 이상한 행동을 얻을를 는 45입니다. getAngle (x, x)가 x의 한계가 무한대에 가까워짐에 따라 45에서 수렴하는 것처럼 보일 것입니다. 문제는 0.01에서 10.0 사이의 값으로 작동하는 데이 함수가 필요하다는 것입니다.

함수가이 방식으로 작동하는 이유와 내가 찾고있는 대답을 어떻게 알 수 있습니까?

P. 처음에 내점 제품 ID acos((ax*bx+ay*by)/|a||b|)을 사용해 보았는데 비슷한 문제가 발생했습니다.

+0

부정확 할 수 있습니다. 'float' 대신에'double'을 사용 해보고 무슨 일이 일어나는지 말해주십시오. – gparyani

+0

그래서 기본적으로 벡터'[x1 y1] '과 수직 (또는 y 축) 사이의 각도를 얻으려고합니까? 수학이 잘못 되었다면 첫 번째 숫자는 90이되어야합니다. – FraserK

+1

숫자가 y_y = 1 인 것 같습니다. 아마도이 값을 0으로 설정하려고했을 것입니다. –

답변

2

D x은 무한대이다 접근 할 때 효과적으로 전자 quivalent to

Math.atan(x/(x-1)) 
입니다

Math.atan2(x, x-1) 

을 계산했다 x가 무한대에 접근 할 때

따라서 분명히 올바른

Math.atan(1) 

에 접근한다.

+0

거의 효과가있었습니다. 저는 Fraserk에서 제공 한 코드를 사용해야했습니다. 그러나 당신은 무슨 일이 일어나고 있는지 설명하고 함수의 다른 부분에서 회전 행렬을 수정하도록 도왔습니다. 고마워! – retrohacker

+0

@ 크래커 편집이 거부되어 수동으로 변경했습니다. –

2

수학 문제가 잘못된 것처럼 보입니다. 내 접근 방식은 수평을 찾고 90에서 빼는 것이다. 예를 들어 새 벡터에 의해 정의 된 삼각형의 각도를 점점되도록 다른 각각에서 벡터를 뺀 때문에

당신이 잘못 왜
double theta = Math.PI/2 - Math.atan2(y1,x1); //answer in radians 

이다. X 축에 측정하고 90에서 그것을 빼면 그것은 훨씬 쉽게 될 것입니다 : 당신은 단순히

float theta = (float) ((Math.PI/2) - Math.atan2(y1, x1)); 

당신의 getAngle(x, x)이 올바른 각도에 접근하는 이유를 사용해야합니다

+0

atan2는 라디안을 반환합니다. 90을 (Math.PI/2)로 변환해야합니다. 그렇지 않으면 이것이 효과가있었습니다! 도움 동료를 보내 주셔서 감사합니다. 너와 허스 터가 대답했다. 나는 내 어리 석음을 완전히 이해했다. – retrohacker

+1

오, 아, 그래 라디안을 반환합니다 ... 지금 편집 해 드리겠습니다. – FraserK