这可能是x,y的问题,这是我所处的情况。我正在创建一个球面,用定义的这里方法生成x,y,z点。但是对于我的项目,我需要能够产生半球,限制方位角和仰角,并且仍然有由N (在给定的球面表面积上生成的点总数)定义的均匀点生成。我已经找到了如何做到这一点,但我也需要连接(大约是每个x,或az,el,r=1位置的“邻居”)。
Matlab提供了一个叫做delaunayTriangulation的东西,它不会给我实际的表面连接,而是四面体连接。我找到了一种从delaunayTriangulation函数返回的三角剖分对象获取曲面的方法,称为freeBoundary,它以[FBtri, FBpoints]的形式返回两样东西。FBtri是一个由整数组成的nx3矩阵,其中每一行包含一组与FBpoints内的行相对应的三个整数(从而创建了一个三角形)。FBpoints是一个nx3矩阵,其中每一行对应于曲面上一个点的x、y和z坐标。
freeBoundary的问题是,我不只是在半半球表面上的任何一点,只有那些在我的方位角高度范围内的三角形。例如,如果我将球面顶部的高度限制为不高于pi/4,那么球体顶部应该会有一个大洞。以下是我所做的一些直观的例子。
带坏点的球面

带移除点的球面

为了“解决”这个问题,我有一系列复杂的步骤来生成“坏点”,这些“坏点”附加在生成初始delaunay三角剖分所用的点上,然后在freeBoundary输出中的连通列表中搜索以删除它们。这个可以通过简单地删除在某个索引之后存在的所有连接(就像我在我实际需要使用的索引之后附加的“坏点”一样)来完成,但是,令我恐惧的是,freeBoundary实际上并没有将点的顺序与来自三角对象的输入保持相同的顺序(并且喜欢对它进行置乱,但只针对我添加的坏点),因此我无法轻松地删除无效的连接,而且连接中的索引实际上并不对应于我原来的真正的点集。以下是订购问题的一个示例
实际订单

被毁的订单

如果我不能强迫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!发布于 2017-11-29 19:12:51
如果希望FBtri中的面引用用于进行初始三角剖分而不是FBpoints中的顶点的点,则只需省略捕获FBpoints作为第二个输出:
FBtri = freeBoundary(triObj);根据freeBoundary文档:
FBtri中的顶点in引用特定的矩阵,具体取决于您选择的语法:
freeBoundary,则FBtri的元素是TR.Points的行号。freeBoundary,则FBtri的元素是FBpoints的行号。https://stackoverflow.com/questions/47559433
复制相似问题