如何让 freeBoundary 遵守初始三角剖分顶点顺序。 (2017a+)

How to get freeBoundary to respect initial triangulation vertex order. (2017a+)

这可能是 x、y 问题,所以这就是我所处的情况。我正在创建一个球体,使用定义的方法 here 生成 x、y、z 点。但是对于我的项目,我需要能够生成半球并限制方位角和仰角,并且仍然具有由 N 定义的统一点生成(在给定球形表面积上生成的点总数)。我已经找到了如何执行此操作,但我还需要连接(大致是每个 x y z 或 az、el、r=1 位置的 "neighbors" 是什么)。

Matlab 提供了一种叫做 delaunayTriangulation which won't give me the actual surface connections, but the tetrahedron connections. I found a method of getting the surface from the triangulation object returned by the delaunayTriangulation function, called freeBoundary 的东西,其中 returns 形式为 [FBtri, FBpoints] 的两个东西。 FBtri 是一个 n x 3 整数矩阵,其中每一行包含一组三个整数,这些整数对应于 FBpoints 内的行(因此创建一个三角形)。 FBpoints 是一个 n x 3 矩阵,其中每一行对应于表面上一个点的 x、y 和 z 坐标。

freeBoundary 的问题是,我不只是想要半球面上的 任何 点的三角形,只有那些在我的方位角仰角内的点范围。例如,如果我限制球体顶部的高程不超过pi/4,那么球体顶部应该有一个大洞。这是我所做的一些视觉示例。


有坏点的球体

移除点的球体

为了"solve"这个问题,我有一系列复杂的步骤来生成"bad points",这些步骤附加到用于生成初始delaunay三角剖分的点,然后在连接列表中搜索freeBoundary 的输出以删除它们。这 可以 通过简单地删除某个索引之后存在的所有连接来完成(因为我将 "bad points" 附加在我实际需要使用),但令我恐惧的是 freeBoundary 实际上并没有使点的顺序与来自三角剖分对象的输入相同(并且喜欢打乱它,但仅针对我添加的坏点)所以我无法轻易删除无效连接,并且连接中的索引实际上并不对应 1:1 我原来的真实点集。这是订购问题的示例


实际订单

被毁的秩序

如果我不能强制 freeBoundary 变得很好,那么我将不得不自己以编程方式重新排序这些点,我认为这在时间复杂度上不是一个快速的操作(尽管我可能是错误的)。我相信为了手动执行此操作,我必须找到新的更新位置,并为连接列表中的每个连接手动更新它们,即 (O(triangleCount)*changedIdxCount) 这对我来说看起来不太好,我是生成数千个点。

这是我目前正在做的一个例子:

goodPoints = generateSphere(...);
badPoints = generateBadSpherePoints(...);
points = vertcat(goodPoints, badPoints);
triObj = delaunayTriangulation(points(:,1), points(:,2), points(:,3));
[FBtri, FBpoints] = freeBoundary(triObj);
...
%remove the bad points and get only good connections!

如果您希望 FBtri 中的面参考您用于进行初始三角剖分的点而不是 FBpoints 中的顶点,您所要做的就是省略捕获 FBpoints作为第二个输出:

FBtri = freeBoundary(triObj);

根据 freeBoundary 文档:

The vertex IDs in FBtri reference a specific matrix, depending on the syntax you choose:

  • If you call freeBoundary with one output argument, then the elements of FBtri are row numbers of TR.Points.

  • If you call freeBoundary with two output arguments, then the elements of FBtri are row numbers of FBpoints.