找到与所有体素相交的最小光线集

时间:2015-12-03 13:42:15

标签: math geometry raytracing voxel

好的,首先我不确定这是否更适合MathSO,如果需要迁移,请道歉。

我有一个3D网格点(代表体素的中心),每个维度的音高变化,但是有规律。例如,对于立方体形状的物体,分辨率可以是100乘50乘40。

给我nVox = 200,000

对于每个体素 - 我想投射(nVox - 1)光线,在中心结束,并且来自每个其他体素。

现在显然有很多重叠,但我无法找到如何计算所需的最小光线集。这听起来像是一个有优雅解决方案的问题,但我很难找到它。

首先,很明显你只需要计算

[nVox * (nVox - 1)] / 2
光线的光线,因为另一半只是在相反的方向。在2D情况下,将所有平行于一个网格轴(和两个对角线)的组合也很容易。

那么如何找到我需要的最小光线组,从所有体素中心传递到所有其他光线?

如果有人能指出我正确的方向,那将是伟大的。任何和所有的帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

您的问题实际上并不是以任何特定方式对三个维度进行的。所有的概念复杂性都存在于二维情形中。

不要单独连接点,而应考虑通过网格上至少两个点的一组线。因此,不要考虑最初的点,而是考虑方向。对于2-D,这些方向是线的斜率。这些斜率必须是有理数,因为它们在整数晶格上相交。由于你有一个有限的格子,斜率的分子和分母可以用图的大小来限制。所以你的根本问题是列出有界数的有理数的可能斜率" height" (数学术语)。

有一个算法。它是用于生成减少分数Farey sequence的那个。如果你的数字是N像素宽,那么(通常)将在某处具有分母N的斜率,但是不能以分母> N的缩小形式的斜率;它不适合。

直接处理0到1之间的斜率更容易。您可以通过两个操作获得其他方向:否定斜率和交换轴。对于三维,您需要两个斜率来定义方向。

给定任意方向(不一定是如上所述的理性方向),存在尺寸为k-1的垂直线性空间;对于3-D来说,这是一架飞机。将3-D平行六面体投影到该平面上通常产生六边形;两个顶点投射到内部,六个投影到六边形的顶点。

对于给定的离散方向,整数晶格上有一个最小边界框,使得两个相对的顶点沿着该方向。只要该边界框适合原始网格,投影的每个内部点都对应于与网格相交的线至少两个点。

总之,枚举方向,然后为每个方向枚举该方向在至少两个点与网格相交的位置。

相关问题