three VertexList 顶点列表

99 阅读3分钟

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 类型),包含顶点数据。
    // 在指定节点前插入新节点
    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 类型),包含顶点数据。
  • append ( vertex : Vertex ) : this vertex - 要追加的顶点。 将一个顶点追加到链表的末尾。
  • appendChain ( vertex : Vertex ) : this VertexList.appendChain 方法用于将一个链表(由一个或多个 VertexNode 节点组成)附加到当前链表的末尾。此方法将指定的 vertex 插入到链表的尾部,并更新相关的双向链表连接。
    • vertex: VertexNode
      • 要附加到当前链表末尾的节点。vertex 必须是一个链表中的第一个节点(即该链表的头节点),通常是一个通过其他方法(如 insertAfter、insertBefore 等)插入的链表。
  • remove ( vertex : Vertex ) : this vertex - 要删除的顶点。 从链表中删除一个顶点。
  • removeSubList ( a : Vertex, b : Vertex ) : this VertexList.removeSubList 方法用于从链表中删除一个子链表,即删除从节点 a 到节点 b 之间的所有节点。此方法将更新链表的链接,确保删除操作后链表的结构仍然完整。
    • a: VertexNode
      • 子链表的起始节点,从该节点开始删除。
    • b: VertexNode
      • 子链表的结束节点,直到该节点为止,包含节点 a 和节点 b。
  • isEmpty () : Boolean 如果链表为空则返回 true。