DELAUNAY三角网算法(生长算法、逐点插入算法、分治算法)

 DELAUNAY三角网算法是什么东西呢。。。大概就是对于许多密集的点,,,可以形成一个三角网。。然后最近的三个点搞成一个三角形。任何一个三角形的外接圆都不包含其他的点。并且没有相交边,并且所有三角面的合集就是一个凸包。,Delaunay三角剖分所形成的三角形的最小角最大。

1.最接近:以最近的三点形成三角形,且各线段(三角形的边)皆不相交。
2.唯一性:不论从区域何处开始构建,最终都将得到一致的结果。
3.最优性:任意两个相邻三角形形成的凸四边形的对角线如果可以互换的话,那么两个三角形六个内角中最小的角度不会变大。
4.最规则:如果将三角网中的每个三角形的最小角进行升序排列,则Delaunay三角网的排列得到的数值最大。
5.区域性:新增、删除、移动某一个顶点时只会影响临近的三角形。
6.具有凸多边形的外壳:三角网最外层的边界形成一个凸多边形的外壳。
算法不久之后实现 = =

#include<bits/stdc++.h>
using namespace std;
#define PI 3.1415926
struct triangleNode
{
    double coordinateX[3],coordinateY[3];   //坐标
    double triangleLength;            //周长
    double triangleArea;              //面积
    double triangSideleLength[3];        //边长
};
struct pointNode
{
    double x,y;

};
double dist(double xx,double yy,double xxx,double yyy)
{
    return sqrt((xx-xxx)*(xx-xxx)+(yy-yyy)*(yy-yyy));
}
double getTriangleCircumcircleRadius(triangleNode a)  //外接圆半径
{
    a.triangSideleLength[0]=dist(a.coordinateX[0],a.coordinateY[0],a.coordinateX[1],a.coordinateY[1]);
    a.triangSideleLength[1]=dist(a.coordinateX[0],a.coordinateY[0],a.coordinateX[2],a.coordinateY[2]);
    a.triangSideleLength[2]=dist(a.coordinateX[2],a.coordinateY[2],a.coordinateX[1],a.coordinateY[1]);
    double triangleCircumcircleRadius=0.5*(sqrt((a.triangSideleLength[0]+a.triangSideleLength[1]-a.triangSideleLength[2])
                                           *(a.triangSideleLength[0]-a.triangSideleLength[1]+a.triangSideleLength[2])
                                           *(a.triangSideleLength[1]+a.triangSideleLength[2]-a.triangSideleLength[0]))
                                           /(a.triangSideleLength[0]+a.triangSideleLength[1]+a.triangSideleLength[2]));
    return triangleCircumcircleRadius;
}
double getTriangleCircumcircleLength(triangleNode a)  //外接圆周长
{
    return 2*PI*getTriangleCircumcircleRadius(a);
}
double getTriangleCircumcircleArea(triangleNode a)  //外接圆面积
{
    return PI*getTriangleCircumcircleRadius(a)*getTriangleCircumcircleRadius(a);
}
double getTriangleLength(triangleNode a)            //三角形周长
{
    a.triangSideleLength[0]=dist(a.coordinateX[0],a.coordinateY[0],a.coordinateX[1],a.coordinateY[1]);
    a.triangSideleLength[1]=dist(a.coordinateX[0],a.coordinateY[0],a.coordinateX[2],a.coordinateY[2]);
    a.triangSideleLength[2]=dist(a.coordinateX[2],a.coordinateY[2],a.coordinateX[1],a.coordinateY[1]);
    return a.triangSideleLength[0]+a.triangSideleLength[1]+a.triangSideleLength[2];
}
double getTriangleArea(triangleNode a)            //三角形面积
{
    a.triangSideleLength[0]=dist(a.coordinateX[0],a.coordinateY[0],a.coordinateX[1],a.coordinateY[1]);
    a.triangSideleLength[1]=dist(a.coordinateX[0],a.coordinateY[0],a.coordinateX[2],a.coordinateY[2]);
    a.triangSideleLength[2]=dist(a.coordinateX[2],a.coordinateY[2],a.coordinateX[1],a.coordinateY[1]);
    double halfPerimeter=getTriangleArea(a)*0.5;  //半周长
    return sqrt(halfPerimeter*(halfPerimeter-a.triangSideleLength[0])*(halfPerimeter-a.triangSideleLength[1])*(halfPerimeter-a.triangSideleLength[2])); //海伦公式
}
int main()
{

}


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