首页 > 解决方案 > 如何确定二维空间数据中点的方向并以顺时针方式排列[对于极端情况]?

问题描述

本质上,我有空间数据,其中我遍历每个点并找出某个半径的圆内的周围点是什么。然后,我想以顺时针方式排列这些点,并且我设法在“大多数”情况下做到了这一点。该数据的独特之处在于,只有 6 个最大可能位置可以围绕任何中心点,以及我如何定义圆的半径[top-left, top-right, right, bottom-right, bottom-left, left]

所以作为样本数据

Center Point: 161.3861 368.8119

     col      row
1 164.5365 363.4114
2 155.2205 368.7669
3 167.5968 368.8569
4 158.2358 374.1674
5 164.4465 374.2124
6 158.3258 363.3663

然后该函数将输出[4, 5 ,3, 1, 6, 2]顺时针顺序。这个数据的子样本 [以红色突出显示,中心保持黑色] 看起来像这样。[要清楚我有这个案例工作]

在此处输入图像描述

但是您可以想象,对于各种极端情况来说,这并不完全简单。例如,在下面的情况下,它的右侧没有任何意义,因此在最终的输出数组中,我之前描述的数组的“右、右上、左上”索引中应该有一个零。

在此处输入图像描述

我正在努力的是一种系统的方法来处理极端情况并将标签分配给缺失的点。我尝试使用点积方法来量化这些点彼此之间的接近程度(使用垂直向上的法线向量),但这会导致区分右上角的问题。我想检查一条线是否通过该点,我们可以了解该点存在于哪个轴上,但我还没有设法使它工作。总结两个主要的极端情况是

  1. 边缘点
  2. 岛点

标签: ralgorithmspatialcomputational-geometry

解决方案


给定点和中心点,您可以编写一个函数来告诉您点所在的方向:

伪代码:

direction_vector = point - center_point
angle = atan2(direction_vector.y, direction_vector.x)
direction_index = ((angle * 12 / TWO_TIMES_PI) + 12) % 12

这将为您提供一个从 0 到 11 的索引(想象 bizarro 钟面上从 0 开始逆时针方向移动的小时,右侧为 0,而 3 点钟在正常时钟上)。

现在将其映射到您的方向上,1 位于左上角,2 位于右上方,3 位于右上方,依此类推:

direction_index = (((16 - x) // 2) % 6) + 1

其中 // 是整数除法,% 是模数。

现在您有了方向,从 1 迭代到 6 并输出具有相应方向索引的点的数组索引,如果没有,则输出 0(假设基于 1 的数组索引)。


推荐阅读