Получение одной линии с наименьшими квадратами, пересекающей множество трехмерных плоскостей

Я работаю со многими трехмерными плоскостями и ищу решение наименьших квадратов для случая ниже.

ЕСЛИ у меня много трехмерных самолетов, знающих только одну точку и
нормальный вектор (например, O1 и N1), и все эти плоскости пересекаются каждый
другой и сделать почти очень близко 3D-линии, то как вычислить
наименьший квадрат скорректирован на одну одну 3D линию, чтобы представить все эти
Пересечения.

Чтобы получить четкое представление, я вставил цифру.

  • Известно: одна точка и вектор нормали каждой плоскости.
  • Найти: Наименьшая площадь соответствует одной линии3d

введите описание изображения здесь

Поскольку я хочу сделать это с C ++, я тоже использую тег C ++.

0

Решение

Полностью не проверено.

Что делать, если вы взяли направления линий от перекрестков и получили Главный компонент

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

Используйте эту среднюю точку и основной компонент для определения вашей линии.

Что-то вроде…

class Plane
{
public:
Vector3 Point;
Vector3 Normal;

Line Intersect (const Plane &other);

Vector3 Project (const Vector3 &point);
}

class Line
{
public:
Vector3 Point;
Vector3 Direction;

Line (Vector3 point, Vector3 dir);

};

Vector3 PrincipleComponent (const std::vector<Line> &lines)
{
//You could use the covariance matrix to get this but I will try the interative method on wikipedia.
Vector3 p(1,2,3); //a random vector?
static const int c = 10;
for (int i = 0; i < c; ++i)
{
Vector3 t;
for (auto i = lines.begin(); i != lines.end (); ++i)
{
t = t + ((*i).Direction.Dot (p)) * (*i).Direction;
}
t.Normalize();
p = t;
}
return p;
}

int main ()
{
std::vector<Line> LinesFromPlaneIntersections;Vector3 direction = PrincipleComponent (LinesFromPlaneIntersections);
Plane projplane;
projplane.Normal = direction;
projplane.Point = LinesFromPlaneIntersections[0].Point;

Vector3 meanpoint;
for (auto i = LinesFromPlaneIntersections.begin(); i != LinesFromPlaneIntersections.end (); ++i)
{
meanpoint += projplane.Project ((*i).Point);
}

meanpoint /= LinesFromPlaneIntersections.size ();

Line result (meanpoint,direction);
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector