好的,首先我不确定这是否更适合MathSO,如果需要迁移,请道歉。
我有一个3D网格点(代表体素的中心),每个维度的音高变化,但是有规律。例如,对于立方体形状的物体,分辨率可以是100乘50乘40。
给我nVox = 200,000
。
对于每个体素 - 我想投射(nVox - 1)光线,在中心结束,并且来自每个其他体素。
现在显然有很多重叠,但我无法找到如何计算所需的最小光线集。这听起来像是一个有优雅解决方案的问题,但我很难找到它。
首先,很明显你只需要计算
[nVox * (nVox - 1)] / 2
光线的光线,因为另一半只是在相反的方向。在2D情况下,将所有平行于一个网格轴(和两个对角线)的组合也很容易。
那么如何找到我需要的最小光线组,从所有体素中心传递到所有其他光线?
如果有人能指出我正确的方向,那将是伟大的。任何和所有的帮助将不胜感激。
答案 0 :(得分:1)
您的问题实际上并不是以任何特定方式对三个维度进行的。所有的概念复杂性都存在于二维情形中。
不要单独连接点,而应考虑通过网格上至少两个点的一组线。因此,不要考虑最初的点,而是考虑方向。对于2-D,这些方向是线的斜率。这些斜率必须是有理数,因为它们在整数晶格上相交。由于你有一个有限的格子,斜率的分子和分母可以用图的大小来限制。所以你的根本问题是列出有界数的有理数的可能斜率" height" (数学术语)。
有一个算法。它是用于生成减少分数Farey sequence的那个。如果你的数字是N像素宽,那么(通常)将在某处具有分母N的斜率,但是不能以分母> N的缩小形式的斜率;它不适合。
直接处理0到1之间的斜率更容易。您可以通过两个操作获得其他方向:否定斜率和交换轴。对于三维,您需要两个斜率来定义方向。
给定任意方向(不一定是如上所述的理性方向),存在尺寸为k-1的垂直线性空间;对于3-D来说,这是一架飞机。将3-D平行六面体投影到该平面上通常产生六边形;两个顶点投射到内部,六个投影到六边形的顶点。
对于给定的离散方向,整数晶格上有一个最小边界框,使得两个相对的顶点沿着该方向。只要该边界框适合原始网格,投影的每个内部点都对应于与网格相交的线至少两个点。
总之,枚举方向,然后为每个方向枚举该方向在至少两个点与网格相交的位置。