我的问题是当我的程序用户点击屏幕时我正在检索mouses坐标,我希望能够将这些坐标舍入到已经定义的坐标列表中的最近坐标(在这种情况下是一个列表)形状网格的所有中心点)
形状网格是六边形网格,其中心点在x轴上相距30个像素,在y轴上相距30个。
我如何围绕我的鼠标坐标到六边形最近的中心点? 感谢
答案 0 :(得分:3)
如果列表中的整数是随机放置的,那么您必须进行二进制搜索以获得正确的坐标。
否则,如果连续整数之间的差异是恒定的(如网格),则可以使用/(除法运算符)来找到正确的位置。
Eg, if list = [0, 2, 4, 6, 8, 10] and coord = 4.5,
index ~ int(coord / diff) = 2.
答案 1 :(得分:2)
听起来像kd-tree会帮助你:
k-d树是二叉树,其中每个节点都是k维点。每个非叶节点都可以被认为是隐式生成分裂超平面,该超平面将空间划分为两个部分,称为半空间。该超平面左侧的点由该节点的左子树表示,超平面右侧的点由右子树表示。超平面方向按以下方式选择:树中的每个节点都与k维度中的一个相关联,超平面垂直于该维度的轴。因此,例如,如果对于特定分割,选择“x”轴,则具有比节点小的“x”值的子树中的所有点将出现在左子树中,并且具有更大“x”值的所有点将是在正确的子树中。在这种情况下,超平面将由点的x值设置,其法线将是单位x轴。
并且,找到最近的邻居:
在k-d树中搜索最近邻居的过程如下:
- 从根节点开始,算法以递归方式向下移动树,其方式与插入搜索点时相同(即,它向左或向右移动,具体取决于点是否小于或大于拆分维度中的当前节点。)
- 一旦算法到达叶节点,它就将该节点保存为“当前最佳”
- 算法展开树的递归,在每个节点执行以下步骤:
- 如果当前节点比当前节点更接近,那么它将成为当前最佳节点。
- 该算法检查在分割平面的另一侧是否可能存在比当前最佳点更接近搜索点的任何点。在概念上,这通过使分裂超平面与搜索点周围的超球面相交来完成,该超球面具有等于当前最近距离的半径。由于超平面都是轴对齐的,因此将其实现为简单的比较,以查看搜索点的分割坐标与当前节点之间的差异是否小于从搜索点到当前最佳的距离(总坐标)。
- 如果超球面穿过平面,则平面另一侧可能有更近的点,因此算法必须从当前节点向下移动树的另一个分支,寻找更近的点,遵循相同的递归过程。整个搜索。
- 如果超球面不与分裂平面相交,则算法继续向上走树,并消除该节点另一侧的整个分支。
- 当算法完成根节点的此过程时,搜索就完成了。
醇>
答案 2 :(得分:0)
遍历列表并计算从您的点到列表中每个点的距离。距离为sqrt(sqr(x_mouse - x(i)) + sqr(y_mouse - y(i)))
。迭代时保存最小计算距离和相应的坐标。