TIN三角网格画法

来源:百度文库 编辑:神马文学网 时间:2024/04/29 20:02:08
以下是我程序中关于建网的部分:
//   DelaunayTIN.cpp:   implementation   of   the   CDelaunayTIN   class.
//
////////////////////////////////////////////////////////////////////// #include   "stdafx.h "
#include   "Reconstruction.h "
#include   "DelaunayTIN.h " #include   "MyMath.h "
#include  
#include   "ListControl.h " #ifdef   _DEBUG
#undef   THIS_FILE
static   char   THIS_FILE[]=__FILE__;
#define   new   DEBUG_NEW
#endif //////////////////////////////////////////////////////////////////////
//   Construction/Destruction
////////////////////////////////////////////////////////////////////// CDelaunayTIN::CDelaunayTIN()
{ } CDelaunayTIN::~CDelaunayTIN()
{ } /////////////////////////////////////////////////////////////////////////////
//函数名: CreateDelaunayTIN
//编写者: Polaris
//参考资料:
//功能: 用给定的数据链表数据,组建Delaunay不规则三角网
//输入参数:数据链表list;区域范围(XMin,YMin),(XMax,YMax)
//输出参数:不规则三角网首三角形地址
//备注:
/////////////////////////////////////////////////////////////////////////////
struct   Triangle   *   CDelaunayTIN::CreateDelaunayTIN(List   *list)
{
//组建第一个三角形
CMyMath   MyMath;
CListControl   ListControl;
struct   List   *node;
struct   Pixel   *pt1,*pt2,*pt3;
bool   flag;
struct   Triangle   *TIN;
pt1=list-> pixel;
pt2=list-> next-> pixel;
node=list-> next-> next;
while(node!=NULL)
{
if(MyMath.Calculate2PtDistanceIn3D
(pt1-> x,pt1-> y,pt1-> z,node-> pixel-> x,node-> pixel-> y,node-> pixel-> z)
(pt1-> x,pt1-> y,pt1-> z,pt2-> x,pt2-> y,pt2-> z))
{
pt2=node-> pixel;
}
node=node-> next;
}
node=list-> next;
pt3=NULL;
while(node!=NULL)
{
if(node-> pixel==pt1   ||   node-> pixel==pt2)
{
node=node-> next;
continue;
}
if(pt3==NULL)
{
pt3=node-> pixel;
}
else
{
if((pow(MyMath.Calculate2PtDistanceIn2D(pt1-> x,pt1-> y,node-> pixel-> x,node-> pixel-> y),2)+pow(MyMath.Calculate2PtDistanceIn2D(pt2-> x,pt2-> y,node-> pixel-> x,node-> pixel-> y),2)-pow(MyMath.Calculate2PtDistanceIn2D(pt1-> x,pt1-> y,pt2-> x,pt2-> y),2))/(2*MyMath.Calculate2PtDistanceIn2D(pt1-> x,pt1-> y,node-> pixel-> x,node-> pixel-> y)*MyMath.Calculate2PtDistanceIn2D(pt2-> x,pt2-> y,node-> pixel-> x,node-> pixel-> y))
<(pow(MyMath.Calculate2PtDistanceIn2D(pt1-> x,pt1-> y,pt3-> x,pt3-> y),2)+pow(MyMath.Calculate2PtDistanceIn2D(pt2-> x,pt2-> y,pt3-> x,pt3-> y),2)-pow(MyMath.Calculate2PtDistanceIn2D(pt1-> x,pt1-> y,pt2-> x,pt2-> y),2))/(2*MyMath.Calculate2PtDistanceIn2D(pt1-> x,pt1-> y,pt3-> x,pt3-> y)*MyMath.Calculate2PtDistanceIn2D(pt2-> x,pt2-> y,pt3-> x,pt3-> y)))
{
pt3=node-> pixel;
}
}
node=node-> next;
}
//LineList
Linelist   *linehead,*linenode,*linelast;
Line   *ln1,*ln2,*ln3;
linenode=new   Linelist;
linenode-> line=new   Line;
linenode-> line-> pixel1=pt1;
linenode-> line-> pixel2=pt2;
linenode-> line-> pixel3=pt3;
linenode-> line-> flag=false;
linenode-> next=NULL;
linehead=linelast=linenode;
ln1=linenode-> line;
linenode=new   Linelist;
linenode-> line=new   Line;
linenode-> line-> pixel1=pt2;
linenode-> line-> pixel2=pt3;
linenode-> line-> pixel3=pt1;
linenode-> line-> flag=false;
linenode-> next=NULL;
linelast-> next=linenode;
linelast=linenode;
ln2=linenode-> line;
linenode=new   Linelist;
linenode-> line=new   Line;
linenode-> line-> pixel1=pt3;
linenode-> line-> pixel2=pt1;
linenode-> line-> pixel3=pt2;
linenode-> line-> flag=false;
linenode-> next=NULL;
linelast-> next=linenode;
linelast=linenode;
ln3=linenode-> line;
//first   Triangle
Triangle   *tglhead,*tglnode,*tgllast;
tglnode=new   Triangle;
tglnode-> line1=ln1;
tglnode-> line2=ln2;
tglnode-> line3=ln3;
tglnode-> next=NULL;
tglhead=tgllast=tglnode; /*//test
TIN=tglhead;
TINCreateOK=true;
PostMessage(WM_PAINT);
AfxMessageBox( "ok ");
//test   end*/ //expend   tin;
Linelist   *linetmp,*linetemp;
List   *pixeltmp;
double   x1,y1,x2,y2,x3,y3;
linetmp=linehead;
while(linetmp!=NULL)
{
if(linetmp-> line-> flag==true)
{
linetmp=linetmp-> next;
continue;
}
ln1=linetmp-> line;
pt1=linetmp-> line-> pixel1;
pt2=linetmp-> line-> pixel2;
x1=linetmp-> line-> pixel1-> x;
y1=linetmp-> line-> pixel1-> y;
x2=linetmp-> line-> pixel2-> x;
y2=linetmp-> line-> pixel2-> y;
x3=linetmp-> line-> pixel3-> x;
y3=linetmp-> line-> pixel3-> y; pixeltmp=list;
pt3=NULL;
while(pixeltmp!=NULL)
{
if(pixeltmp-> pixel==pt1   ||   pixeltmp-> pixel==pt2)
{
pixeltmp=pixeltmp-> next;
continue;
}
if(((y2-y1)*pixeltmp-> pixel-> x+(x1-x2)*pixeltmp-> pixel-> y+(x2*y1-x1*y2))
*((y2-y1)*x3+(x1-x2)*y3+(x2*y1-x1*y2))> =0)
{
pixeltmp=pixeltmp-> next;
continue;
}
if(pt3==NULL)pt3=pixeltmp-> pixel;
else
{
if((pow(MyMath.Calculate2PtDistanceIn2D(pt1-> x,pt1-> y,pixeltmp-> pixel-> x,pixeltmp-> pixel-> y),2)+pow(MyMath.Calculate2PtDistanceIn2D(pt2-> x,pt2-> y,pixeltmp-> pixel-> x,pixeltmp-> pixel-> y),2)-pow(MyMath.Calculate2PtDistanceIn2D(pt1-> x,pt1-> y,pt2-> x,pt2-> y),2))/(2*MyMath.Calculate2PtDistanceIn2D(pt1-> x,pt1-> y,pixeltmp-> pixel-> x,pixeltmp-> pixel-> y)*MyMath.Calculate2PtDistanceIn2D(pt2-> x,pt2-> y,pixeltmp-> pixel-> x,pixeltmp-> pixel-> y))
<(pow(MyMath.Calculate2PtDistanceIn2D(pt1-> x,pt1-> y,pt3-> x,pt3-> y),2)+pow(MyMath.Calculate2PtDistanceIn2D(pt2-> x,pt2-> y,pt3-> x,pt3-> y),2)-pow(MyMath.Calculate2PtDistanceIn2D(pt1-> x,pt1-> y,pt2-> x,pt2-> y),2))/(2*MyMath.Calculate2PtDistanceIn2D(pt1-> x,pt1-> y,pt3-> x,pt3-> y)*MyMath.Calculate2PtDistanceIn2D(pt2-> x,pt2-> y,pt3-> x,pt3-> y)))
{
pt3=pixeltmp-> pixel;
}
}
pixeltmp=pixeltmp-> next;
}
if(pt3!=NULL)
{
linetemp=linehead;
flag=false;
while(linetemp!=NULL)
{
if((pt1==linetemp-> line-> pixel1   &&   pt3==linetemp-> line-> pixel2)
||   (pt3==linetemp-> line-> pixel1   &&   pt1==linetemp-> line-> pixel2))
{
linetemp-> line-> flag=true;
flag=true;
break;
}
linetemp=linetemp-> next;
}
if(!flag)
{
linenode=new   Linelist;
linenode-> line=new   Line;
linenode-> line-> pixel1=pt3;
linenode-> line-> pixel2=pt1;
linenode-> line-> pixel3=pt2;
linenode-> line-> flag=false;
linenode-> next=NULL;
linelast-> next=linenode;
linelast=linenode;
ln2=linenode-> line;
}
linetemp=linehead;
flag=false;
while(linetemp!=NULL)
{
if((pt2==linetemp-> line-> pixel1   &&   pt3==linetemp-> line-> pixel2)
||   (pt3==linetemp-> line-> pixel1   &&   pt2==linetemp-> line-> pixel2))
{
linetemp-> line-> flag=true;
flag=true;
break;
}
linetemp=linetemp-> next;
}
if(!flag)
{
linenode=new   Linelist;
linenode-> line=new   Line;
linenode-> line-> pixel1=pt2;
linenode-> line-> pixel2=pt3;
linenode-> line-> pixel3=pt1;
linenode-> line-> flag=false;
linenode-> next=NULL;
linelast-> next=linenode;
linelast=linenode;
ln3=linenode-> line;
}
tglnode=new   Triangle;
tglnode-> line1=ln1;
tglnode-> line2=ln2;
tglnode-> line3=ln3;
tglnode-> next=NULL;
tgllast-> next=tglnode;
tgllast=tglnode; /*//test
TIN=tglhead;
TINCreateOK=true;
PostMessage(WM_PAINT);
AfxMessageBox( "ok ");
//test   end*/
}
linetmp-> line-> flag=true;
linetmp=linetmp-> next;
}
TIN=tglhead;
return   TIN;
}