Получение одной линии с наименьшими квадратами путем пересечения многих 3D-плоскостей

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

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

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

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

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

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


person gnp    schedule 14.03.2013    source источник
comment
Это вопрос аналитической геометрии, а не вопрос программирования. Я уверен, что даже внутри StackExchange есть более подходящие форумы, чтобы задать этот вопрос.   -  person Euro Micelli    schedule 14.03.2013
comment
Это тоже кажется несколько сложным. Плоскости пересекаются по линиям, так как вы определяете свою функцию расстояния? Точка ближайшего сближения двух трехмерных прямых?   -  person TheMathemagician    schedule 14.03.2013
comment
Просто разбросайте несколько точек вдоль попарных линий пересечения и вычислите наименьшие квадраты из точек.   -  person Will Ness    schedule 14.03.2013
comment
@Will Ness: Да, я думал о парном пересечении. Затем я услышал, что это можно сделать напрямую с наименьшим квадратом, не пересекаясь попарно. поэтому я хочу принять этот путь. но нет четкого представления о том, как следует строить вопрос наименьшего квадрата с заданными переменными.   -  person gnp    schedule 14.03.2013
comment
@TheMathemagician: Извините за мою плохую математику, я не могу найти для вас ответ.   -  person gnp    schedule 14.03.2013
comment
нумеруем плоскости 1,2,3,...n... . Линии пересечения: 12, ... 19, ... 34, ... . Если рассматривать только пары прямых ij,jk, они гарантированно лежат в одной плоскости, т.е. j. Их середина наименьших квадратов представляет собой линию, проходящую через точку их пересечения и находящуюся посередине угла между ними. Посмотрим, сможешь ли ты что-нибудь с этим сделать.   -  person Will Ness    schedule 14.03.2013
comment
@Уилл Несс: да, это правда. Но, честно говоря, я ищу другой способ сделать это с наименьшими квадратами. например, я нашел эту статью (в разделе 3): ipb. uni-bonn.de/uploads/tx_ikgpublication/heuel01.matching.pdf но, к сожалению, я не могу разобраться с основами.   -  person gnp    schedule 14.03.2013


Ответы (1)


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

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

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

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

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

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);
}
person Tocs    schedule 14.03.2013