三角形网格中的最近点

时间:2012-01-09 10:51:22

标签: python computational-geometry

我想写一个函数,它返回最接近某个点p的三角形网格(由等边三角形,基本宽度为w,平行于OX轴)的最近网格节点(作为一个点)。网格从点开始。函数签名应如下所示:

def snapToGrid(p,w,s):
    ...

为exapmle     snapToGrid([0.49,0],0.5,[0.0])== [0.5,0]

任何想法如何开始?

2 个答案:

答案 0 :(得分:2)

编辑: 这个答案是在知道三角形网格要动态计算之前,我现在就把它留下来,因为它可能会有所帮助,但它对动态点生成没有帮助。

我相信动态生成点的答案将依赖于找到三角形的高度,然后意识到节点将只存在于该三角形高度的倍数处。
这应该照顾您的X组件。

查找三角形的宽度也会告诉您节点沿Y轴出现的倍数,但是,每隔一行三角形的节点将位于三角形宽度的1/2处。
找到远离原点的行数,原始点将是第一步。

这反过来会让您知道是使用triangle width作为Y坐标倍,还是triangle width+1/2 triangle width作为Y乘数。

使用这两个值,您应该很容易找到距离您的点最近的n*heightn*width组合。

对于文本墙感到抱歉,如果您在纸上绘制网格,您将看到三角形沿X轴和列(对于even rows)和半列形成一排节点(对于odd rows)。


当找到最近的点时,网格的类型/形状通常无关紧要。从逻辑上讲,你最接近的点将属于你的点所在的形状。所以为了简化你需要做的就是找到离你最近的点,这是一个非常简单的问题。

这似乎最容易通过使用K-D Tree找到,其中分割点是网格的XY坐标。然后,简单的二进制搜索将显示与您输入的坐标最近的网格点。

链接文章包含K-D树操作的伪代码。


您还可以将字典映射到X坐标,每个值都包含与y:name坐标对应的X对字典。

这将允许您以下列方式搜索节点:

coordinate_x[<xvale>][<yvalue>]
然后

将返回您要查找的节点,以获取xvalueyvalue,只需通过字典键进行最近的搜索,例如:

for x in coordinate_x.keys():
    if x-point_x < min:
        make x-point the closest

答案 1 :(得分:-1)

除其他外,这得到了解答 Math-S.E上的“ J. M.不是数学家”。

https://math.stackexchange.com/questions/62581/convert-coordinates-from-cartesian-system-to-non-orthogonal-axes

这是答案的屏幕截图(2018年9月)

enter image description here

此外,在对原始问题的评论中,同一用户引用了另一个站点:http://www.geom.uiuc.edu/docs/reference/CRC-formulas/node7.html此页面描述了更常见情况的解决方案。