Triangle - Delaunay Triangulator 

eryar@163.com

Abstract. Triangle is a 2D quality mesh generator and Delaunay triangulator. Triangle was created as part of the Quake project in the school of Computer Science at Carnegie Mellon University by Jonathan R. Shewchuk. Triangle is a small C program and its Delaunay refinement algorithm for quality mesh generation is a hybrid one. It includes divide-and-conquer and incremental insertion algorithms and sweepline Delaunay triangulation algorithm. This paper is focused on the usage of the Triangle and visualization the triangulation result in OpenSceneGraph.

Key words. Triangle, Delaunay Triangulator, Mesh Generator

1. Introduction

Triangle可以生成精确的Delaunay三角剖分,限定Delaunay三角剖分(Constrained Delaunay Triangulation),Conforming Delaunay Triangulation,Voronoi图(Voronoi Diagrams)和高质量的三角网格,即生成的网格中没有瘦长的三角形,所以适用于有限元分析(Finite Element Analysis)。

在OpenCascade6.2.0版本之前,OpenCascade中网格的生成就是使用了这个开源库,由此可见Delaunay三角剖分算法和网格生成算法的重要性及广泛应用。

Figure 1.1 Triangle - A 2D Quality Mesh Generator and Delaunay Triangulator

下载Triangle的源程序及更多与Triangle相关信息的网址如下所示:

http://www.cs.cmu.edu/~quake/triangle.html

下载到源程序后,如果是Windows操作系统,还需要在triangle.h之前做些配置,如定义以下几个宏:

#define REAL double
#define ANSI_DECLARATORS
#include "triangle.h"
#undef REAL

在triangle.c中定义宏:#define NO_TIMER。有了上面的宏定义,可以编译出一个triangle.exe程序了。如果要将triangle用在自己的程序中,还需要定义#define TRILIBRARY。更多宏定义可以参考源程序。

2. Triangle Usage

Triangle有很多开关,可以选择三角剖分和生成网格的方式,如下图所示:

Figure 2.1 Options for the Triangle

如对示例文件box.poly进行三角剖分,使用命令及生成结果统计信息如下所示:

Figure 2.2 Triangle Usage

出现统计信息的同时也生成了一些文件,如顶点文件box.1.node和三角形文件box.1.ele,如下图所示:

Figure 2.3 Nodes and Triangles data generated by Triangle

Figure 2.4 Triangulation Mesh Generated by Triangle[-pc]

Figure 2.5 Triangulation Mesh Generated by Triangle[-pqc]

3. Displaying Meshes

在下载的程序中有用于显示网格的示例程序showme.c,不过只能用于Unix操作系统,不能用于Windows。

Figure 3.1 Displaying the Meshes by ShowMe

为了在Windows操作系统中看到生成的网格,用OpenSceneGraph编写了一个小程序TriangleViewer显示网格。其中读取node和element文件中数据的主要程序片段如下所示:

