基于HalfEdge模型加面算法分析(1)

声明:除了第一张图来自互联网,其他的图片都是使用VISIO和ISKITCH制作

一  先简单介绍一些HalfEdge数据结构

 

 

 

半边结构由三个对象组成:顶点、半边、面,每一个对象都有指针指向其他对象,大致指向情况如下:

1、顶点对象:包含一个指针指向离开它的半边vertex->leaving.

2、半边对象:包含一个指向它离开的顶点的指针halfedge->orgin

                          一个它所对应的面(左手定则)halfedge->face.

                          一个指向它的twins的指针,halfedge->twins

                         一个指向它的下一条半边的指针,halfedge->next.

3、面对象:包含一个指向与它对应的半边的指针,face->halfedge.

代码展现形式如下:(C#实现)

HalfEdgeMesh  数据结构

 List<Edge> edges = new List<Edge>();

 List<Face> faces = new List<Face>();

 List<Halfedge> halfedges = new List<Halfedge>();

 List<Vertex> vertices = new List<Vertex>();

Face 数据结构

 public TFaceTraits Traits;

 private Halfedge halfedge;

 private int index;

Halfedge 数据结构

 public THalfedgeTraits Traits;

 private Edge edge;

 private Face face;

 private Halfedge nextHalfedge, oppositeHalfedge, previousHalfedge;

 private Vertex vertex;

 private int index;

Edge 数据结构

 public TEdgeTraits Traits;

 private Halfedge halfedge;

 private int index;

Vertex 数据结构

public TVertexTraits Traits;

private Halfedge halfedge;

private HalfEdgeMesh<TEdgeTraits, TFaceTraits, THalfedgeTraits, TVertexTraits> mesh;

 private int index;

二 基于以上的数据结构我们来实现加面算法

   加面算法顾名思义就是在原有模型的基础上添加相应的面

在程序中体现的是接收用户输入的一系列顶点通过相应的算法在模型中构建三角形添加到原有模型中即完成加面功能。如图:

那么核心问题是我们怎么根据数据结果构建新的三角形面呢?下面我们一一解释:

 

 

 

Input: Vertex[]faceVertices

Step1: Check

Make sure input is (mostly) acceptable before making any changes to the mesh

遍历顶点,检查顶点是否已经包含在原有模型中,顶点所构建的半边是否已经包含在模型中等信息

 

Step2: Create (Step2和Step3是最关键合心的步骤)

遍历数组,根据Step1确定出来的信息,如果构建成的是新変,则创建

Edge,halfedges,Opposite Halfedges

Step3:Connect

1.Connect opposite halfedge to inner halfedge

连接半边和邻边

 

 

2.Connect edge to halfedges

将边指向半边

3.Connect halfedges to edge

将半边指向边

4.Connect halfedges to vertices

半边指向顶点

5.Connect vertex to outgoing halfedge if it doesn't have one yet

顶点指向半边

6.Connect next/previous halfedges

连接 半边指向下一半边  半边的前半边 的关系,这是最复杂的一步,有多种出现情况,在下一边文章中详细分析

 

 

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
泰森多边形算法是一种计算离散点集的Delaunay三角剖分的方法,它可以用于生成网格、地图绘制等众多应用场景。在C#中,我们可以使用开源库Qhull来实现泰森多边形算法。 以下是基于Qhull的C#代码示例: 1.首先,下载Qhull库的C#封装程序qhull-2015-src-cs.zip,并将其中的qhull_cs.dll引用到C#项目中。 2.在代码中引入Qhull的命名空间: ```csharp using Qhull; ``` 3.定义一个包含点坐标的List: ```csharp List<Qhull.Point> points = new List<Qhull.Point>(); ``` 4.向points中添加点坐标: ```csharp points.Add(new Qhull.Point(0, 0)); points.Add(new Qhull.Point(1, 0)); points.Add(new Qhull.Point(0, 1)); points.Add(new Qhull.Point(1, 1)); ... ``` 5.使用Qhull库的QhullWrapper类生成Delaunay三角剖分: ```csharp QhullWrapper wrapper = new QhullWrapper(); Tesselation tesselation = wrapper.Tesselate(points.ToArray()); ``` 6.从Tesselation对象中获取泰森多边形的边界: ```csharp foreach (Facet facet in tesselation.Facets) { if (facet.IsUpperConvex) { foreach (HalfEdge edge in facet.AdjacentHalfEdges) { if (edge.IsBoundary && !edge.IsUpperConvex) { // edge.Origin和edge.Twin.Origin即为泰森多边形的一个边界线段的两个端点 ... } } } } ``` 7.完整代码示例: ```csharp using Qhull; using System.Collections.Generic; class Program { static void Main(string[] args) { List<Qhull.Point> points = new List<Qhull.Point>(); points.Add(new Qhull.Point(0, 0)); points.Add(new Qhull.Point(1, 0)); points.Add(new Qhull.Point(0, 1)); points.Add(new Qhull.Point(1, 1)); QhullWrapper wrapper = new QhullWrapper(); Tesselation tesselation = wrapper.Tesselate(points.ToArray()); foreach (Facet facet in tesselation.Facets) { if (facet.IsUpperConvex) { foreach (HalfEdge edge in facet.AdjacentHalfEdges) { if (edge.IsBoundary && !edge.IsUpperConvex) { // edge.Origin和edge.Twin.Origin即为泰森多边形的一个边界线段的两个端点 ... } } } } } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值