差不多学习20天了,看了这么长时间,该总结一下了,主要分为两部分:离散点生成三角网,多边形剖分三角网。总结的都是二维的,对于三维,鉴于现在的需求不会太复杂,我的打算是投影成二维后三角化再还原到三维。
注:算法名称带+的是我编译运行过的,相关代码下载地址
主要就是离散点生成三角网算法,比较成熟的有delaunay三角化算法,还有些其他的。delaunay三角化按照实现过程,可以分为分治法,逐点插入法(随机增量法),三角网生长法,扫描线法等。
搜集到的例子:
Paul Chew写的Voronoi Diagram / Delaunay Triangulation,采用java语言,效果不错
网站:http://www.cs.cornell.edu/Info/People/chew/Delaunay.html
核心算法不知道谁写的,最开始是c代码,有人改为了c++代码,程序的about页面写的作者邮箱为[email protected]。师姐给的,效率和效果都超好,已经修改使用,作为两步法带约束剖分的第一步代码,哈哈~
没有官网,给个可以下载代码的地方,注意验证码大小写哦:
http://www.hackchina.com/cont/67300
代码
debug版运行时的
assert可以不用管,程序不是用
mfc的窗口,
assert失败正常。
2012-03-30:原来没仔细看,实际上是两个slide控件的问题,已修正。
没查……
带约束的我刚刚开始就为了多边形剖分三角网,后面又增加了其他需求,什么断层啊,采空区啊。。。。
Poly2Tri采用的是Sweep Line方法,同时提供java和linux版本。输入输出官方是采用了文件格式。
网站:http://sites-final.uclouvain.be/mema/Poly2Tri/poly2tri.html
已经使用,效果挺好的,效率也不错,但是有重复点的时候不能用。但生成的并不是delaunay三角形,也就是说可能有很瘦长的三角形产生。
可以处理空洞。
Triangle是linux下的,编译看了下结果还可以,不过没去做移植,评价挺好的。有时间一定好好看看。
网站:http://www.cs.cmu.edu/~quake/triangle.html
可以处理空洞,也可以指定约束线,或者关键点。
FIST(Fast Industrial-Strength Triangulation of Polygons)看网站上展示的效果不错,不过源码不公开,可以跟作者索取。
网站:http://www.cosy.sbg.ac.at/~held/projects/triang/triang.html
John W. Ratcliff的算法
网站:http://www.flipcode.com/archives/Efficient_Polygon_Triangulation.shtml
有bug,如果是五个顶点,其中四个是正方形顶点,第五个是对角线上点的时候,会有问题。
作者的网站:
http://www.sjaakpriester.nl/computers/codeguru
代码介绍及下载:
http://www.codeguru.com/cpp/cpp/algorithms/general/article.php/c8901/Delaunay-Triangles.htm
但是我用着有问题,比如六个点安照两个嵌套三角形布置,有待研究代码。网站也说是The algorithm is not perfect. In particular, it doesn't handle situations with more than three vertices lying on one circle very well.
名字我自己起的,是周波和林俞先两位同学写的,也是师姐给我的代码,有些bug,在某些情况下会产生空洞,我做了修改,但是效率很一般。
注:修改版需顺时针画边界点
唯一一个我完完全全懂了每行代码意思的,并且运行正常了的算法……囧
原版处理了空洞,修改版没处理空洞
刚刚写总结的时候发现的,还没仔细看,保留下网站。
http://trigrid.sourceforge.net/
这是我在CompuGeom(CG)算法基础上,增加第二步约束处理做出来的,CG的效率很好,所以就算我的烂算法影响下还能接受使用。
单独下载地址:http://code.google.com/p/szmneo/downloads/detail?name=SunnyCG_vs08.rar&can=2&q=
暂未处理空洞
。
2012-03-30:增加了空洞和内部关键点的处理,外部边界需要逆时针画,空洞需要顺时针画,关键点需要在空洞和外边界间。
2012-03-31:修复了边界相交和某些情况有空洞的bug
1)复杂多边形的剖分,首先对多边形进行单调划分,也就是将多边形分解为若干个单调多边形,然后再对单调多边形进行三角剖分,最终生成对初始多边形的三角剖分。
http://www.cnblogs.com/dogstar/archive/2011/04/07/2008726.html
2)也是采用扫描线法,但是在构网过程中添加了好多点,生成的三角形可能会很碎很扁:
http://www.cnblogs.com/fly-height/articles/2193155.html
1)几个比较大的库,有时间可以研究下:
Qhull:http://www.qhull.org/
Cgal: http://www.cgal.org/
2)罗列了一堆mesh generators软件的网页:
http://www.robertschneiders.de/meshgeneration//software.html
3)前人的总结,本文只提到了里面的Triangle和Poly2Tri以及FIST
http://blog.csdn.net/yqxx/article/details/6318679