2012-11-01 9 views
0

나는 속도 V (벡터 X, 벡터 Y)로 움직이는 점을 가지고 있습니다. 처음에 V = (1, 0). 다음을 사용하여 임의의 각도로 반복하여 회전 :벡터 회전을 근사하는 방법

vectorX = vectorX * Math.cos (radianAngle) - vectorY * Math.sin (radianAngle);
vectorY = vectorX * Math.sin (radianAngle) + vectorY * Math.cos (radianAngle);

회전은 벡터 길이를 조정하지 않아야합니다.

0.9999999164020167
0.9989817245134542
0.9990928546670482
0.9990920078686215
0.9990307271300217
0.999
0.9990122314933966
0.9958140526821458
0.9953881407397223
0.9953002497794944
0.9953739080312035:하지만이 솔루션은 내 벡터 길이의 초과 근무를 감소 0.9950608230271147
0.9948941861659032
0.9949385678072231


0.9950609497602859
0.9951229086200286
0. 0.9953762669739241
나는 죄와 왜냐하면 기능이 근사 결과를 줄 것을 알고있다. 근데 왜 정확히 길이가 줄어들지? 어떻게 해결 될 수 있을까요?

답변

2

정확하지 않은 부동 소수점 산술 세계에 오신 것을 환영합니다. 당신은 정밀도를 잃습니다. 그것은 삶의 사실입니다.

대신 초기 고정 된 벡터를 증가하는 각도로 회전시켜야합니다.

즉 :

angle = angle + radianAngle; 
vectorX = initialVectorX * Math.cos(angle) - initialVectorY * Math.sin(angle); 
vectorY = initialVectorX * Math.sin(angle) + initialVectorY * Math.cos(angle); 

당신이 정밀 손실을 축적하지 않습니다 이쪽으로.