如何让 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
.
这可能是 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 ofFBtri
are row numbers ofTR.Points
.If you call
freeBoundary
with two output arguments, then the elements ofFBtri
are row numbers ofFBpoints
.