Arrive는 찾기와 동일한 로직을 사용한다.
다른점이라 한다면 목표지점에 도착할 때 속도를 감속시켜 멈추는 로직이 추가된다는 것이다.
감속을 위한 계산법으로는 이미 사용하고 있는 Speed 값을 거리로 나누는 방법을 사용하였다.
공식은 다음과 같다.
Speed = Dist / ( Deceleration * 0.3 ) ( 거리 / (감속정도 * 0.3) )
DeceleratedVelocity = TargetVelocity * Speed / Dist ( 감속된속력 = 원하는속력 * 속도 / 거리 )
위의 공식으로 생각해보면 속도와 거리가 줄어들수록 감속된 속력을 얻을 수 있다.
원리는 거리가 줄어들면 Speed가 줄어들고 Speed와 거리가 줄어들면 결국 멈추도록 계산된다.
이렇게 얻은 감속된 속력에서 현재속도를 빼면 찾기때와 마찬가지로 조종힘 (D)을 얻을 수 있다.
D = DV - C
코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | // 매개변수 1. 목표지점, 2. 감속정도 Vector2D SteeringBehavior::Arrive(Vector2D TargetPos, Deceleration deceleration) { Vector2D TargetVelocity = TargetPos - m_pVehicle->Pos(); // 거리구하기 double dist = TargetVelocity.Length(); // 거리가 0보다 크면 이동 if (dist > 0) { // 속도 감속의 미세한 조종을 위한 상수 const double DecelerationTweaker = 0.3; // 속도 = 거리 / (감속정도 * 미세조종상수) // 거리가 줄어들수록 속도가 줄어든다. (분자가 작아질수록 값은 작아진다.) double speed = dist / ((double)deceleration * DecelerationTweaker); // 계산된 속도가 최대속도를 넘는지 확인한다. speed = min(speed, m_pVehicle->MaxSpeed()); // 감속된 속력 = 원하는 속력 * 속도 / 거리 Vector2D DeceleratedVelocity = TargetVelocity * speed / dist; // 조종힘 = 감속된 속력 - 현재속력 return (DeceleratedVelocity - m_pVehicle->Velocity()); } return Vector2D(0, 0); } | cs |
+ 후에 동영상을 올릴 수 있으면 추가하겠다.
'All > Algorithm' 카테고리의 다른 글
큰 수 구하기 (0) | 2016.03.15 |
---|---|
삼각함수를 이용한 원 그리기 (0) | 2016.03.15 |
자동적에이전트 - Flee (0) | 2016.02.21 |
피벗설정에 따른 퀵정렬의 속도 (0) | 2016.01.18 |
자동적에이전트 - Seek (0) | 2016.01.17 |