我试图理解边界表示(B-rep),但我找不到半边数据结构与翼边数据结构的优势。我在 this book 中发现 winged-edge 不能表示空间中存在顶点但不存在边的状态。但是没有样本。

Another book 表示边缘方向存在歧义。

最后,在 this web page 上,调用性能原因。

最佳答案

我在 this paper 中找到了解决方案。

有了 winged-edge,你就有了这个数据结构:

cad - 翼边与半边-LMLPHP

C#中的代码如下:

public class WingedEdge
{
    public Curve3d Curve { get; set; }

    /// <summary>
    /// Edge of the left loop starting on the end vertex of this edge.
    /// </summary>
    public Edge EndLeftEdge { get; set; }

    /// <summary>
    /// Edge of the right loop starting on the end vertex of this edge.
    /// </summary>
    public Edge EndRightEdge { get; set; }

    /// <summary>
    /// Vertex on the end point of the edge.
    /// </summary>
    public Vertex EndVertex { get; set; }

    /// <summary>
    /// Face on the left side of the edge.
    /// </summary>
    public Face LeftFace { get; set; }

    /// <summary>
    /// Face on the right side of the edge.
    /// </summary>
    public Face RightFace { get; set; }

    /// <summary>
    /// Edge of the left loop ending on the start vertex of this edge.
    /// </summary>
    public Edge StartLeftEdge { get; set; }

    /// <summary>
    /// Edge of the right loop ending on the start vertex of this edge.
    /// </summary>
    public Edge StartRightEdge { get; set; }

    /// <summary>
    /// Vertex on the start point of the edge.
    /// </summary>
    public Vertex StartVertex { get; set; }
}

在面上,你只需要存储一个边界边,因为结构形成了一个双链表,你可以检索其他边:
public class Face
{
    /// <summary>
    /// One of the edges bounding this face.
    /// </summary>
    public WingedEdge FirstEdge { get; set; }
}

但是,如果您需要遍历人脸的边缘,您将使用以下代码:
WingedEdge edge = face.FirstEdge;
do {
  // Do something with the edge
  WingedEdge edge = edge.LeftFace == face ? edge.LeftNextEdge : edge.RightNextEdge;
} while (edge != face.FirstEdge)

我们必须在循环中使用条件表达式 (? :) 来查找下一条边。在现代处理器上,这会导致性能下降,如 in this post 所述。

半边数据结构没有这个问题(只是占用内存较多)。

关于cad - 翼边与半边,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34548207/

10-11 11:59