0

我正在使用许多 3D 平面并为以下情况寻找最小二乘解决方案。

如果我有许多 3D 平面只知道一个点和法线向量(例如 O1 和 N1),并且所有这些平面彼此相交并形成几乎非常接近的 3d 线,那么如何计算最小二乘调整一个单个 3d 线来表示所有这些交叉点。

为了清楚起见,我插入了一个数字。

  • 已知:一个点和每个平面的法向量。
  • 查找:最小二乘拟合单 line3d

在此处输入图像描述

因为我想用 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 回答