对给定的凸多边形区域生成三角形网格。
输入条件:二维凸多边形区域
实际输入:围成此区域的边界点集
输出结果:此区域的三角形网格
实际输出:网格数据
网格要求:1 任意三角形的任意边长≤1.0;
2 网格节点数目尽量少。
1、网格区域输入格式
2、网格初始化
3、网格单元的细分
4、三角形的优化
5、边界处理
6、数据结构
7、网格输出格式
三角形和节点关系定理:对于任意n个节点,如果边界上的节点数为k,(满足k<n),那么任意三角形剖分必然由2n-2-k个三角形组成。
数据结构
1)网格节点
struct Node
{
double X,Y;
}
2)三角形单元
struct Triangle
{
Node *n1, *n2, *n3;
Triangle *t1, *t2, *t3;
}
int check(triangle x){
double max = dis(x.a,x.b),
mid = dis(x.a,x.c),
min = dis(x.b,x.c),
t,A;
int mp = 3;
if ((max<=1.0)&&(mid<=1.0)&&(min<=1.0))
return 0;
if (max<mid){ t=max;max=mid;mid=t;mp = 2; }
if (max<min){ t=max;max=min;min=t;mp = 1; }
if (mid<min){ t=mid;mid=min;min=t; }
A = acos((mid*mid+min*min-max*max)/(2*mid*min));
if (A<PI/2)
return 1;
return 1+mp;
}
double dis(point x,point y){
return sqrt((x.x-y.x)*(x.x-y.x)+(x.y-y.y)*(x.y-y.y));
}
int cmp(point x,point y){
if (x.x<y.x)
return 1;
if (x.x>y.x)
return -1;
if (x.y>y.y)
return 1;
if (x.y<y.y)
return -1;
return 0;
}