在MATLAB中以逆时针方向排列3D凸多边形平面的顶点

时间:2013-02-27 04:02:20

标签: matlab polyhedra

我在3D中有一个凸多边形。为简单起见,让它成为一个带顶点的正方形(0,0,0),(1,1,0),(1,1,1),(0,0,1).。我需要按逆时针顺序排列这些顶点。我找到了一个解决方案here。建议确定多边形中心的角度并对其进行排序。我不清楚这是怎么回事。有没有人有办法解决吗?我需要一个健壮的解决方案,甚至在顶点非常接近时也能正常工作。

非常感谢MATLAB代码示例!

5 个答案:

答案 0 :(得分:1)

这实际上是一个非常繁琐的问题,所以我只是要解释我是怎么做的。首先find the equation of the plane(你只需要使用3分),然后找到你的rotation matrix。然后在新的旋转空间中找到您的向量。在那之后,所有人都说完了find which quadrant,你的观点就在了,如果n> 1在特定的象限中,你必须找到每个点的角度(theta = arctan(y / x))。然后简单地按照它们的角度对每个象限进行排序(可以说你可以用pi而不是象限进行分离(在y分量(后旋转)大于零时对点进行排序)。

抱歉,我没有时间对此进行实际测试,但请随意发布您的代码,如果您愿意,我可以帮助调试。

答案 1 :(得分:1)

幸运的是,你有一个凸多边形,所以你可以使用角度技巧:在内部找到一个点(例如,找到两个非相邻点的中点),并向所有顶点绘制矢量。选择一个矢量作为基础,计算与其他矢量的角度并对其进行排序。您可以使用点积计算角度:A·B = A Bcosθ= | A || B | cosθ。

答案 2 :(得分:1)

以下是我遵循的步骤。

  1. 可以使用已知的formulas将3D平面多边形旋转到2D平面。使用从轴和角度旋转矩阵部分下的一个。

  2. 然后如@Glenn所示,需要计算内部点以找到角度。我将该内部点作为顶点位置的mean

  3. 使用x轴作为参考轴,可以使用0函数计算每个顶点的2piatan2刻度上的角度{ {3}}

    从矢量a到矢量b逆时针测量的非负角度,范围[0,2pi],如果a = [x1,y1]b = [x2,y2],则由下式给出:

    angle = mod(atan2(y2-y1,x2-x1),2*pi);

  4. 最后,对角度[~,XI] = sort(angle);进行排序。

答案 3 :(得分:0)

我使用它已经很长时间了,所以我可能错了,但我相信命令convhull可以满足您的需求 - 它会返回一组点的凸包(因为你说你的点是凸集,应该是点集自身),按逆时针顺序排列。

请注意,MathWorks最近提供了一个新类DelaunayTri,旨在取代convhull和其他旧计算几何内容的功能。我相信它更准确,特别是当积分非常接近时。但是我还没试过。

希望有所帮助!

答案 4 :(得分:0)

所以这是另一个答案,如果你想使用convhull。通过将一个坐标设置为零,可以轻松地将多边形投影到轴平面中。例如,在(0,0,0),(1,1,0),(1,1,1),(0,0,1)中设置y = 0得到(0,0),(1, 0),(1,1),(0,1)。现在您的问题是2D。

如果多边形的平面与某个轴正交,则可能需要做一些工作来选择正确的坐标,如果是,则选择该轴。标准是确保您的预测点不会在一条线上结束。