2011-10-28 4 views
0

이봐, 난 다음 함수에서 "숫자가 아님"의 반환 값을 점점 오전 :역 운동 학적 ACOS 오류 QNAN, INAN

void Spider::setAngles(double x,double y, double l1, double l2){ 
double theta1, theta2; 
theta2=acos((pow(x,2)+pow(y,2)-pow(l1,2)-pow(l2,2))/(2*l1*l2)); 
cout<<theta2* 180/PI<<endl; 
theta1=(-((l2*sin(theta2)*x)+(l1+l2*cos(theta2)*y))/((l2*sin(theta2)*y)+ (l1+l2*cos(theta2)*x)))* 180/PI; 
cout<<theta1; 
} 

내가 ACOS는 -1과 1 사이의 인수 값이 필요하다는 것을 이해하지만, 엔드 이펙터 포인트가 길이가 2 인 길이가 (15,15) 인 경우, 어떻게해야 할지를 알 수 없습니다 ...

모든 것을 정규화해야합니까? 관절 사이의 거리와 방향 벡터 포함 (0,0) -> (15,15)

도움이 될 것입니다!

답변

1

리콜 right angled triangle A에 대한 것을 : theta2에 대한 코드에서 의미

cos(angle) = Adjacent/Hypotenuse 

당신은 :

Adjacent = x*x + y*y - l1*l1 - l2*l2 
Hypotenuse = 2*l1*l2 

을 기껏이 거꾸로하고 정확하게에 따라 가능성이 단지 잘못 노력하고있어. 당신이 (X + L1, Y + L2)에 (0,0)에서 빗변과 직각 삼각형의 각도를 결정하려는 경우 사용합니다 :

Adjacent = x + l1 
Hypotenuse = sqrt((x+l1)*(x+l1) + (y+l2)*(y+l2)) 

또는 삼각형 (0

, 0) (X-L1, Y-L2)에 :

Adjacent = x - l1 
Hypotenuse = sqrt((x-l1)*(x-l1) + (y-l1)*(y-l1)) 

또한 당신이 직각 삼각형의 각도가 아닌 임의의 하나를 계산하기 위해 노력하고 있는지 확인하십시오.

+0

나는 아크 코사인을 사용하여 역함수를 찾으려고합니다. 아마 당신의 요점을 놓치고 있습니다! – user1018539

+0

예 : 첫 번째 방정식을 반대로하면 'Angle = acos (Adj/Hyp)'가됩니다. Adj 나 Hyp에 잘못된 숫자를 주면'acos()'의 유효 입력 범위 밖의 값으로 끝날 수 있습니다. – uesp