我正在使用许多3D平面并寻找一种最小二乘解决方案。
如果我有很多3D飞机知道只有一个点和 法向量(例如,O1和N1),以及所有这些平面相互交叉 其他和几乎非常接近的3d线,然后如何计算 最小二乘调整一条单线来表示所有这些 交叉点。
为了清楚明白,我插入了一个数字。
因为我想用c ++做这个,我也使用c ++标签。
答案 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);
}