Вычисление ближайшей точки к заданным прямым в пространстве

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

Если считать критерием близости сумму квадратов расстояний от точки до каждой прямой, то эта задача является задачей наименьших квадратов, и она может быть решена одним из описанных там методов.

Квадрат расстояния от точки до прямой можно представить, как

    | dir % ( v - point ) |2

Здесь dir - направление вдоль прямой ( единичный вектор ), % - векторное произведение, point - точка через которую проходит прямая, v - координаты точки для которой определяется расстояние. Следующая функция вычисляет эту точку:

Def<Vector3d> getNearPoint2 ( CCArrRef<Line3d> & line );

Если нужно задать прямым разный вес, то для этого надо умножить поле dir на соответствующий вес.

Робастный метод аппроксимации предназначен для данных с выбросами. Для этой функции нужны временные массивы plane и mass:

Def<Vector3d> getNearPointR ( CCArrRef<Line3d> & line, DynArrRef<Plane3d> & plane, DynArrRef<double> & mass );

Если же выбрать бесконечную норму, то задача сводится к поиску минимальной сферы, пересекающей все данные прямые. Центр этой сферы будет точкой у которой максимальное расстояние до прямых будет минимальным:

Def<Vector3d> getNearPointU ( CCArrRef<Line3d> & line );

Описание класса Line3d находится здесь.
Описание класса Vector3d находится здесь.
Описание шаблона классов Def находится здесь.
Описание шаблона классов CArrRef находится здесь.

Исходники находятся в approx3d.cpp

Наверх