three HalfEdge 半边

55 阅读2分钟

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 - 任何半边缘。 设置这个半边的孪生边。还确保给定半边的孪生引用被正确设置。