点与高度图之间的距离

时间:2014-07-13 00:46:51

标签: algorithm 3d language-agnostic geometry distance

给定3D点和heightmap(高程数据的光栅图像),如何快速确定高度图和点之间的距离?

enter image description here

测量到高度图上每个点的距离的天真方法有效,但需要太长时间。

当然,有很多通用算法可以加速点云与点之间的最近邻搜索,例如k-d tree

是否有一种算法更适合高度图的特定情况,在每个查询的性能方面,或在查询之前准备必要的数据结构的性能?

理想情况下,我在寻找一种不需要从整个高度图数据中构造树的算法。看来应该有一些方法可以使用点已经在高度图中的X和Y方向排序的事实。

1 个答案:

答案 0 :(得分:1)

以下两个想法都假设您的查询点P是"直接位于"高度图 - 也就是说,从高度图平面到P的法线与实际包含高度图的区域相交。如果它没有,那么我建议测量到高度图的4个边缘中每个边缘上最近点的距离,并取最小值。我还没有想过下面的两个想法是否仍会在这个(常见的)情况下给出确切的答案,但可能会说服它们。

首先,找到位于P正下方的高度图平面上的点Q(即,从高度图的平面到P的法线在Q处与平面相交)。让高度图表面上的点,在高于Q的高度(Q)处为R.然后,从P到高度图中任意点的距离上限U由P和R之间的距离给出,这就是距离(P,Q) - 身高(Q)。

在下文中,我将调用高度图平面中位于"下的" "顶边" A的一些高度图像素A与A的 base 的关系。例如, Q是R的基础。

当P接近高度图表面

在这种情况下,U会很小,你可以使用这样一个事实,即任何高于P的高度图点都不能在高度图平面上比U远离Q.(想想一个半径为U的球)以P为中心:这只是接触R,任何比R更接近P的点必须在它内部。)因此,当寻找比R更接近的点时,你可以限制自己只测试(2U)x(2U)矩形高度图"像素"以Q为中心(或者实际上只是以Q为中心的高度图像素的半径-U盘 - 但这只能保存适度的比较恒定因子,并且由于更复杂的循环条件,实际上可能会更慢。)

警告:这不考虑4"侧墙"每个高度图像素。例如。假设高度图像素的大小为1x1单位,R高度为5,P高于R 3个单位,高度为100的高度图像素位于R的左侧,所有其他高度图像素的高度为0:则距离最小距离为0 P到高度图可以被认为是1,因为如果你从P开始并直接向左移动1个单位,你就会击中东部"墙"支持S.但上面的算法将报告距离是3,因为它只考虑"顶边"每个高度图像素,并且S的上边缘远远落后于P.

当P很远时

在这种情况下,任何高度图点与P之间的角度都不起作用;一个点是否接近P取决于它的高度,而不是取决于它在高度图平面中它的基数和Q之间的距离。因此,我建议保留高度图点的副本按其高度按降序排序。然后,您可以按照降低的高度顺序计算P与该列表中的每个点A之间的距离,停止一次高度(A)<高度(Q),因为列表中任何剩余的点B,其高度必须更低,必须至少与R一样远离P,因为线BP处于某个非零角度。

事实上,一个稍微复杂的停止标准是可能的:在遍历点列表的任何时候,你可以中止这个过程并交换以检查高度图平面中的基数比Q更接近Q的所有点。最近考虑的一点。 IOW,假设您正在以降低的高度顺序浏览高度图点列表,并且到达A点,其基点与Q的距离为D:那么距离P最近的点是您到目前为止找到的最近点,或者在高度图平面中的基点离Q最远距离D的最近点。这可以通过搜索以Q为中心的高度图像素的(2D)x(2D)网格来找到,类似于&#下发生的情况。 34;当P接近高度图表面"。这在R恰好很深的情况下是有用的,否则需要按递减顺序检查几乎所有其他高度图点。当然如果R在一个宽阔的深谷中,那么找到任何足够接近的A需要很长时间,然后每个或几乎每个点都会被测试。