按逆时针方向对3D多边形顶点进行排序

时间:2014-04-10 04:51:42

标签: c++ opengl math polygon

我必须找到多边形的法线,但为了做到这一点,我首先必须按逆时针方向对顶点(x,y,z)进行排序。假设我给出了用户输入的n个顶点数,如何按逆时针方向对顶点进行排序以将它们变成多边形?

2 个答案:

答案 0 :(得分:9)

您不能在不知道正常情况下订购积分,反之亦然。如果你说“从前面逆时针方向”那么你需要知道前方是哪一侧,因此你需要知道正常情况。所以你的问题没有答案,因为它有点循环:你没有足够的信息来确定你在寻找什么。

您需要更多信息。例如,如果此多边形是凸面的一部分,则可以计算曲面的几何中心。然后在多边形上选择任意3个非共线点 a,b,c ,计算法线(范数((a - b)交叉(c - b))) ,计算从质心到你的一个点的向量(例如 b - 质心),然后检查法线是否面向与该向量相同(或相反,无论如何)的方向(的符号)普通点(b - 质心))并且如果它是错误的方式则翻转它。基本上你只是计算一个垂直单位向量(有两个,记得),然后确保它指向你对象的内部/外部。

如果你的脸是凹面的一部分,你可以通过将法线的点积与相邻面的法线相乘,使所有法线指向相同的大致方向,如果它是负的,则将其翻转。你仍然需要决定一种方法来确定脸的哪一侧在内侧与外侧之间,但至少所有法线都指向一个或另一个。

如果您没有关于正常应该面对的大致方向的信息,您将必须从其他地方获取逆时针信息。您可以对多边形中心周围的点进行排序以使它们按顺序排列,但要确定该顺序是顺时针还是逆时针需要其他信息(例如询问用户等)。

请注意,基于 atan 的2D解决方案隐含地依赖于一些额外的信息:依赖于法线面向屏幕/纸张以及朝向您,观看者和因此,您可以围绕该法线进行已知方向排序。这种假设通常是在没有任何人真正说过它的情况下做出的。但是,实际上,您需要确定哪一侧是前方和后方 - 对于3D来说并不总是那么容易(如果您正在渲染到屏幕并且设置了视点,则可以将其用作额外信息 - 比如说正常面向相机,然后围绕正常顺序)。


另一种表达上述内容的方法是,一般来说,我们有3个未知数:

  1. 从“前方”看时的绕线顺序是什么?
  2. 我们选择将哪个两个垂直单位矢量放在“前面”“哪一边是前面”?
  3. 与缠绕顺序对应的给定点的排序顺序是什么?
  4. 我们需要有两个来确定第三个。

    回应Andon的评论如下:对于光栅化器,它定义#1本身(或从配置中获取),#3由API要求假设,因此可以推断出#2。

    在您经常看到的2D情况(我在上面提到过)中,#1被指定为要求,#2被假定为“面向观察者的一侧是前方”,因此#3可以是用atan确定并按递增/递减顺序排序。

    在您的原始问题中,您知道#1(您已定义它),但您不知道#2(哪一侧是前方?),因此您无法确定#3。您需要一些方式来确定#2(例如,背离质心,面向观众,无论如何)。

答案 1 :(得分:0)

请参阅atan

要查找点(X,Y)的角度,您只需要atan(Y/X)。以下是一些警告:

http://upload.wikimedia.org/math/5/7/1/571efb70f630041f9e2b00019025171e.png Atan domains

最后,将结果从最低到最高排序(将负数加到360)。