C++ 按逆时针方向排序三维多边形顶点

C++ 按逆时针方向排序三维多边形顶点,c++,opengl,math,polygon,C++,Opengl,Math,Polygon,我必须找到一个多边形的法线,但为了做到这一点,我首先必须按逆时针方向排列顶点x,y,z。假设用户输入了n个顶点点,如何按逆时针方向排列顶点,使其变成多边形 见 要求点X,Y的角度,只需在任意/X处进行。以下是一些注意事项: 最后,按从低到高的顺序排列结果,将360个数字加成负数。请参阅 要求点X,Y的角度,只需在任意/X处进行。以下是一些注意事项: 最后,按从低到高的顺序排列结果,将360加成负数。在不知道正常值的情况下,不能对分数进行排序,反之亦然。如果你从前面说逆时针,那么你需要知道前面是哪

我必须找到一个多边形的法线,但为了做到这一点,我首先必须按逆时针方向排列顶点x,y,z。假设用户输入了n个顶点点,如何按逆时针方向排列顶点,使其变成多边形

要求点X,Y的角度,只需在任意/X处进行。以下是一些注意事项:

最后,按从低到高的顺序排列结果,将360个数字加成负数。

请参阅

要求点X,Y的角度,只需在任意/X处进行。以下是一些注意事项:


最后,按从低到高的顺序排列结果,将360加成负数。

在不知道正常值的情况下,不能对分数进行排序,反之亦然。如果你从前面说逆时针,那么你需要知道前面是哪一边,因此你需要知道法线。所以你的问题没有答案,因为它有点循环:你没有足够的信息来确定你在寻找什么

你需要更多的信息。例如,如果此多边形是凸面的一部分,则可以计算曲面的几何中心。然后在多边形上拾取任意3个非共线点a、b、c,计算法线a-b与c-b的交叉,计算从质心到其中一个点(例如b-质心)的向量,然后检查法线是否与法线点b-质心的向量符号方向相同或相反,如果方向错误,则将其翻转。基本上你只需要计算一个垂直的单位向量,有两个,记住,然后确保它指向你的物体的内部/外部

如果您的脸是凹面的一部分,则可以通过将法线的点积与相邻脸的法线相结合,并在其为负值时翻转法线,使所有法线指向相同的大致方向。您仍然需要确定确定面的哪一侧位于曲面的内侧与外侧,但至少所有法线都指向其中一个或另一个

如果你没有关于法线应该朝向的大致方向的信息,你必须从别处获取逆时针方向的信息。您可以围绕多边形中心对点进行排序,以使其有序,但要确定该顺序是顺时针还是逆时针,需要其他信息,例如询问用户等

请注意,基于atan的2D解决方案隐含地依赖于一些额外的信息:依赖于法线面向屏幕外/离开纸张并朝向您(观众)这一事实,因此您可以围绕该法线按已知方向排序。这种假设通常是在没有人真正提及的情况下做出的。然而,在现实中,你需要决定哪一面是正面和背面-对于3D来说并不总是那么容易如果你在屏幕上渲染并且你已经设置了一个视点,你可以使用它作为额外的信息-比如说法线面对相机,然后围绕法线排序

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

从正面看,缠绕顺序是什么? 两个垂直于平面的单位向量中,我们选择哪一个在前面,或者哪一边是前面? 与绕组顺序相对应的给定点的排序顺序是什么? 我们需要其中两个来确定第三个

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

在您经常看到的我上面提到的2D案例中,1被指定为一个需求,2被假定为面向查看器的一面,因此3可以通过atan和递增/递减顺序排序来确定


在你最初的问题中,你知道1你已经定义了它,但你不知道2哪一边是前面?,因此你无法确定3。你需要一些方法来确定2,例如,背向质心,面向观察者,等等。

你不能在不知道法线的情况下对点进行排序,反之亦然。如果你从前面说逆时针,那么你需要知道前面是哪一边,因此你需要知道法线。所以你的问题没有答案,因为它有点循环:你没有足够的信息来确定你在寻找什么

你需要更多的信息。例如,如果此多边形是凸面的一部分,则可以计算曲面的几何中心。然后在多边形上拾取任意3个非共线点a、b、c,计算法线a-b与c-b的交叉,计算从质心到其中一个点(例如b-质心)的向量,然后检查法线是否与法线点b的向量符号朝向相同或相反的方向- 质心和翻转它,如果它是错误的方式。基本上你只需要计算一个垂直的单位向量,有两个,记住,然后确保它指向你的物体的内部/外部

如果您的脸是凹面的一部分,则可以通过将法线的点积与相邻脸的法线相结合,并在其为负值时翻转法线,使所有法线指向相同的大致方向。您仍然需要确定确定面的哪一侧位于曲面的内侧与外侧,但至少所有法线都指向其中一个或另一个

如果你没有关于法线应该朝向的大致方向的信息,你必须从别处获取逆时针方向的信息。您可以围绕多边形中心对点进行排序,以使其有序,但要确定该顺序是顺时针还是逆时针,需要其他信息,例如询问用户等

请注意,基于atan的2D解决方案隐含地依赖于一些额外的信息:依赖于法线面向屏幕外/离开纸张并朝向您(观众)这一事实,因此您可以围绕该法线按已知方向排序。这种假设通常是在没有人真正提及的情况下做出的。然而,在现实中,你需要决定哪一面是正面和背面-对于3D来说并不总是那么容易如果你在屏幕上渲染并且你已经设置了一个视点,你可以使用它作为额外的信息-比如说法线面对相机,然后围绕法线排序

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

