如何获得 3D 体积的最小横截面
How to get the minimum cross section of a 3D volumn
现在3d数组中存储了一个3d体积,在3d体积中给出了一个点。
如何计算通过该点的体积的最小横截面?
你也许可以用距离变换做一些花哨的步法,但不确定我会如何做那个 atm,所以就把它说出来,然后像我说的那样留下我会给出一个数字方法
另外,说 "processing time is not critical" 时要小心,因为当你对这么大的数据集进行数值求解时,一切都是相对的。 IE 内部循环中的微小变化可能会使处理时间从几分钟到几小时再到几天...
我在下面描述的一切都是"off grid",我的意思是:你有一个结构化的点云,但空间向量的生成和传播是免费的space。因此,例如,为了沿着给定的自由 space 向量测试内部或外部的点,您将查找结构化云内部最近的体素坐标。通常,最简单的方法就是将事物缩放到 "floor" 到最近的分辨率单位。虽然如果您使用整数分辨率并且实际上可以使用 floor 这会更容易,但您也可以沿主轴进行除法、舍入和再乘法。
第一步是设置一个函数来生成任意横截面。为此,您需要一个向量 (A),然后生成一个与该向量 (A) 垂直的向量 (C)(这可以通过多种方式完成,但最简单的方法是创建另一个非平行向量 ( B) 并将其与原始向量交叉以创建垂直向量 (C)。对于向量 (B),您可以只使用 (0,0,1) 或 (0,1,0) *使用前者,除非测试向量是平行于 (0,0,1) 在这种情况下你使用后者。现在你有矢量 (A) 和垂直平面上的矢量 (C),你需要沿着该矢量 (C) 测试你的数据. 基本上,测试原点,然后按最小分辨率单位沿向量 (C) 移动并继续测试,直到到达数据集的边缘或者是否到达对象的边缘 ,具体取决于您是否有凹包与否。然后围绕向量 (A) 旋转向量 (C),并对整个平面进行径向采样。该旋转步长可能与距离 s 最远的样本数据的最小弧长相关充足的点(你可能只设置一些任意小的径向采样距离,但这是处理循环的中心,所以这一步的东西是最昂贵的)。在此步骤之后使用某种方法标准化您的面积很重要,因为您将重复计算很多面积。有多种方法可以获取任意闭合形状的内部区域。我想到的是计算从每个测试向量(即边)的最后一个 "in point" 到下一个的三角形面积,然后将所有这些三角形相加得到最终面积。如果你正在做复杂的(非凹形),你会想要进入和离开边缘并对第二和第三边缘进行梯形面积计算。
该函数将 运行 作用于您在开始时生成并从测试点发出的一系列种子向量。这些种子将是矢量的径向分布,以形成一个相当合理的球体(取决于您正在查看的对象,但基本上播种步骤是为了确保您避免大多数大的局部最小值(因此您可以有更高或更低的播种分辨率取决于您的对象)。
在测试所有种子后,对于每个种子,获取其横截面,然后尝试在其两个垂直方向上进行小幅旋转并进行梯度下降以找到局部最小值。测试所有种子后,取最佳方案。
现在3d数组中存储了一个3d体积,在3d体积中给出了一个点。 如何计算通过该点的体积的最小横截面?
你也许可以用距离变换做一些花哨的步法,但不确定我会如何做那个 atm,所以就把它说出来,然后像我说的那样留下我会给出一个数字方法
另外,说 "processing time is not critical" 时要小心,因为当你对这么大的数据集进行数值求解时,一切都是相对的。 IE 内部循环中的微小变化可能会使处理时间从几分钟到几小时再到几天...
我在下面描述的一切都是"off grid",我的意思是:你有一个结构化的点云,但空间向量的生成和传播是免费的space。因此,例如,为了沿着给定的自由 space 向量测试内部或外部的点,您将查找结构化云内部最近的体素坐标。通常,最简单的方法就是将事物缩放到 "floor" 到最近的分辨率单位。虽然如果您使用整数分辨率并且实际上可以使用 floor 这会更容易,但您也可以沿主轴进行除法、舍入和再乘法。
第一步是设置一个函数来生成任意横截面。为此,您需要一个向量 (A),然后生成一个与该向量 (A) 垂直的向量 (C)(这可以通过多种方式完成,但最简单的方法是创建另一个非平行向量 ( B) 并将其与原始向量交叉以创建垂直向量 (C)。对于向量 (B),您可以只使用 (0,0,1) 或 (0,1,0) *使用前者,除非测试向量是平行于 (0,0,1) 在这种情况下你使用后者。现在你有矢量 (A) 和垂直平面上的矢量 (C),你需要沿着该矢量 (C) 测试你的数据. 基本上,测试原点,然后按最小分辨率单位沿向量 (C) 移动并继续测试,直到到达数据集的边缘或者是否到达对象的边缘 ,具体取决于您是否有凹包与否。然后围绕向量 (A) 旋转向量 (C),并对整个平面进行径向采样。该旋转步长可能与距离 s 最远的样本数据的最小弧长相关充足的点(你可能只设置一些任意小的径向采样距离,但这是处理循环的中心,所以这一步的东西是最昂贵的)。在此步骤之后使用某种方法标准化您的面积很重要,因为您将重复计算很多面积。有多种方法可以获取任意闭合形状的内部区域。我想到的是计算从每个测试向量(即边)的最后一个 "in point" 到下一个的三角形面积,然后将所有这些三角形相加得到最终面积。如果你正在做复杂的(非凹形),你会想要进入和离开边缘并对第二和第三边缘进行梯形面积计算。
该函数将 运行 作用于您在开始时生成并从测试点发出的一系列种子向量。这些种子将是矢量的径向分布,以形成一个相当合理的球体(取决于您正在查看的对象,但基本上播种步骤是为了确保您避免大多数大的局部最小值(因此您可以有更高或更低的播种分辨率取决于您的对象)。
在测试所有种子后,对于每个种子,获取其横截面,然后尝试在其两个垂直方向上进行小幅旋转并进行梯度下降以找到局部最小值。测试所有种子后,取最佳方案。