由离散样本点生成Delaunay三角网有多种算法,每个算法的执行效率都不一样,这里介绍一种最简单,最低效,但是算法逻辑最清晰的一种。
Delaunay三角网必须满足的一个条件是任何一个三角形的外接圆都不能包含其他任何一个样本点,因此,本算法通过枚举所有可能的三角形,再经过其外接圆不包含任何其他样本点的判断,如果满足,则记录该三角形,直到所有三角形枚举完毕。
效果图:
本算法用C++实现,核心代码如下:
const double EP = 0.00000001;
// 点结构
typedef struct PT{
double x;
double y;
}PT;
//线结构
typedef struct SEGMENT
{
PT* ptStart;
PT* ptEnd;
}SEGMENT;
//三角形类
class TRIANGLE
{
public:
TRIANGLE(PT* pt1, PT* pt2, PT* pt3)
{
//确保三个点x坐标升序排序
PT* temp;
if(pt1->x > pt2->x){temp = pt1; pt1 = pt2; pt2 = temp;}
if(pt3->x < pt1->x && pt3->x )
{
temp = pt3; pt3 = pt1; pt1 = temp;
if(pt3->x < pt2->x){temp=pt3;pt3=pt2;pt2=temp;}
}
if(pt3->x < pt2->x){temp=pt3;pt3=pt2;pt2=temp;}
_ptFirst = pt1;
_ptSecond = pt2;
_ptThird = pt3;
InitData();