我想写一个函数,它返回最接近某个点p的三角形网格(由等边三角形,基本宽度为w,平行于OX轴)的最近网格节点(作为一个点)。网格从点开始。函数签名应如下所示:
def snapToGrid(p,w,s):
...
为exapmle snapToGrid([0.49,0],0.5,[0.0])== [0.5,0]
任何想法如何开始?
答案 0 :(得分:2)
编辑: 这个答案是在知道三角形网格要动态计算之前,我现在就把它留下来,因为它可能会有所帮助,但它对动态点生成没有帮助。
我相信动态生成点的答案将依赖于找到三角形的高度,然后意识到节点将只存在于该三角形高度的倍数处。
这应该照顾您的X
组件。
查找三角形的宽度也会告诉您节点沿Y
轴出现的倍数,但是,每隔一行三角形的节点将位于三角形宽度的1/2处。
找到远离原点的行数,原始点将是第一步。
这反过来会让您知道是使用triangle width
作为Y
坐标倍,还是triangle width+1/2 triangle width
作为Y
乘数。
使用这两个值,您应该很容易找到距离您的点最近的n*height
和n*width
组合。
对于文本墙感到抱歉,如果您在纸上绘制网格,您将看到三角形沿X
轴和列(对于even rows
)和半列形成一排节点(对于odd rows
)。
当找到最近的点时,网格的类型/形状通常无关紧要。从逻辑上讲,你最接近的点将属于你的点所在的形状。所以为了简化你需要做的就是找到离你最近的点,这是一个非常简单的问题。
这似乎最容易通过使用K-D Tree找到,其中分割点是网格的X
和Y
坐标。然后,简单的二进制搜索将显示与您输入的坐标最近的网格点。
链接文章包含K-D树操作的伪代码。
您还可以将字典映射到X
坐标,每个值都包含与y:name
坐标对应的X
对字典。
这将允许您以下列方式搜索节点:
coordinate_x[<xvale>][<yvalue>]
然后将返回您要查找的节点,以获取xvalue
和yvalue
,只需通过字典键进行最近的搜索,例如:
for x in coordinate_x.keys():
if x-point_x < min:
make x-point the closest
答案 1 :(得分:-1)
除其他外,这得到了解答 Math-S.E上的“ J. M.不是数学家”。
这是答案的屏幕截图(2018年9月)
此外,在对原始问题的评论中,同一用户引用了另一个站点:http://www.geom.uiuc.edu/docs/reference/CRC-formulas/node7.html此页面描述了更常见情况的解决方案。