0

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

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

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

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

enter image description here

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

+0

Это аналитическая геометрия вопрос, а не программирования вопрос. Я уверен, что в StackExchange есть более подходящие форумы, чтобы задать этот вопрос. –

+0

Это также кажется несколько сложным. Самолеты пересекаются в линиях, так как вы определяете свою дистанционную функцию? Точка ближайшего приближения двух трехмерных линий? – TheMathemagician

+0

Просто посыпьте несколько точек вдоль ваших прямых линий пересечения и вычислите наименьшие квадраты из точек. –

ответ

1

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

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

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

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

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

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); 
}