- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
注意:描述比预期的要长一些。您知道使用此网格实现此算法的可读吗?请让我知道!
我正在尝试实现 Catmull-Clark subdivision使用 Matlab,因为稍后必须将结果与已经在 Matlab 中实现的其他一些东西进行比较。首先尝试使用顶点面网格,该算法有效但效率不高,因为您需要边和面的相邻信息。因此,我现在使用 half-edge mesh .也可以看看 Designing a Data Structure for Polyhedral Surfaces, by Lutz Kettner (该页面上的 PDF 链接)。
我的问题在于找到Twin HalfEdges,我只是不确定该怎么做。下面我将描述我对实现的想法,尽量保持简洁。
半边网格(使用顶点/半边/面的索引):
Vertex (x,y,z,Outgoing_HalfEdge)
HalfEdge (HeadVertex (or TailVertex, which one should I use), Next, Face, Twin).
Face (HalfEdge)
为了简单起见,假设每个面都是四边形。实际的网格是顶点、半边和面的列表。新网格将由 NewVertices、NewHalfEdges 和 NewFaces 组成,像这样(注意:Number_... 是 ... 的数量):
NumberNewVertices: Number_Faces + Number_HalfEdges/2 + Number_Vertices
NumberNewHalfEdges: 4 * 4 * NumberFaces
NumberNewfaces: 4 * NumberFaces
卡特穆尔-克拉克:
Find the FacePoint (centroid) of each Face:
--> Just average the x,y,z values of the vertices, save as a NewVertex.
Find the EdgePoint of each HalfEdge:
--> To prevent duplicates (each HalfEdge has a Twin which would result in the same HalfEdge)
--> Only calculate EdgePoints of the HalfEdge which has the lowest index of the Pair.
Update old Vertices
好的,现在所有的新顶点都计算好了(但是,它们的Outgoing_HalfEdge仍然未知)。下一步保存新的半边和面。 这是导致我出现问题的部分!
Loop through each old Face, there are 4 new Faces to be created
(because of the quadrilateral assumption)
First create the 4 new HalfEdges per New Face, starting at the FacePoint to the Edgepoint
Next a new HalfEdge from the EdgePoint to an Updated Vertex
Another new one from the Updated Vertex to the next EdgePoint
Finally the fourth new HalfEdge from the EdgePoint back to the FacePoint.
每个新 HalfEdge 的 HeadVertex 都是已知的,Next HalfEdge 也是已知的。 Face 也是已知的(因为它是您正在创建的新面孔!)。只有 Twin HalfEdge 是未知的,我应该如何知道?
顺便说一下,在循环遍历新面的顶点时,将 Outgoing_HalfEdge 分配给顶点。这可能是找出哪个 HalfEdge 是双胞胎的地方。
最后,在创建了 4 个新的 HalfEdges 之后,将具有 HalfVertex 索引的 Face 保存为最后一个新创建的 HalfVertex。
我希望这是清楚的,如果需要我可以发布我的(显然尚未完成的)Matlab 代码。
编辑:感谢您移动我的主题。我在评论中发布了指向源代码的链接,请注意此实现考虑了一般的多边形网格,因此不仅是四边形网格。
此外,如果您考虑将一个旧的四边形面分成 4 个新面(绿色数字),则很容易找到新的 HalfEdges 1 和 4(每个新面中的红色数字)的双胞胎:
那么,如何找到 2 条和 3 条 HalfEdge 的 Twins?
最佳答案
您遇到的概念问题似乎是您试图一次添加一个半边,然后想知道它们是如何加起来的。不过,边是真正的修改单位,因此您应该始终将它们成对添加。
为了实现(单次通过)算法,我将使用“新创建”标志对每个模型元素进行注释,该标志指示元素是否作为算法的结果创建。顶层循环是迭代未修改的面孔。
首先确保面部的每条原始边缘都已被分割。在这样做的同时,创建一个列表,列出每个不利于面部的"new"顶点;这些是中点。 - A。要分割一条边,我们首先要定位相应的半边。创建一个新顶点。我们在每个链表中插入一对新的半边,将端点调整到新顶点。将所有四个半边标记为新的以及新的顶点。
分割面部的第一站与其他人不同。创建一个新的顶点 V
使其位于旧面的中间,并选择一个新的顶点 W
入射到该面。我们将按如下方式连接它们。假设 W
附近的边链表看起来像 ..aWb..
。创建一对新的半边 c
和 d
。将链表中的 W
替换为 WcVdW
以生成列表“..aWcVdWb..”。这会在面部中间创建一个“ float 边缘”。然而,该数据结构确保我们有一个表示多边形内周的半边链表。将顶点 W
和半边 c
和 d
标记为新的。
现在,对于每个剩余的新顶点,我们将创建一对新的半边,但这次每对也会创建一个新面。选择前面的..cVdWb..
链表序列。因为所有原始边缘都已分割,所以该列表扩展到 ..cVdWbXeYf..
。 X
是旧顶点,Y
是新顶点。创建一对新的半边 g
和 g
,它们将连接顶点 V
和 Y
。从链表中提取序列 VdWbXeY
并向其添加 g
以创建一个新面孔 [VdWbXeYg]
。添加半边 h
以连接旧面中的 V
和 Y
以生成 ..cVhYf..
。将新面孔标记为新面孔。如果没有更多的新顶点,我们就完成了。如果不是,则将名称 ..cVhYf..
映射到 ..cVdWb..
以进行迭代。
符号有点讨厌,但从概念上讲它很简单。这三个步骤中的每一个都成对添加半边;在步骤 1 中划分一条边,在步骤 2 和 3 中添加它们。这些添加中的每一个都保持多面体表示的关联不变量不变,这意味着您可以改进代码中的修改局部性。
关于algorithm - 在使用半边网格实现 Catmull-Clark 分割时找到双胞胎,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8297897/
您能否建议如何在 Bootstrap 或 IE 兼容的 CSS 网格中,在没有 CSS 网格的情况下进行以下布局。 在大屏幕中 头部,左侧堆叠的 body 和右侧覆盖头部和 body 高度的图像。 [
我想在 Objective-C 中绘制一个 15*15 的网格。格子颜色是蓝色的,就像在诺基亚制作“贪吃蛇”游戏的棋盘一样。 我试过使用 for 循环来创建 subview ,但它似乎不起作用,我查看
我正在尝试将 CSS 网格与 grid-template-columns: repeat(auto-fill, auto) 一起使用,单元格被设置为最大宽度,导致每行一个元素。 p> 是否可以让元素宽
我正在努力在网格的自定义列上添加一个指向网站的简单、简单的链接。我用了 Inchoo blog为列添加自定义渲染器,它可以工作。我认为只需修改渲染并添加标签就足够了。但我的希望破灭了,行不通。 如何做
使用 Gnuplot 我绘制了下图 - 现在,正如您在图像中看到的那样,很难在线条之间识别出其末端的块。所以我想用不同的颜色或样式交替着色网格。 我现在用来给网格着色的代码是 - set style
假设我有一个非常简单的 WPF 网格(6 行 x 6 列),定义如下:
我有一个希望绑定(bind)到 WPF 网格的集合。 我面临的问题是列数是动态的并且取决于集合。这是一个简单的模型: public interface IRows { string Messa
我正在使用 Vaadin 8,我想制作某种混淆矩阵。我想知道是否可以根据单元格位置而不是数据提供者手动填充表格/网格的值。 referenceTable.addColumn(reference ->
我在 http://jsfiddle.net/TsRJy/ 上创建了一个带有 div 框的网格. 问题 我不知道如何使 a:hover 工作。 信息 重写 HTML 代码,因为表格不适合我。 http
银光处女在这里。如何使网格周围的用户控件自动调整大小以适应内部网格宽度?目前,当浏览器窗口更宽时,用户控件的显示尺寸约为 300 或 400 像素。它在数据网格周围呈现垂直和水平滚动条,这很丑陋。我想
这个问题已经有答案了: Equal width columns in CSS Grid (11 个回答) 已关闭 2 年前。 使用 CSS Grid,当您不知道会有多少个子项时,如何将所有子项保留在一
我想使用 CSS Grid 的 grid-template-areas。 但问题是我正在使用的 CMS 添加了大量额外的包装器。有没有办法忽略额外的包装?因为它弄乱了漂亮的网格区域...... 我正在
在我的Grid中,当我单击“操作”按钮(下面的代码中显示的“删除和编辑”按钮)时,我需要弹出一个窗口,而不用警告消息提醒用户; 在下面的代码中,我正在使用HANDLER handler: button
这个问题已经有答案了: Equal width columns in CSS Grid (11 个回答) 已关闭 2 年前。 使用 CSS Grid,当您不知道会有多少个子项时,如何将所有子项保留在一
我需要模拟一个仓库,其中有几辆自动驾驶车辆在给定的布局上移动,并具有简单的优先级规则。根据我的理解,这个问题可以通过离散事件模拟(DES)轻松解决,我会使用 SimPy为了这。 我看到的问题是,我似乎
在 ASP.NET 中,我可以让用户控件在页面上的表格中占据多个单元格: 用户控件1: foo bar 第1页: 并且自动调整列宽以适应最大的用户控件。 这也可以在 WPF
我正在寻找一种方法来实时搜索我的网格+要过滤的复选框。我有一个包含学生的网格(照片和姓名)。我想要的是有一个复选框,可以过滤学生所在的不同类(class)。还有一个搜索栏,我可以在其中输入学生姓名。
我正在使用 jQuery 和 jQuery UI 构建一个 Web 应用程序。我陷入了僵局。我需要的是一个 jQuery 网格,它具有可编辑字段,并以某种方式在这些可编辑单元格之一上合并一个自动完成字
我想知道是否有其他 JavaScript 组件可以提供具有多个分组的网格表示。下面是jqGrid的截图我扩展了允许该功能,但它需要获取所有数据。我希望在扩展分组时加载数据。 另一个修改后的 jqGri
我一直在为我将在此处描述的 CSS 问题而烦恼: 在下面的示例 ( https://codesandbox.io/s/jjq4km89y5 ) 中,您可以看到一个可滚动的内容(紫色背景)和一个被左侧面
我是一名优秀的程序员,十分优秀!