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。
HalfEdge 和 VertexNode 都是几何数据结构中常见的元素,尤其在处理多边形网格和计算凸包等算法时被广泛使用。它们虽然有相似的连接性,但有不同的作用和使用场景。下面是它们的区别和各自的用途:
VertexNode主要用于存储和操作 点,在几何计算中起到基础作用,尤其是凸包计算。HalfEdge主要用于表示和操作 边的拓扑结构,通常用于多边形网格的细节操作和复杂的几何算法。
VertexNode 在凸包计算中的作用
- 结构化存储顶点数据:
- VertexNode 通过 point 属性存储每个顶点的 Vector3 坐标,并通过 next 和 prev 属性将顶点按链表形式组织起来。
- 这种链表结构使得顶点在空间中的排列关系得以清晰地表示,便于在计算凸包时操作点集。
- 方便遍历和动态更新:
- 链表结构支持灵活的插入和删除操作,尤其适用于凸包算法中需要频繁更新点集的场景。
- 例如,在处理点集时,可能会动态添加新的点或去除不在凸包上的点,链表可以高效地进行这些更新。
- 与凸包算法结合:
- 在实现凸包算法(如 Graham Scan、Jarvis March 或 QuickHull)时,VertexNode 可以帮助高效管理顶点和边界。
- 它支持通过链表遍历凸包的顶点,并且可以方便地对点集进行迭代、排序和更新。
- 简化算法的实现:
- 链表使得顶点管理更加简便,特别是在涉及到动态变化的凸包时。
- 通过遍历 VertexNode 链表,可以得到凸包的边界,从而绘制或渲染最终的凸包形状。
内部使用方法