std::string TriangleMesh::ReadLine(std::ifstream &theFile)
{
std::string theBuffer; bool IsReadNextLine = false; do
{
getline(theFile, theBuffer); // skip comment here.
if ('#' == theBuffer[])
{
IsReadNextLine = true;
}
else
{
IsReadNextLine = false;
}
}
while (IsReadNextLine); return theBuffer;
} void TriangleMesh::BuildMesh(const std::string& aPolyFile)
{
std::stringstream ss; std::string theNodeFileName(aPolyFile + ".node");
std::string theElementFileName(aPolyFile + ".ele"); std::ifstream theNodeFile(theNodeFileName.c_str());
std::ifstream theElementFile(theElementFileName.c_str()); Standard_Integer theIndex = ;
Standard_Integer theNodeCount = ;
Standard_Integer theTriangleCount = ; Standard_Integer theIndex1 = ;
Standard_Integer theIndex2 = ;
Standard_Integer theIndex3 = ; Standard_Real x = 0.0;
Standard_Real y = 0.0; // Read mesh size.
ss << ReadLine(theNodeFile);
ss >> theNodeCount; ss.str("");
ss.clear(); ss << ReadLine(theElementFile);
ss >> theTriangleCount; mMesh = new Poly_Triangulation(theNodeCount, theTriangleCount, Standard_True); // Read nodes information.
TColgp_Array1OfPnt2d& theNodes2d = mMesh->ChangeUVNodes(); for (Standard_Integer n = ; n <= theNodeCount; ++n)
{
ss.str("");
ss.clear(); ss << ReadLine(theNodeFile);
ss >> theIndex >> x >> y; theNodes2d.SetValue(theIndex, gp_Pnt2d(x, y));
} // Read triangles information.
Poly_Array1OfTriangle& theTriangles = mMesh->ChangeTriangles(); for (Standard_Integer t = ; t <= theTriangleCount; ++t)
{
ss.str("");
ss.clear(); ss << ReadLine(theElementFile);
ss >> theIndex >> theIndex1 >> theIndex2 >> theIndex3; theTriangles.SetValue(theIndex, Poly_Triangle(theIndex1, theIndex2, theIndex3));
}
}

如下图所示为显示一个用不同命令生成的Smiley Face的网格:

Figure 3.2 Generate Smiley Face Mesh by Triangle [-pc]

Figure 3.3 Generate Smiley Face Mesh by Triangle [-pqc]

从上面两幅图中的网格可知,下面图中的网格质量较高,为去掉了瘦长的三角形而增加了一些顶点。

4. Conclusions

在给Triangle程序输入数据时,顶点Vertex数据很好理解,只是一些二维点,但是如果加上开孔Hole后有些问题。后来才知道,需要在Poly文件中的Segments部分输入与孔相关线段形成的闭合区域,在孔Hole部分只需要输入位于孔中的任意一个点即可。

将Triangle生成的结果可视化,可以看到Triangle生成的网格,方便看到Triangle的不同选项生成的网格效果。

在OpenCascade6.2.0版本中,就以此二维Delaunay三角剖分工具为基础,实现了任意三维曲面的三角剖分,进而对其可视化。所以学习Triangle的用法,结合OpenCascade的源程序便于理解任意曲面的可视化实现的方法。

对Delaunay三角剖分算法感兴趣的读者,可以参考相关书籍[3],[4],[5],[6]。

5. References

1. Jonathan R. Shewchuk. Triangle: http://www.cs.cmu.edu/~quake/triangle.html

2. Jonathan R. Shewchuk, Triangle: Engineering a 2D Quality Mesh Generator and Delaunay Triangualtor, Springer-Verlag, Berlin, 1996

3. 汪嘉业 王文平 屠长河 杨承磊. 计算几何及应用.  科学出版社. 2011

4. 王成恩. 面向科学计算的网格划分与可视化技术. 科学出版社. 2011

5. 周培德. 计算几何-算法设计与分析. 清华大学出版社. 2008

6. Berg M D著 邓俊辉译. 计算几何-算法与应用. 清华大学出版社. 2009

