2012-10-18 3 views
0

두 점은 서로를 중심으로 회전하고 있습니다. 그러므로 나는 회전 행렬을 사용한다. 그러나 이제 포인트 간의 거리가 커지는 문제가 발생합니다 (atached video 1 참조). 그러나 거리는 내 전체 시뮬레이션에서 일정하게 유지되어야합니다.두 점은 같은 중심을 중심으로 회전하지만 거리가 길어집니다.

는 여기에 내가 속도를 계산하기 위해 사용하는 내 코드입니다 : P1과 P2는 두 지점이

.

double xPos = p0.x+p1.x; 
double yPos = p0.y+p1.y; 
//The center between p1 and p2 
xPos /=2; 
yPos /=2; 
//the rotating angle 
double omega = 0.1; 
//calculate the new positions 
double x0new = xPos + (p0.x-xPos)*std::cos(omega) - (p0.y-yPos)*std::sin(omega); 
double y0new = yPos + (p0.x-xPos)*std::sin(omega) + (p0.y-yPos)*std::cos(omega); 
double x1new = xPos + (p1.x-xPos)*std::cos(omega) - (p1.y-yPos)*std::sin(omega); 
double y1new = yPos + (p1.x-xPos)*std::sin(omega) + (p1.y-yPos)*std::cos(omega); 
//the speed is exatly the difference as I integrate one timestep 
p0.setSpeed(p0.x-x0new, p0.y-y0new); 
p1.setSpeed(p1.x-x1new, p1.y-y1new); 

그런 다음 정확하게 하나의 시간 단계를 통합합니다. 내 계산에서 무엇이 잘못 되었습니까?

업데이트 내 통합이 잘못된 것 같습니다. 직위를 직접 설정하면 완벽하게 작동합니다. 그러나 나는이 통합에 어떤 문제가 있는지 지금하지 :

언뜻에서
setSpeed(ux,uy){ 
    ux_=ux; 
    uy_=uy; 
} 
// integrate one timestep t = 1 
move(){ 
    x = x + ux_; 
    y = y + uy_; 
} 

Video of my behaviour

+0

'setSpeed'는 무엇을합니까? – Andrey

+0

은 하나의 시간 간격으로 통합되는 지점의 속도를 설정합니다. – tune2fs

+0

내 이론을 검증하기 위해 통합 기간을 수정할 수 있습니까? (확장하면 확장이 늘어납니다) –

답변

1

이 코드에는 아무런 문제가 없지만 표시되지 않은 "속도"통합은 이전 위치와 새 위치를 선형 적으로 통합하여 속도가 공칭 속도보다 빠를 때 궤도가 확장되도록합니다. 속도가 < 인 nominal_speed 인 경우 계약.

나는 의심 스럽습니다. 적분은 원점으로부터 일정한 거리에있을 것으로 예상되는 점 p0와 점 p1 사이의 선분에서 실제로 외삽합니다 (실제 시뮬레이션은 궤도를 타원형으로 만듭니다 ...)

따라서 외삽 계수가 0이면 새 위치는 계산 된 둘레에 있습니다. < 0 (및> -1)이면 예상되는 궤도를 보간합니다.

  O  This beautiful ascii art is trying to illustrate the integration 
     / x is the original position, o is the new one and O is the 
    /___----- "integrated" value and the arc is a perfect circle :) 
     o--  Only at the calculated position o, there is no expansion. 
    --/ 
// 
// 
|/
x 
1

, 주된 이유는 p0p1은 각 반복에서 좌표를 업데이트 할 것입니다. 그러면 정확하지 않은 정보가 누적되어 setSpeed에서 비롯 될 수 있습니다.

대신 상수 초기 좌표 p0p1을 사용해야하지만 각도는 omega 증가해야합니다.

+0

나는 두 배의 마지막 자리에 부정확 한 것이 생애에 누적 될 것이라고 의심한다. –

+0

그들은'SetSpeed'에서 왔을 수도 있습니다. 구현체가 제공되지 않습니다. – Andrey

관련 문제