Ищу помощь в понимании того, почему работает эта функция «Мир в локальное пространство».
Я прорабатываю Программирование искусственного интеллекта игры на примере Бакленда Следующая функция используется в книге для преобразовать точку из мирового пространства в локальное координатное пространство агента (его i hat и j hat - это AgentHeading и AgentSide соответственно)
inline Vector2D PointToLocalSpace(const Vector2D &point,
Vector2D &AgentHeading,
Vector2D &AgentSide,
Vector2D &AgentPosition)
{
//make a copy of the point
Vector2D TransPoint = point;
//create a transformation matrix
C2DMatrix matTransform;
double Tx = -AgentPosition.Dot(AgentHeading);
double Ty = -AgentPosition.Dot(AgentSide);
//create the transformation matrix
matTransform._11(AgentHeading.x); matTransform._12(AgentSide.x);
matTransform._21(AgentHeading.y); matTransform._22(AgentSide.y);
matTransform._31(Tx); matTransform._32(Ty);
//now transform the vertices
matTransform.TransformVector2Ds(TransPoint);
return TransPoint;
}
Мне сложно понять, почему это работает с точки зрения векторов и матриц. В чем причина использования точечного произведения в координатах перевода? Почему это скалярное произведение позиции агента и его заголовка? Чему это скалярное произведение геометрически соответствует?
Почему бы просто не перевести по позиции агента?
Например, почему бы не просто
matTransform.translate(-AgentPosition);
matTransform.rotate(AgentHeading, AgentSide);
Есть ли более простые способы представления этот алгоритм?