0

私は多くの 3D 平面で作業しており、以下のケースの最小二乗ソリューションを探しています。

1 つの点と法線ベクトル (O1 と N1 など) だけを知っている 3D 平面が多数あり、それらすべての平面が互いに交差し、ほぼ非常に近い 3D 線を作成する場合、最小二乗調整された線を計算する方法これらすべての交点を表す 1 本の 3D 線。

明確なアイデアを得るために、図を挿入しました。

  • 既知: 1 つの点と各平面の法線ベクトル。
  • 検索: 最小二乗法によるシングル ライン 3d

ここに画像の説明を入力

これをc++でやりたいので、c++タグも使います。

4

1 に答える 1

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);
}
于 2013-03-14T15:13:01.063 に答える