【问题标题】:Sorting a List of 3d coplanar points to be clockwise or counterclockwise将 3d 共面点列表排序为顺时针或逆时针
【发布时间】:2012-12-31 11:50:51
【问题描述】:

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

我了解如何在 2D 中进行操作。 Sort points in clockwise order? 解释了如何比较二维点。所以我认为我需要以某种方式将所有点和中心转换为局部二维平面坐标。我怎样才能做到这一点?这是解决这个问题最有效的方法吗?

//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

如何调整它以处理 3d 共面点?

【问题讨论】:

  • “顺时针”在 3-d 中没有任何意义,因为它取决于你看飞机的方式。把飞机翻过来,突然顺时针变成了逆时针。
  • @woodchips 这个问题并不是 3-d 独有的。并非所有二维坐标系都以相同的方式定义。在这两种情况下,您只需要定义“顺时针”的含义。
  • 我明白你在说什么,知道这是件好事。你认为指定飞机的法线方向会解决这个问题吗?顺时针现在对我来说也没什么意义,但我仍然需要以一致的方向对点进行排序。
  • 是的,如果你指定法线方向,那么这会给你一个顺时针的一致定义。

标签: math geometry linear-algebra


【解决方案1】:

无需将所有内容都转换为 2D。

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

【讨论】:

  • 如何获得 A 和 B 之间的角度?我添加了这个,但它似乎太复杂了:sign(dot(n, cross(A-C, B-C)) * cos^{-1} { dot(A-C, B-C) / (|| A-C||_2 * ||B-C||_2) }
  • @stephanmg:是的,这似乎过于复杂了。我可能会定义两个新向量CA=A-C; CB=B-C;,标准化CA/=||CA||; CB/=||CB||;,然后使用atan2
  • 谢谢。我以为我想使用 atan2,但是人们担心使用 atan2。为什么?我无法很快找到一个令人信服的论点。
  • @stephanmg:你的意思是A和B与C共线吗? (显然 A 和 B 总是共线的。)如果是这样,那么结果为零,我认为这是正确的答案;在这种情况下,B 既不是顺时针方向也不是逆时针方向 A。(或两者,如果你愿意。)
  • 测试版:感谢您的建议,看来重新计算数学有助于发现问题。
猜你喜欢
  • 2018-06-05
  • 2021-11-05
  • 2012-12-11
  • 2012-03-17
  • 1970-01-01
  • 2011-10-16
  • 1970-01-01
  • 2012-10-29
  • 1970-01-01
相关资源
最近更新 更多