Fixed_alpha_shape_3() 会破坏或修改原始三角测量吗?

Does Fixed_alpha_shape_3() destroy or modify original triangulation?

本文关键字:原始 修改 三角 测量 shape alpha Fixed      更新时间:2023-10-16

Fixed_alpha_shape_3(( 会破坏或修改底层三角测量吗?文档说"此操作破坏了三角测量",但它是否将其替换为 alpha 形状三角测量?源代码表明它正在修改底层的 delaunay 三角测量,因为它正在删除顶点。此外,三角测量对象作为参考传递的事实也使我认为 alpha 形状正在修改底层三角测量。如果这是真的,这意味着我们可以在代码的其余部分自然地继续使用原始三角测量对象。如果三角测量没有被修改,而是真正被破坏并且不再存在,我们是否可以简单地将Fixed_alpha_shape_3对象用作三角测量对象,因为它继承自三角测量类?

最终目标是确保在 alpha 形状删除边界上的像元后,在新的三角测量对象中更新像元邻居。最重要的是,新的三角测量对象需要在边界处包含正确的cell->neighbor(i)->is_inifinite状态。

例如,原始三角测量的构造照常进行:

RTriangulation T(points.begin(),points.end());

随后是创建Fixed_alpha_shape_3:

Fixed_alpha_shape_3 as(T);

我知道我们可以使用包括as.get_alpha_shape_cells()在内的各种方法访问 alphaShape INSIDE 和 EXTERIOR 单元格,但如果Fixed_alpha_shape_3只是修改原始三角测量,T,那么我们应该能够继续使用这样的T

const RTriangulation::Finite_cells_iterator cellEnd = T.finite_cells_end();
for (RTriangulation::Finite_cells_iterator cell = T.finite_cells_begin(); cell != cellEnd; cell++) {
for (int i=0;i<4;i++) {
if (cell->neighbor(i)->is_infinite) cell->info().p = 1;
}
}

或者我可以简单地开始使用 alpha 形状对象:

const RTriangulation::Finite_cells_iterator cellEnd = as.finite_cells_end();
for (RTriangulation::Finite_cells_iterator cell = as.finite_cells_begin(); cell != cellEnd; cell++) {
for (int i=0;i<4;i++) {
if (cell->neighbor(i)->is_infinite) cell->info().p = 1;
}
}

最不理想的解决方案是创建带有as.get_alpha_shape_cells()的新单元格列表,因为这意味着对我们的代码进行重大修改,其中包含许多逻辑拆分。我怀疑这是没有必要的,这就是为什么我要澄清Fixed_alpha_shape_3()的行动.

感谢您的协助。

"毁灭"这个词是一个不幸的选择。正如您注意到的,类Fixed_alpha_shape_3派生自三角测量类。 将对三角测量 dt 的引用作为输入的构造函数将其与 dt 交换。 所以之后在 dt 中你会发现默认构造的,即空三角测量。