Math 按顺时针或逆时针方向排序三维共面点列表

Math 按顺时针或逆时针方向排序三维共面点列表,math,geometry,linear-algebra,Math,Geometry,Linear Algebra,我有一个3D点列表。我知道它们都是共面的。我有一个中心,我想对它们进行排序,还有点和中心所在平面的法线。如何测试一个点是否位于另一个点的右侧(或左侧) 我知道如何在2D中完成它。说明如何比较二维点。所以我想我需要以某种方式将所有的点和中心转换成局部的二维平面坐标。我该怎么做?这是解决这个问题最有效的方法吗 //from link: // a and b are points //center is the center around which to determine order //int

我有一个3D点列表。我知道它们都是共面的。我有一个中心,我想对它们进行排序,还有点和中心所在平面的法线。如何测试一个点是否位于另一个点的右侧(或左侧)

我知道如何在2D中完成它。说明如何比较二维点。所以我想我需要以某种方式将所有的点和中心转换成局部的二维平面坐标。我该怎么做?这是解决这个问题最有效的方法吗

//from link:
// a and b are points
//center is the center around which to determine order
//int num = (a.x-center.x) * (b.y-center.y) - (b.x - center.x) * (a.y - center.y);
//if num=0 then they're on the same line
//if num <0 or num>0 then a is to the left or right of b
//从链接:
//a和b是点
//中心是确定顺序的中心
//int num=(a.x-center.x)*(b.y-center.y)-(b.x-center.x)*(a.y-center.y);
//如果num=0,则它们在同一行上
//如果数值为0,则a位于b的左侧或右侧

我如何调整它以处理三维共面点?

无需将所有内容都转换为二维


你有中心C和正常n。要确定点B相对于点A是顺时针还是逆时针,请计算点(n,交叉点(A-C,B-C))。如果结果为正,则B为A的逆时针方向;如果是负数,B是从A开始的顺时针方向。

“顺时针”在3D中没有任何意义,因为它取决于你看平面的方式。翻转平面,突然顺时针方向变成逆时针方向。@woodchips这个问题不是3D独有的。并非所有二维坐标系的定义方式都相同。在这两种情况下,你只需要定义“顺时针”的含义。我明白你的意思,知道这是件好事。你认为指定平面的法线方向会消除这个问题吗?顺时针现在对我来说也不是很重要,但我仍然需要将点按一致的方向排列。是的,如果你指定法线方向,那么这将给你一个一致的顺时针定义。我如何得到a和B之间的角度?我添加了这个,但它似乎太复杂了:
符号(点(n,交叉(A-C,B-C))*cos^{-1}{dot(A-C,B-C)/(| A-C | u2*| B-C | u2)}
@stephanmg:是的,这似乎太复杂了。我可能会定义两个新的向量
CA=A-C;CB=B-C;
,将
CA/=| CA | CB/=| CB | CB | CB | |
标准化,然后使用。谢谢。我原以为我想使用atan2,但人们担心使用atan2。为什么?我没能很快找到一个令人信服的论点。@stephanmg:e与C共线?(显然A和B总是共线。)如果是,那么结果是零,我认为这是正确的答案;在这种情况下,B与A既不是顺时针的,也不是逆时针的。(或者两者都是,如果你喜欢。)贝塔:谢谢你的建议,似乎通过数学再次帮助发现了问题。