Пусть задано множество прямых в пространстве и надо найти точку наиболее близкую к ним.
В качестве критерия близости будем рассматривать некоторую норму вектора расстояний от точки до прямых.
В этом случае нужно найти точку, которая минимизирует выбранную норму.
Квадрат расстояния от точки до прямой можно представить, как
| 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 находится здесь.
Исходники находятся в approx3d.cpp Наверх |