【问题标题】:Round Coordinates to the closest coordinate in a list将坐标舍入到列表中最近的坐标
【发布时间】:2014-03-04 12:14:30
【问题描述】:

我的问题是,当我的程序的用户单击屏幕时,我正在检索鼠标坐标,并且我希望能够将这些坐标四舍五入到已定义的坐标列表中最近的坐标(在本例中是一个列表形状网格的所有中心点)

形状网格是六边形网格,其中心点在 x 轴上相距 30 个像素,在 y 轴上相距 30 个像素。

如何将鼠标坐标四舍五入到最近的六边形中心点? 谢谢

【问题讨论】:

  • 一维,这就是简单的二分查找
  • 在 2 中? (如 x 和 y 坐标?)
  • 我可以做 2 次二进制搜索吗?一个查找最近的行,另一个查找最近的列?
  • 我在图像查看器github.com/dov/giv 中解决了这个问题,方法是创建与原始图像相同大小的第二个矩阵,而不是每个像素的颜色包含“标签”,一个整数对应于blob-id。
  • “将整数舍入到列表中最接近的整数”与您要解决的问题是一个相当不同的问题,我不确定解决方案(这将是一个简单的二进制搜索)会对你有很大帮助,这让我想知道如果你不确定如何将两者联系起来,你为什么要问这个问题而不是寻求实际问题的帮助。顺便说一句 - 我试图回答我认为你应该问的问题以及你想要回答的问题,但也许你在某个地方把我弄丢了。

标签: c++ algorithm list rounding


【解决方案1】:

如果列表中的整数是随机放置的,则必须对正确的坐标进行二分搜索。

否则,如果连续整数之间的差异是恒定的(如网格),那么您可以使用/(除法运算符)找到正确的位置。

Eg, if list = [0, 2, 4, 6, 8, 10] and coord = 4.5,
     index ~ int(coord / diff) = 2.

【讨论】:

  • @JabbaWook 是的,那么你可以使用 (coord-leftmostCoord)/30
  • @JabbaWook 得到索引后,可以检查边界条件,检查左边界索引是更近还是右边界(对于4.5,是list[2]更近还是list[3] )
【解决方案2】:

听起来kd-tree 可以帮助您:

k-d 树是一棵二叉树,其中每个节点都是一个 k 维点。每个非叶节点都可以被认为是隐式生成一个分裂超平面,将空间分成两部分,称为半空间。该超平面左侧的点由该节点的左子树表示,超平面右侧的点由右子树表示。超平面方向的选择方式如下:树中的每个节点都与 k 维之一相关联,超平面垂直于该维的轴。因此,例如,如果对于特定的拆分选择“x”轴,则子树中“x”值小于节点的所有点都将出现在左子树中,并且所有“x”值较大的点将在右子树中。在这种情况下,超平面将由该点的 x 值设置,其法线将是单位 x 轴。

并且,要找到最近的邻居:

在 k-d 树中搜索最近邻的过程如下:

  1. 从根节点开始,算法以递归方式沿树向下移动,与插入搜索点时的方式相同(即,它向左或向右移动取决于该点是小于还是大于分割维度中的当前节点)。
  2. 一旦算法到达叶节点,它就会将该节点点保存为“当前最佳”
  3. 算法展开树的递归,在每个节点执行以下步骤:
    1. 如果当前节点比当前最佳节点更接近,则它成为当前最佳节点。
    2. 算法检查分割平面的另一侧是否有任何点比当前最佳点更靠近搜索点。在概念上,这是通过将分割超平面与围绕搜索点的超球面相交来完成的,该超球面的半径等于当前最近距离。由于超平面都是轴对齐的,因此这是一个简单的比较,以查看搜索点和当前节点的分割坐标之间的差异是否小于搜索点到当前最佳点的距离(整体坐标)。
      1. 如果超球面穿过平面,则平面的另一侧可能有更近的点,因此算法必须从当前节点向下移动树的另一个分支以寻找更近的点,遵循与以下相同的递归过程整个搜索。
      2. 如果超球面不与分割平面相交,则算法将继续向上遍历树,并消除该节点另一侧的整个分支。
  4. 当算法完成对根节点的这个过程时,搜索就完成了。

【讨论】:

    【解决方案3】:

    遍历列表并计算从您的点到列表中每个点的距离。距离为sqrt(sqr(x_mouse - x(i)) + sqr(y_mouse - y(i)))。迭代时保存计算的最小距离和对应的坐标。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-17
      • 1970-01-01
      相关资源
      最近更新 更多