Triangle - Delaunay Triangulator的更多相关文章

  1. Triangle 1.6 (A Two-Dimensional Quality Mesh Generator and Delaunay Triangulator)

    Triangle 一个二维高质量网格(mesh)生成器和Delaunay三角化工具. PSLG(Planar Straight Line Graph)约束Delaunay三角网(CDT)与Delaun ...

  2. Visualize Surface by Delaunay Triangulator

    Visualize Surface by Delaunay Triangulator eryar@163.com Abstract. Delaunay Triangulation is the cor ...

  3. Computer Graphics Research Software

    Computer Graphics Research Software Helping you avoid re-inventing the wheel since 2009! Last update ...

  4. CG&CAD resource

    Computational Geometry The Geometry Center (UIUC) Computational Geometry Pages (UIUC) Geometry in Ac ...

  5. Windows Python Extension Packages

    备注: 1.先要安装wheel库:pip install wheel 2.下载wheel,切换至下载路径,然后安装:pip install wheel库名.whl Windows Python Ext ...

  6. OpenCV——Delaunay三角 [转载]

    从这个博客转载 http://blog.csdn.net/raby_gyl/article/details/17409717 请其它同学转载时注明原始文章的出处! Delaunay三角剖分是1934年 ...

  7. C++ 基于凸包的Delaunay三角网生成算法

    Delaunay三角网,写了用半天,调试BUG用了2天……醉了. 基本思路比较简单,但效率并不是很快. 1. 先生成一个凸包: 2. 只考虑凸包上的点,将凸包环切,生成一个三角网,暂时不考虑Delau ...

  8. 使用Delaunay三角剖分解决求多边形面积的问题

    朋友那边最近有个需求,需要框选一个选区,然后根据选区中的点求出面积.并且让我尝试用Delaunay来解决 似乎音译过来应该是德诺类 大致如下: 我在github上找了一个可以用的Delaunay库 h ...

  9. 三角剖分算法(delaunay)

    开篇 在做一个Low Poly的课题,而这种低多边形的成像效果在现在设计中越来越被喜欢,其中的低多边形都是由三角形组成的. 而如何自动生成这些看起来很特殊的三角形,就是本章要讨论的内容. 项目地址:  ...

随机推荐

  1. 【转】bash 参数展开(Parameter Expansion)

    转自:http://www.360doc.com/content/13/0513/20/9437165_285204629.shtml ${parameter} 取parameter的值 ${para ...

  2. 使用VisualVM分析性能

    性能分析神器VisualVM VisualVM 是一款免费的,集成了多个 JDK 命令行工具的可视化工具,它能为您提供强大的分析能力,对 Java 应用程序做性能分析和调优.这些功能包括生成和分析海量 ...

  3. linux 查找 并删除 文件

    find / -name "*.mp3" |xargs rm -rf会删除所有以mp3为扩展的文件.操作的时候先: find / -name "*.mp3" 会 ...

  4. 纯css来实现提示框

    用js用多了,就疏忽了最基本的css了---用title属性来实现提示框.下面言归正传------如何用css实现提示框: 1.利用title属性来实现鼠标滑过某个元素时,实现提示整段内容的功能(利用 ...

  5. window.onload和$(document).ready(function(){})的区别

    前段时间在面试之前查找并整理了一下window.onload和$(document).ready(function(){})区别,今天有时间更到我的博客上,由于本人资历尚浅,如有不对的地方,还请指正. ...

  6. 2015-12-23-( dispaly:table的用法)

    dispaly属性的table和table-cell属性值不怎么常用,主要是浏览器的兼容性不好,大多数都是为了兼容IE6.IE7,此属性IE8以上,谷歌,火狐,oprea等浏览器都支持.  此disp ...

  7. 关于px、em和rem的学习笔记!

    刚参加前端工作,字体一般使用px来设置大小,在处理响应式界面时对字体的大小变化处理感觉很吃力,得知对字体的大小有三种大小格式设置方式,便想一探究竟,希望可以有所帮助! px px像素(Pixel),相 ...

  8. php止刷新页面重复提交

    利用session来解决,首先新建一个session,并赋值,第一次提交后改变session的值,当第二次再此提交此内容时,如果不是我们的赋值,就不在处理传过来的数据.如:<?php sessi ...

  9. BOM对象有哪些:

    BOM对象有哪些: 1.window对象 ,是JS的最顶层对象,其他的BOM对象都是window对象的属性: 2.document对象,文档对象: 3.location对象,浏览器当前URL信息: 4 ...

  10. 使用Spring JdbcTemplate实现数据库操作

    今天我来演示 关于JDBCTemplate实现对数据库的查询和添加 首先是添加 第一步大家都知道 创建一个实体类 然后写一个方法 把实体类当参数传进去 在实现这个接口 JdbcDaoSupport这个 ...