一个开源的2D Delaunay Triangulator—Triangle

Triangle 是外国人Jonathan Richard Shewchuk开发的一个开源软件。用于生成一个2D的Delaunary Triangulator 和Voronoi 图的程序。该程序可以单独运行也可以应用于其他的项目中。详细说明可以看作者主页http://www.cs.cmu.edu/~quake/triangle.html 

源代码下载:http://www.netlib.org/voronoi/triangle.zip

最近,为了一个课题,需要用到Voronoi图,就研究了这个程序。这个程序相当不错,但是对于初学者来说,想要运用到其他程序中还是比较费劲的。而网上对于这个程序的说明又很少。在这里,我就将这段时间使用的一些心得分享一下。该程序在Linux,windows上都可以运行。我使用的开发环境是visual studio 2010。本文基于windows下的使用进行讲解。

将Triangle作为一个单独的项目是可以直接运行的。在visual studio中创建一个win32控制台空项目。然后将  triangle.h 和triangle.c直接复制过去就可以直接运行(不能复制tricall.c)。运行成功后就可以打开CMD,进入”项目路径/Dubeg/“,输入triangle.exe 就可以看到triangle的选项



我们可以使用这些选项进行执行一些操作。具体的操作可以根据Makefile中的注释进行操作。通过阅读这些选项,在以后其他项目中进行调用时候也有帮助。

Triangle.c作为一个单独的程序不需要进行什么修改,但我们使用这个程序就是为了在其他项目中进行调用的。所以,我们需要进一步将Triangle程序做出一点修改。

这个程序写的非常好。我们通过阅读程序中的注释就可以找到方法,而且阅读注释还能够帮我们了解程序的架构。但是,能耐下性子看下去而且能看明白的很少(me too)。

在说明之前,我们需要对#ifdef.....#elseif. . . #endif进行讲解下,因为你会发现这个程序中出现特别多这种形式的代码。

我们通过一个简单的例子进行说明下:


#ifdef TEST

printf("hello");

#elseif

printf("world");

#endif

这段代码的意思是:如果定义了TEST 的话就运行printf("hello");,否则,运行printf("world"); 。如果我们想要的运行结果是“hello”的话,可以在代码前面添加语句#define TEST 。

转换话题,如果我们想在其他项目中使用这个程序的话,需要将Triangle作为一个lib静态库。根据triangle.c中的注释,我们需要定义TRILIBRARY符号,即#define TRILIBRARY .


由于我们使用的是windows,所以还需要定义NO_TIMER符号。



然后,在triangle.h中还需要定义 #define ANSI_DECLARATORS 

之后我们就可以在其他项目中调用这个程序生成delaunary三角了。

一个最简单的例子就是文件中自带的tricall.c。我们只需要创建一个win32控制台程序,然后将上面修改过的triangle.h、triangle.c和tricall.c添加进去即可。

运行成功后,使用CMD进入“项目路径/Dubeg/”,运行tricall.exe就可以看到程序结果。这个自带的程序可以帮助我们在开发项目中对Triangle的使用有一定的帮助。


在开发自己的项目前,需要将triangle.h文件中的注释进行详细的理解。它对我们如何初始化结构体进行了详细的指导。我们可以参照着tricall.c文件进行理解。

(其中有一点问题是在我的程序中出现的。我根据tricall文件初始化“in”结构体时候,发现程序还是无法运行,然后把in中的所有指针进行了初始化后发现程序正常了。)

在初始化三个结构体后(一个保存输入,一个保存Delaunary triangle,一个保存Voronoi),我们就可以调用下面这个函数就可以生成需要的Delaunary三角和Voronoi图。

void triangulate(char *, struct triangulateio *, struct triangulateio *, struct triangulateio *);

然后可以使用opengl来显示出来。

我将自己写的一个简单的程序放在了github中,大家可以参考下,写的不是很完美。。。。。。https://github.com/guningbo/bubble

上面的观点纯属自己在项目编写中的一点心得,有不当的地方希望可以指出,大家共同进步。


版权声明:本文为guningbo原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。