Из глобальной в локальную систему координат, формула

Положим у нас есть точка в трехмерной декартовой системе координат. И есть некая локальная система координат в этом же пространстве — заданная точкой и тремя взаимно ортогональными векторами которые обозначают направления локальных осей.

Вопрос, как пересчитать такую глобальную точку в эту локальную систему координат? Задача видимо на столько тривиальная, что попытки нагуглить формулу перевода из глобальной в локальную систему координат — даёт огромное количество результатов. Вот только формулы нигде нет. 

Тут чуть выше  я приводил примеры использования скалярного произведения: Скалярное произведение векторов и его свойства

Так вот именно через скалярное произведение задача такого рода и решается в несколько действий. Тут я приведу листинги в стиле чего то похожего на C#.

 

Cначала зададим абстратную локальную систему координат. Она состоит из точки и трех векторов. Чтобы было веселее, ось Икс направим под углом 45 к глобальной оси Х, ось Z — в том же направлении, а ось Y — найдем через векторное произведение первых двух осей. Чтобы обеспечить их ортогональность. 

//Local Coordinate system
var cs = new CoordinateSystem( new Point(1000,1000,1000));
cs.VecX = new Vector(0.707,0,707,0);
cs.VecY = new Vector(0,0,1);
cs.VecZ = cs.MainX.Cross(cs.MainY); 

Первым действием найдем разницу между Точкой и системой координат. Поочредно вычитая ординаты локалки из ординат искомой точки. 

double xx = Point.X - cs.X;
double yy = Point.Y - cs.Y;
double zz = Point.Z - cs.Z;

Vector V = new Vector(xx,yy,zz); 

Эта разница нам задает не нормализованный вектор направленный из локальной системы в сторону глобальной точки. Теперь разложим этот вектор на ординаты в локальной системе координат. По просту — найдем скалярное прозведение этого вектора и каждой из осей нашей локальной систему координат:

double localPointX = cs.VectorX.X * V.X + cs.VectorX.Y*V.Y + cs.VectorX.Z*V.Z;
double localPointY = cs.VectorY.X * V.X + cs.VectorY.Y*V.Y + cs.VectorY.Z*V.Z;
double localPointZ = cs.VectorZ.X * V.X + cs.VectorZ.Y*V.Y + cs.VectorZ.Z*V.Z;
Point LocalPoint = new Point(localPointX, localPointY, localPointZ);

И вот наши искомые координаты точки в локальном пространстве координат:

Point LocalPoint = new Point(localPointX, localPointY, localPointZ); 

О том как из точку локальной системы координат перевести в глобальную, мы поговорим в следующий раз. 

А если вам вдруг интересно узнать почему же именно это сработало — идем сюда и внимательно читаем о том что дает нам произведение обычного вектора на единичный вектор.

Но в двух словах — длинна нашего вектора к точке, уменьшенная с помощью умножения на косинус угла. В нашем случае косинус угла между вектором к точке и вектором оси. И это дает нам ординату этого вектора по этой оси.