2013-02-27 69 views
1

我在3D中有一个凸多边形。为了简单起见,让它成为带顶点的正方形,(0,0,0),(1,1,0),(1,1,1),(0,0,1).。我需要按逆时针顺序排列这些顶点。我找到了一个解决方案here。建议确定多边形中心的角度并对其进行分类。我不清楚这是如何工作的。有没有人有办法解决吗?我需要一个解决方案,即强大的,甚至在顶点非常接近时工作。在MATLAB中逆时针方向排列三维凸多边形平面的顶点

MATLAB代码示例将非常感谢!

+0

我将实施导数分析,但你怎么能由2D参数整理一些东西(即顺时针方向)时,他们在三维空间中存在吗? – tmwoods 2013-02-27 04:10:52

+0

点在3D空间中,但在飞机上。我只需要订购 - 顺时针或逆时针。 – 2013-02-27 04:13:47

+0

我的不好,在标题中没有看到。我是白色的,我会让你知道,如果我拿出一些不涉及旋转矩阵的固体(这可能是屁股中最强壮但最大的痛苦)。 – tmwoods 2013-02-27 04:15:00

回答

1

以下是我遵循的步骤。

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

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

  3. 使用X轴作为参考轴,角度,在一个02pi刻度,为每个顶点可使用atan2功能所解释here来计算。

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

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

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

1

这实际上是一个相当乏味的问题,所以不是实际做这件事,我只是想解释我该怎么做。首先find the equation of the plane(你只需要使用3分),然后找到你的rotation matrix。然后在你的新的旋转空间中找到你的向量。之后,所有的说法和完成find which quadrant你的观点是,如果n> 1在一个特定的象限,那么你必须找到每个点的角度(theta = arctan(y/x))。然后,简单地按照它们的角度对每个象限进行排序(可以说,你可以通过pi而不是象限来进行分离(当y分量(后旋转)大于零时将点分类)。有时间实际测试这个,但给它一个去,并随时发布您的代码,我可以帮助调试,如果你喜欢。

+0

谢谢!你的意见给了我一些想法。我的解决方案基于您对旋转飞机的评论。毕竟这并不困难。 – 2013-02-28 06:46:14

+0

没问题,很高兴大学的所有数学帮助某人。您应该详细说明您的答案并将其标记为已解决:) – tmwoods 2013-02-28 14:03:45

1

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

0

这是很长一段时间,因为我用这个,所以我可能是错的,但我相信命令convhull做你所需要的 - 它返回一组点的凸包(它,因为你说你的点是一个凸集,应该是本身的一组点),按逆时针顺序排列。

请注意,MathWorks最近发布了一个新类DelaunayTri,该类旨在取代convhull和其他较旧的计算几何元素的功能。我相信这更准确,尤其是当积分变得非常接近时。但是我没有尝试过。

希望有帮助!

+0

如果多边形是2D,则您提到的功能将起作用。对于我的问题他们不会。 – 2013-02-28 06:44:29

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。

如果您的多边形的平面与某个轴正交,您可能需要做一些工作才能选取正确的坐标,如果是,请选择该轴。标准是确保您的投影点不会排在最后。

相关问题