three VertexNode 顶点节点

151 阅读3分钟

VertexNode 是 Three.js 的 ConvexHull 计算过程中使用的一个数据结构,属于 Three.js 中的一个内部类,位于 three/addons/math/ConvexHull.js 中。它的主要作用是作为一个链表节点,存储一个三维空间中的点(THREE.Vector3),并支持将这些点按顺序连接在一起,形成凸包。

VertexNode 有四个方法

    VertexNode( point : Vector3 )
    point - Vector3 3D 空间中的点 (x, y, z)。
    创建一个 VertexNode 实例。
    // 创建多个点
    const points = [
        new THREE.Vector3(1, 1, 1),
        new THREE.Vector3(-1, 1, 1),
        new THREE.Vector3(-1, -1, 1),
        new THREE.Vector3(1, -1, 1),
        new THREE.Vector3(0, 0, -1),
    ];
    // 创建 VertexNode 链表
    let firstNode = new VertexNode(points[0]);
    let currentNode = firstNode;
    // 将其余点添加到链表中
    for (let i = 1; i < points.length; i++) {
        const newNode = new VertexNode(points[i]);
        currentNode.next = newNode;   // 将当前节点的 next 指向新节点
        newNode.prev = currentNode;   // 将新节点的 prev 指向当前节点
        currentNode = newNode;        // 更新当前节点为新节点
    }
    // 输出链表结构
    console.log(firstNode);

方法

  • point : Vector3 3D 空间中的点 (x, y, z)。默认值 undefined。
  • prev : VertexNode 引用双链表中的前一个顶点。默认为 null。
  • next : VertexNode 引用双链表中的下一个顶点。默认为 null。
  • face : Face 对能够看到该顶点的面的引用。默认值为 undefined。

HalfEdgeVertexNode 都是几何数据结构中常见的元素,尤其在处理多边形网格和计算凸包等算法时被广泛使用。它们虽然有相似的连接性,但有不同的作用和使用场景。下面是它们的区别和各自的用途: 1731984652076.png

  • VertexNode 主要用于存储和操作 ,在几何计算中起到基础作用,尤其是凸包计算。
  • HalfEdge 主要用于表示和操作 边的拓扑结构,通常用于多边形网格的细节操作和复杂的几何算法。

VertexNode 在凸包计算中的作用

  • 结构化存储顶点数据:
    • VertexNode 通过 point 属性存储每个顶点的 Vector3 坐标,并通过 next 和 prev 属性将顶点按链表形式组织起来。
    • 这种链表结构使得顶点在空间中的排列关系得以清晰地表示,便于在计算凸包时操作点集。
  • 方便遍历和动态更新:
    • 链表结构支持灵活的插入和删除操作,尤其适用于凸包算法中需要频繁更新点集的场景。
    • 例如,在处理点集时,可能会动态添加新的点或去除不在凸包上的点,链表可以高效地进行这些更新。
  • 与凸包算法结合:
    • 在实现凸包算法(如 Graham Scan、Jarvis March 或 QuickHull)时,VertexNode 可以帮助高效管理顶点和边界。
    • 它支持通过链表遍历凸包的顶点,并且可以方便地对点集进行迭代、排序和更新。
  • 简化算法的实现:
    • 链表使得顶点管理更加简便,特别是在涉及到动态变化的凸包时。
    • 通过遍历 VertexNode 链表,可以得到凸包的边界,从而绘制或渲染最终的凸包形状。

内部使用方法 1731988375242.png