我在3D中有一个凸多边形。为简单起见,让它成为一个带顶点的正方形(0,0,0),(1,1,0),(1,1,1),(0,0,1).
。我需要按逆时针顺序排列这些顶点。我找到了一个解决方案here。建议确定多边形中心的角度并对其进行排序。我不清楚这是怎么回事。有没有人有办法解决吗?我需要一个健壮的解决方案,甚至在顶点非常接近时也能正常工作。
非常感谢MATLAB代码示例!
答案 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)
以下是我遵循的步骤。
可以使用已知的formulas将3D平面多边形旋转到2D平面。使用从轴和角度旋转矩阵部分下的一个。
然后如@Glenn所示,需要计算内部点以找到角度。我将该内部点作为顶点位置的mean
。
使用x轴作为参考轴,可以使用0
函数计算每个顶点的2pi
到atan2
刻度上的角度{ {3}}
从矢量a到矢量b逆时针测量的非负角度,范围[0,2pi]
,如果a = [x1,y1]
和b = [x2,y2]
,则由下式给出:
angle = mod(atan2(y2-y1,x2-x1),2*pi);
最后,对角度[~,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。
如果多边形的平面与某个轴正交,则可能需要做一些工作来选择正确的坐标,如果是,则选择该轴。标准是确保您的预测点不会在一条线上结束。