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