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

В зависимости от того какую векторную норму выбрать для определения близости получим разные задачи. Если выбрать 1-норму, то тогда одна из точек пересечения трёх плоскостей будет являться решением этой задачи:

Def<Vector3d> getNearPoint1 ( CArrRef<Plane3d> plane, nat & ix1, nat & ix2, nat & ix3 );
Def<Vector3d> getNearPoint1 ( CArrRef<Plane3d> plane );

Здесь ix1, ix2, ix3 - это индексы плоскостей, пересечение которых даёт оптимальную точку.

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

Def<Vector3d> getNearPoint2 ( CArrRef<Plane3d> plane );

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

Если выбрать ∞-норму, то есть поиск минимакса расстояний до плоскостей, то следующая функция. находит его:

Def<Vector3d> getNearPointU ( CArrRef<Plane3d> plane );

В этой функции предполагается, что у всех плоскостей 2-нормы нормалей равны 1.

Следующие функции минимизируют p-норму для значений p = 4/3, 6/5, 8/7, 10/9:

Def<Vector3d> getNearPoint4_3 ( CArrRef<Plane3d> plane );
Def<Vector3d> getNearPoint6_5 ( CArrRef<Plane3d> plane );
Def<Vector3d> getNearPoint8_7 ( CArrRef<Plane3d> plane );
Def<Vector3d> getNearPoint10_9( CArrRef<Plane3d> plane );
Робастный метод аппроксимации предназначен для данных с выбросами. Этот алгоритм также заполняет массив весов (mass) значениями от 0 до 1.
Def<Vector3d> getNearPointR ( CArrRef<Plane3d> plane, ArrRef<double> mass );
Во всех функциях в случае неудачи поле isDef возвращаемого значения равно false.

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

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

Наверх