从正面看,缠绕顺序是什么? 两个垂直于平面的单位向量中,我们选择哪一个在前面,或者哪一边是前面? 与绕组顺序相对应的给定点的排序顺序是什么? 我们需要其中两个来确定第三个

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

在您经常看到的我上面提到的2D案例中,1被指定为一个需求,2被假定为面向查看器的一面,因此3可以通过atan和递增/递减顺序排序来确定


在你最初的问题中,你知道1你已经定义了它,但你不知道2哪一边是前面?,因此你无法确定3。你需要一些方法来确定2,例如背向质心,面向观众,等等。

试试这个-试试这个-谢谢,但我想我把我的问题描述错了。我没有点x,y,我有顶点x,y,z。这会有很大的不同吗?在三维空间中逆时针方向到底是什么?在任何情况下,取任意2点的叉积,得到一个正态,假设每个多边形是3个连接点,在3d空间中形成一个平面,中心位于原点。值得注意的是,这里的2D案例和许多基于2D atan的示例通常隐含地假设法线朝向平面外和观察者;因为从另一侧看,顺时针是逆时针的,即使在2D中,例如,想象拿着一张纸,上面画着一个点,对着一盏灯,从后面看,那么角度排序是相反的方向。这是一个很好的假设,但别忘了这是一个假设。谢谢,但我想我把我的问题描述错了。我没有点x,y,我有顶点x,y,z。这会有很大的不同吗?在三维空间中逆时针方向到底是什么?在任何情况下,取任意2点的叉积,得到一个正态,假设每个多边形是3个连接点,在3d空间中形成一个平面,中心位于原点。值得注意的是,这里的2D案例和许多基于2D atan的示例通常隐含地假设法线朝向平面外和观察者;因为从另一侧看,顺时针是逆时针的,即使在2D中,例如,想象拿着一张纸,上面画着一个点,对着一盏灯,从后面看,那么角度排序是相反的方向。这是一个很好的假设,但别忘了这是一个假设。除了前/后通常是根据绕组定义的。这样,光栅化器就可以在不知道法线的情况下确定多边形的哪一侧正在着色。由于光栅化发生在屏幕空间中,屏幕空间具有明确定义的轴,因此这是微不足道的。@AndonM.Coleman光栅化器所做的工作与精确法线没有直接关系,只与正面有关。此外,它与此无关,因为这个问题是关于确定给定任意点的绕组。光栅化器根据绕组假设正面是哪一侧,就像我们的常规计算假设正面是哪一侧一样
在绕组上进行焊接。光栅化器与我们这里的问题完全相同,它的额外信息是,假设某个绕组,并且正面朝向观察者。@AndonM.Coleman记住,我们这里要处理以下未知数光栅化器也有相同的问题:1。从正面看,缠绕顺序是什么?2.两个垂直于平面的单位向量中,我们选择哪一个在前面,或者哪一边是前面?3.与绕组顺序相对应的给定点的排序顺序是什么?我们需要其中两个来计算第三个。对于光栅化器,它定义1本身或从配置中获取,3由API要求假设,因此可以推断为2我指的是你的评论,即这个问题毫无意义。它在恰当的语境下有着完美的意义,正常的判断是不必要的。在OpenGL中,在投影并转换到屏幕空间后,根据沿Z轴向下看的图像平面的缠绕和默认情况下为表示正面CCW而建立的缠绕来确定正面。@AndonM.Coleman我明白你的意思,但问题本身是有意义的,我本不该那样说的——措辞很糟糕。我编辑了那部分。我的意思是,这与a+b=c和c=3没有任何意义,我如何找到a?没有意义。除了前/后通常是根据绕组定义的。这样,光栅化器就可以在不知道法线的情况下确定多边形的哪一侧正在着色。由于光栅化发生在屏幕空间中,屏幕空间具有明确定义的轴,因此这是微不足道的。@AndonM.Coleman光栅化器所做的工作与精确法线没有直接关系,只与正面有关。此外,它与此无关,因为这个问题是关于确定给定任意点的绕组。光栅化器根据绕组对正面的哪一侧进行假设,就像我们的常规计算根据绕组对正面的哪一侧进行假设一样。光栅化器与我们这里的问题完全相同,它的额外信息是,假设某个绕组,并且正面朝向观察者。@AndonM.Coleman记住,我们这里要处理以下未知数光栅化器也有相同的问题:1。从正面看,缠绕顺序是什么?2.两个垂直于平面的单位向量中,我们选择哪一个在前面,或者哪一边是前面?3.与绕组顺序相对应的给定点的排序顺序是什么?我们需要其中两个来计算第三个。对于光栅化器,它定义1本身或从配置中获取,3由API要求假设,因此可以推断为2我指的是你的评论,即这个问题毫无意义。它在恰当的语境下有着完美的意义,正常的判断是不必要的。在OpenGL中,在投影并转换到屏幕空间后,根据沿Z轴向下看的图像平面的缠绕和默认情况下为表示正面CCW而建立的缠绕来确定正面。@AndonM.Coleman我明白你的意思,但问题本身是有意义的,我本不该那样说的——措辞很糟糕。我编辑了那部分。我的意思是,这与a+b=c和c=3没有任何意义,我如何找到a?没有道理。