Если считать критерием близости сумму квадратов расстояний от точки до каждой прямой, то эта задача является задачей наименьших квадратов, и она может быть решена одним из описанных там методов. Квадрат расстояния от точки до прямой можно представить, как | dir % ( v - point ) |2 Здесь dir - направление вдоль прямой ( единичный вектор ), % - векторное произведение, point - точка через которую проходит прямая, v - координаты точки для которой определяется расстояние. Следующая функция вычисляет эту точку: Def<Vector3d> getNearPoint2 ( CArrRef<Line3d> line ); Если нужно задать прямым разный вес, то для этого надо умножить поле dir на соответствующий вес. Предыдущий алгоритм минимизирует 2-норму вектора расстояний от точки до прямых. Если же выбрать бесконечную норму, то задача сводится к поиску минимальной сферы, пересекающей все данные прямые. Центр этой сферы будет точкой у которой максимальное расстояние до прямых будет минимальным: Def<Vector3d> getNearPointU ( CArrRef<Line3d> line );
Описание класса Line3d находится здесь.
Исходники находятся в approx3d.cpp Наверх |