HalfEdge 是一种专门用来表示网格(特别是三维多边形网格)拓扑关系的数据结构。网格一般由顶点(点)、边(线段)、面(多边形)组成,HalfEdge 数据结构通过将这些元素分解成更细的“半边”,从而使得我们能更加高效地存储和操作这些元素之间的关系。
传统的网格表示方法(比如仅使用顶点、边、面)在处理复杂的几何体或进行拓扑操作时效率较低。HalfEdge 通过引入“半边”这一概念,使得网格的拓扑关系更加清晰、处理起来更加高效。
HalfEdge 有五个属性五个方法
HalfEdge( vertex : VertexNode, face : Face )
vertex - VertexNode 对其目标顶点的引用
face - Face 对其面的引用
创建一个 HalfEdge 实例。
// 创建顶点
let v1 = new VertexNode(0, 0);
let v2 = new VertexNode(1, 0);
let v3 = new VertexNode(1, 1);
// 创建面
let face = new Face();
// 创建半边
let he1 = new HalfEdge(v1, face);
let he2 = new HalfEdge(v2, face);
let he3 = new HalfEdge(v3, face);
// 设置半边链
he1.next = he2;
he2.next = he3;
he3.next = he1;
he1.prev = he3;
he2.prev = he1;
he3.prev = he2;
// 获取半边的起始顶点
console.log(he1.head()); // 输出 v1,即顶点(0, 0)
console.log(he2.head()); // 输出 v2,即顶点(1, 0)
console.log(he3.head()); // 输出 v3,即顶点(1, 1)
// 获取半边的源顶点
console.log(he1.tail()); // 输出 v3,即顶点(1, 1)
console.log(he2.tail()); // 输出 v1,即顶点(0, 0)
console.log(he3.tail()); // 输出 v2,即顶点(1, 0)
// 设置对立半边(假设有另一面,我们可以创建它们)
let he1_opposite = new HalfEdge(v2, new Face()); // 示例对立半边
he1.opposite = he1_opposite;
he1_opposite.opposite = he1;
console.log(he1_opposite,"he1_opposite") // face : Face {normal: Vector3, midpoint: Vector3, area: 0, constant: 0, outside: null, …} next : null opposite : HalfEdge face : Face {normal: Vector3, midpoint: Vector3, area: 0, constant: 0, outside: null, …} next : HalfEdge {vertex: VertexNode, prev: HalfEdge, next: HalfEdge, twin: null, face: Face} opposite : HalfEdge {vertex: VertexNode, prev: null, next: null, twin: null, face: Face, …} prev : HalfEdge {vertex: VertexNode, prev: HalfEdge, next: HalfEdge, twin: null, face: Face} twin : null vertex : VertexNode {point: 0, prev: null, next: null, face: null} [[Prototype]] : Object prev : null twin : null vertex : VertexNode {point: 1, prev: null, next: null, face: null}
- vertex : VertexNode 对目标顶点的引用。可以通过查询其孪生顶点或前一个半边的目的地来获得原点。默认值 undefined。
- prev : HalfEdge 对同一面的前一半边的引用。默认值为 null。
- next : HalfEdge 对同一面的下一半边的引用。默认值为 null。
- twin : HalfEdge 对应到达相对面的孪生半边的引用。默认值为 null。
- face : Face 每个半边限定一个面,因此具有对该面的引用。默认值 undefined。
方法
- head () : VertexNode 返回目标顶点。
- tail () : VertexNode 返回原点顶点
- length () : Float 返回边的 欧几里得长度 (直线长度)。
- lengthSquared () : Float 返回边的 欧几里得长度 (直线长度)的平方。
- setTwin ( edge : HalfEdge ) : this edge - 任何半边缘。 设置这个半边的孪生边。还确保给定半边的孪生引用被正确设置。