Dimensions 高维等值面跟踪

Dimensions 高维等值面跟踪,dimensions,dimensional,Dimensions,Dimensional,如何在高维空间有效地追踪等值面在N维空间中有一个标量代价函数 f(y0,y1,…,yN)∊ ℝ, Y∊ ℝ 但仅在常规矩形网格中采样 yk=ψk+ψk xk,常数ψk∊ ℝ 和ψk∊ ℝ, 和网格坐标xk∊ ℕ 问题是定位等值面i f(y0,y1,…,yN)=Ci 直接的方法是在网格中的每个单元上循环,检查当前等值面是否与当前单元相交,如果相交,则描述当前单元内的等值面部分。(移动立方体是描述等值面如何与每个栅格单元相交的一种方法。) 这里的限制是使用基于邻域的搜索,而不是检查每个单元格 OP

如何在高维空间有效地追踪等值面

在N维空间中有一个标量代价函数

f(y0,y1,…,yN)∊ ℝ, Y∊ ℝ

但仅在常规矩形网格中采样

yk=ψk+ψk xk,常数ψk∊ ℝ 和ψk∊ ℝ, 和网格坐标xk∊ ℕ

问题是定位等值面i

f(y0,y1,…,yN)=Ci

直接的方法是在网格中的每个单元上循环,检查当前等值面是否与当前单元相交,如果相交,则描述当前单元内的等值面部分。(移动立方体是描述等值面如何与每个栅格单元相交的一种方法。)

这里的限制是使用基于邻域的搜索,而不是检查每个单元格

OP有一个专门针对3D案例的链接,我将链接到示例代码,并且(在Pastebin.com上,因为它们太长,无法包含内联)

该实现与OP的切片方法完全不同。我的方法是直接、简单地在与当前等值面相交的网格单元上行走。它缓存网格样本,并使用一个单独的映射(每个网格单元一个
char
)来跟踪哪些网格单元已被缓存、遍历和/或推送到堆栈以供以后遍历。这种方法很容易扩展到三个以上的维度。虽然代码完全是为三维而编写的,但方法本身并不是针对三维的;您所需要做的就是调整数据结构以适应任意数量的维度

等值面行走本身并不重要。从等值面相交的任何栅格单元开始,然后检查所有2N个最近邻单元,以查看等值面是否也与这些单元相交。实际上,您可以使用一组要检查的网格单元位置,以及网格单元标志的映射来避免重新检查已检查的网格单元

因为每个网格单元的网格点采样数是2N,所以我的示例代码不是最优的:很多附近的网格点最终都会被计算,以查看相邻的网格单元是否与等值面相交。(不是只检查界定等值面的网格点,而是检查属于等值面周围任何网格单元的网格点。)这额外的工作量随着N的增加呈指数增长

一种更好的方法是分别考虑每一个2n个可能的(n-1)面,以避免检查等值面根本不相交的细胞。

在N维规则矩形网格中,每个单元都是N维长方体,由顶点(角点)处的2N个网格点定义。N长方体单元具有N(N-1)个二维面和2N(N-1)个二维面

要检查每个(N-1)面,需要检查定义该(N-1)面的2N-1网格点处的代价函数。如果这些点的代价函数跨越等值面值,则等值面与(N-1)面相交,等值面也与该方向上的下一个栅格单元相交

有两个(N-1)面垂直于每个轴。如果等值面与靠近负无穷大的(N-1)面相交,则等值面也将沿着该轴与下一个网格单元相交,朝向负无穷大。类似地,如果等值面与靠近正无穷远的(N-1)面相交,则它也将沿该轴与下一个网格单元相交,朝向正无穷远。因此,(N-1)面非常适合决定应检查或不检查哪些相邻单元。这是正确的,因为(N-1)-面正是两个单元共享的网格点集


我很犹豫是否提供示例C代码,因为对于3D案例,相同方法的示例代码到目前为止似乎对任何人都没有帮助。我担心需要一个较长的解释,用二维和三维示例图像进行说明,以便用易于理解的术语描述该方法;如果不牢牢掌握逻辑,任何示例代码都会看起来像gobbledygook

您最好使用二维库您可以尝试Paul Bourke教授的conrec算法。它类似于行进中的立方体。

您希望如何表示解决方案?我猜您当前的方法给出了3条曲线,而不是一条曲面,但我可能错了。@YvesDaoust它给出的不是3条曲面,而是3条曲线。我需要一组等成本位置。如果您不提供更多信息,我无法帮助您。鉴于静态网格和成本C,我需要网格中成本(pos)=C的坐标位置。我不清楚您需要什么信息。您能否澄清,在等值面相交的单元上漫游不取决于使用的尺寸数。这基本上是你可以用来解决迷宫的相同算法;如果等值面与该单元相交,您只需考虑网格单元打开(2)。ⁿ 栅格单元角点采样跨越等值面值),否则闭合。可视化/描述每个单元内的等值面是一个单独的问题,但几乎总是只使用单元角处的成本样本(2)ⁿ 样本总数,n个维度)。