你可以减少3/4的边缘计算?

正常的行军立方体每立方体找到12个边,但每个立方体可以做3个边,保存数组中的边,然后再次穿过立方体,引用相邻立方体的边而不是计算它们。

引用相邻立方体的过程在互联网上没有清楚地讨论过,所以任何使用行进立方体的人都会很乐意帮助您找到解决方案的细节。 你知道已经有一个实现吗?

这里是一张图片,显示了每个立方体需要的黄色三条边,而不是12条。

图片

编辑 - 我刚发现这个解决方案,但它只是它的一部分:

设想3个边缘来自立方体角落的最低坐标。 然后所有其他边缘都属于其他立方体。 如果我们的立方体具有坐标(x,y,z),则邻接立方体具有坐标(x + 1,y,z),(x,y + 1,z),(x,y,z + 1), + 1,y + 1,z),(x + 1,y,z + 1),(x,y + 1,z + 1)。 你可以将边缘想象成一个矢量。 然后立方体的角有边(1,0,0),(0,1,0),(0,0,1)。 坐标为(x + 1,y,z)的立方体具有属于我们立方体的边(0,1,0)和(0,0,1)。 立方体(x + 1,y + 1,z)只有一个属于我们立方体的边(0,0,1)。 因此,如果您为多维数据集存储4个元素,则可以像这样访问它们:

edge1 = cube[x][y][z][0];
edge2 = cube[x][y][z][1];
edge3 = cube[x][y][z][2];
edge4 = cube[x+1][y][z][1];
edge5 = cube[x+1][y][z][2];
edge6 = cube[x][y+1][z][0];
edge7 = cube[x][y+1][z][2];
edge8 = cube[x][y][z+1][0];
edge9 = cube[x][y][z+1][1];
edge10 = cube[x+1][y+1][z][2];
edge11 = cube[x+1][y][z+1][1];
edge12 = cube[x][y+1][z+1][0];

现在哪个点edge7连接? 答案是(x,y + 1,z)和(x,y + 1,z)+(0,0,1)=(x,y + 1,z + 1)。

现在哪些立方体edge7连接? 这是更难。 我们看到坐标z沿着边缘变化,这意味着neibour立方体具有相同的z坐标。 现在所有其他人协调变化。 我们有+1的地方,立方体有很大的坐标。 我们有+0的地方,立方体的坐标较小。 所以边连接立方体(x,y,z)和(x-1,y + 1,z)。 其他2个具有相同边缘的立方体是(x,y + 1,z)和(x-1,y,z)。

- = - = - = - = - = - = - = - = - = - = - = - = - = - = - = - = - = - = - = - =

EDIT2-所以我这样做,并不是那么简单。 我有一个循环,它可以在一个循环中同时计算8个点,12个边,边的内插,位值和边的值。

所以我在它之前做了一个新的循环来尽可能地进行计算,并将它放在数组中以便在复杂的循环中使用。

我可以在数组中循环沿边的交点的内插值,尽管我将不得不在复杂的循环中重新计算所有点,因为我用来决定引用顶点值的位数的值表。 这使我困惑! 我认为一旦我有了边界交点值,我就可以直接使用它们来获得三角形表格,而不必重新计算点数!

其实没有。 无论如何,这里还有一些信息与某人已经做过,只要它是可读的! http://www.new-npac.org/projects/sv2all/sv2/vtk/patented/vtkImageMarchingCubes.cxx滚动到这一行:立方体负责其最小面上的边缘。


按照您建议的方式减少边缘计算的一种简单方法是一次计算一个轴对齐平面的立方体。

如果将所有立方体及其边缘都保存在内存中,则只需计算一次边缘并通过索引查找相邻边缘就很容易。 但是,由于空间需求,您通常不希望一次将所有立方体保留在内存中。

解决这个问题的办法是一次计算一个立方体的平面。 即轴线对齐的横截面,从一侧开始并前进到另一侧。 您只需要一次在内存中保留至多两个立方体的完整平面。 当您穿过每个平面时,您可以引用前一个平面中的共享边和之前计算的当前平面中的立方体。 当你移动到下一架飞机时,你可以重新分配你不再需要的飞机。

编辑 :本文讨论做我刚才的建议:http://alphanew.net/index.php?section=articles&site=marchoptim&lang=eng


有趣的是,当我实施自己的MC时,我想出了类似的解决方案。

当你开始使用MC时,你将它们视为一个独立的立方体,但如果你想要获得高性能,则需要整体创建整个网格,并且创建顶点索引等在这里并不那么容易。 当你想添加平滑的每顶点法线时,它变得更有趣:)。

为了解决这个问题,我创建了一个简单的索引缓存机制来存储每个边的顶点索引。 然后,对于每个计算的边缘我有立方体位置x,y,z和边缘索引,我做如下:

For each axis:
    if the edge is on '+' side of axis:
        replace edge index with its '-' side sibling
        increment cube position along axis

这个简单的操作给了我正确的立方体位置,并且边缘索引为0,1,2。 然后我用简单的位旋转计算x,y,z,edgeIndex值的总缓存索引。

当我有缓存索引时,我检查它是否大于-1。 如果是这样,那么在这个边上就有一个已经计算好的顶点,我可以重用它。 如果它是-1,我需要创建一个新的顶点并将其索引存储在缓存中。 这样你只需计算一次顶点,甚至可以在包含顶点的每个三角形之间添加一个正常值。

链接地址: http://www.djcxy.com/p/37251.html

上一篇: you can reduce 3/4rs of the edge calculations?

下一篇: Visualizing an isosurface generated with marching cubes