VertexList是一个轻量级、灵活的顶点管理工具,常用于实现ConvexHull算法等几何计算任务。
在 Three.js 的 ConvexHull 算法实现中,VertexList 双向链表用于管理和操作顶点集合。这种数据结构的灵活性非常适合凸包构建过程中频繁的插入、删除和遍历操作。
VertexList 有两个属性十个方法
属性
- head : VertexNode 引用链表的第一个顶点。默认为 null。
- 常见属性
- prev:指向链表中的前一个节点,类型为 VertexNode 或 null。
- next:指向链表中的下一个节点,类型为 VertexNode 或 null。
- point:存储当前顶点的具体坐标数据。
- 常见属性
- tail : VertexNode 引用链表的最后一个顶点。默认为 null。 常见属性与head 一样
方法
- first () : VertexNode 返回链表中的第一个节点(类型为 VertexNode)。如果链表为空,则返回 null。与head 属性功能相似
- last () : VertexNode VertexList 的 last() 方法用于获取链表的最后一个节点。与 tail 属性功能相似
- clear () : this 清除链接列表。
- insertBefore ( target : Vertex, vertex : Vertex ) : this VertexList.insertBefore 方法用于在链表中指定节点 target 之前插入一个新的节点 vertex。该方法会更新链表结构并保持链表的双向链接完整性。
- target: VertexNode
- 指定目标节点,在此节点之前插入新的节点。
- 如果 target 为 null,则新节点插入到链表末尾。
- vertex: VertexNode
- 要插入的新节点(VertexNode 类型),包含顶点数据。
- target: VertexNode
// 在指定节点前插入新节点
const vertexList = new VertexList();
const node1 = new VertexNode();
const node2 = new VertexNode();
const node3 = new VertexNode();
// 初始化链表
vertexList.append(node1);
vertexList.append(node3);
// 在 node3 前插入 node2
vertexList.insertBefore(node3, node2);
// 检查链表顺序
console.log(vertexList.head.point); // node1
console.log(node1.next === node2); // true
console.log(node2.next === node3); // true
// 在头部插入新节点
const newNode = new VertexNode();
vertexList.insertBefore(vertexList.head, newNode);
console.log(vertexList.head === newNode); // true
// 在尾部插入新节点
const newNode = new VertexNode();
vertexList.insertBefore(null, newNode); // 等价于 append
console.log(vertexList.tail === newNode); // true
- insertAfter ( target : Vertex, vertex : Vertex ) : this VertexList.insertAfter 方法用于在链表中指定节点 target 之后插入一个新的节点 vertex。该方法会更新链表结构,确保新节点正确地插入并保持链表的双向链接完整性。使用方法与 insertAfter 类似
- target: VertexNode
- 指定目标节点,在此节点之后插入新的节点。
- 如果 target 为 null,则新节点会被插入到链表的开头。
- vertex: VertexNode
- 要插入的新节点(VertexNode 类型),包含顶点数据。
- target: VertexNode
- append ( vertex : Vertex ) : this vertex - 要追加的顶点。 将一个顶点追加到链表的末尾。
- appendChain ( vertex : Vertex ) : this VertexList.appendChain 方法用于将一个链表(由一个或多个 VertexNode 节点组成)附加到当前链表的末尾。此方法将指定的 vertex 插入到链表的尾部,并更新相关的双向链表连接。
- vertex: VertexNode
- 要附加到当前链表末尾的节点。vertex 必须是一个链表中的第一个节点(即该链表的头节点),通常是一个通过其他方法(如 insertAfter、insertBefore 等)插入的链表。
- vertex: VertexNode
- remove ( vertex : Vertex ) : this vertex - 要删除的顶点。 从链表中删除一个顶点。
- removeSubList ( a : Vertex, b : Vertex ) : this
VertexList.removeSubList方法用于从链表中删除一个子链表,即删除从节点a到节点b之间的所有节点。此方法将更新链表的链接,确保删除操作后链表的结构仍然完整。- a: VertexNode
- 子链表的起始节点,从该节点开始删除。
- b: VertexNode
- 子链表的结束节点,直到该节点为止,包含节点 a 和节点 b。
- a: VertexNode
- isEmpty () : Boolean 如果链表为空则返回 true。