📄 t_tin.cpp
字号:
// T_TIN.cpp: implementation of the T_TIN class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "tin2.h"
#include "T_TIN.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
T_TIN::T_TIN()
{
}
T_TIN::~T_TIN()
{
}
double T_TIN::rand()
{
static long x=5;
static long y=11;
static long z=17;
x=(171*x)%30269;
y=(172*y)%30307;
z=(170*z)%30323;
long x1=x;
long y1=y;
long z1=z;
double T,R;
T=double(x1)/double(30269)+double(y1)/double(30307)+double(z1)/double(30323);
R=T-long(T);
return R;
}
double T_TIN::angle(T_line line,long p)
{
double c;
double a;
double b;
c=distance(line.p0,line.p1);
a=distance(line.p0,p);
b=distance(line.p1,p);
double z=0;
z=acos((b*b+a*a-c*c)/(2*a*b));
return z;
}
long T_TIN::Max(T_line line,vector<long> usableList)
{
long index=-1;
double xitaMax=0;
double xita=0;
for(long i=0;i<usableList.size();i++)
{
xita=angle(line,usableList[i]);
if(xitaMax<=xita)
{
xitaMax=xita;
index=usableList[i];
}
}
return index;
}
double T_TIN::F(T_line line, long p3)
{
T_point a0=pointList[line.p0];
T_point a1=pointList[line.p1];
T_point a2=pointList[p3];
double A=(a1.y-a0.y)/(a1.x-a0.x);
double B=(a1.x*a0.y-a0.x*a1.y)/(a1.x-a0.x);
double z=0;
z=a2.y-a2.x*A-B;
return z;
}
double T_TIN::distance(long p1,long p2)
{
double z=0;
if(p1!=p2)
{
T_point a1=pointList[p1];
T_point a2=pointList[p2];
z=sqrt((a1.x-a2.x)*(a1.x-a2.x)+(a1.y-a2.y)*(a1.y-a2.y));
}
return z;
}
void T_TIN::createpoint(int n)
{
for(long i=0;i<n;i++)
{
T_point point;
point.x=rand()*980;
point.y=rand()*600;
pointList.push_back(point);
}
}
void T_TIN::drawPoint(CDC *pDC)
{
for(int long i=0;i<pointList.size();i++)
{
CString s;
s.Format("%d",i);
int x=pointList[i].x;
int y=pointList[i].y;
pDC->TextOut(x,y,s);
}
}
void T_TIN::createTin()
{
vector<long> usalbePlointList;
//生成第0个三角形
T_tri tri;
long k=0;
//第L0边
T_line line0;
line0.p0=0;
line0.p1=1;
line0.useCount=1;
lineList.push_back(line0);
tri.L0=lineList.size()-1;
///////////
for(long i=2;i<pointList.size();i++)//生成可用点的连表
{
usalbePlointList.push_back(i);
}
long index=-1;
index=Max(line0,usalbePlointList);
//生成 L1,L2边
T_line line1;
T_line line2;
line1.p0=0;
line1.p1=index;
line1.useCount=1;
lineList.push_back(line1);
tri.L1=lineList.size()-1;
line2.p0=1;
line2.p1=index;
line2.useCount=1;
lineList.push_back(line2);
tri.L2=lineList.size()-1;
triList.push_back(tri);
//CString s;
//s.Format("连接顶点0,1,%d",index);
//AfxMessageBox(s);
/************************************
对于第k个三角形为拓展三角形时
****************************************/
while(1)
{
/****第L0边***/
if(lineList[triList[k].L0].useCount<2)//是可拓展边
{
//找拓展顶点
long tuo=-1;
if(lineList[triList[k].L0].p0==lineList[triList[k].L1].p0
||lineList[triList[k].L0].p1==lineList[triList[k].L1].p0)
tuo=lineList[triList[k].L1].p1;
if(lineList[triList[k].L0].p0==lineList[triList[k].L1].p1
||lineList[triList[k].L0].p1==lineList[triList[k].L1].p1)
tuo=lineList[triList[k].L1].p0;
usalbePlointList.clear();
double Fuhao=0;
double Fu=0;
Fuhao=F(lineList[triList[k].L0],tuo);
for(long i=0;i<pointList.size();i++)//找到可用的顶点
{
if( lineList[triList[k].L0].p0!=i //不是三角形的顶点
&&lineList[triList[k].L0].p1!=i
&&lineList[triList[k].L1].p0!=i
&&lineList[triList[k].L1].p1!=i
&&lineList[triList[k].L2].p0!=i
&&lineList[triList[k].L2].p1!=i)
{
Fu=F(lineList[triList[k].L0],i);
if(Fuhao*Fu<0)//异号
{
usalbePlointList.push_back(i);
}
}
}
if(usalbePlointList.size()>0)
{
int idx=-1;
idx=Max(lineList[triList[k].L0],usalbePlointList);
long lineIdx1=-1;
long lineIdx2=-1;
int cout1=0;
int cout2=0;
T_line line1;
T_line line2;
line1.p0=lineList[triList[k].L0].p0;
line1.p1=idx;
line2.p0=lineList[triList[k].L0].p1;
line2.p1=idx;
for(long i=0;i<lineList.size();i++)
{
if(line1==lineList[i])
{
lineIdx1=i;
cout1=lineList[lineIdx1].useCount;
}
if(line2==lineList[i])
{
lineIdx2=i;
cout2=lineList[lineIdx2].useCount;
}
}
if(cout1<2&&cout2<2)
{
T_tri tri;
tri.L0=triList[k].L0;
if(cout1==0)
{
T_line line;
line.p0=lineList[triList[k].L0].p0;
line.p1=idx;
line.useCount=1;
lineList.push_back(line);
tri.L1=lineList.size()-1;
}
if(cout1==1)
{
lineList[lineIdx1].useCount=2;
tri.L1=lineIdx1;
}
if(cout2==0)
{
T_line line;
line.p0=lineList[triList[k].L0].p1;
line.p1=idx;
line.useCount=1;
lineList.push_back(line);
tri.L2=lineList.size()-1;
}
if(cout2==1)
{
lineList[lineIdx2].useCount=2;
tri.L2=lineIdx2;
}
triList.push_back(tri);
}
}
lineList[triList[k].L0].useCount=2;
}
/****第L1边***/
if(lineList[triList[k].L1].useCount<2)
{
//找拓展顶点
long tuo=-1;
if(lineList[triList[k].L1].p0==lineList[triList[k].L0].p0
||lineList[triList[k].L1].p1==lineList[triList[k].L0].p0)
tuo=lineList[triList[k].L0].p1;
if(lineList[triList[k].L1].p0==lineList[triList[k].L0].p1
||lineList[triList[k].L1].p1==lineList[triList[k].L0].p1)
tuo=lineList[triList[k].L0].p0;
usalbePlointList.clear();
double Fuhao=0;
double Fu=0;
Fuhao=F(lineList[triList[k].L1],tuo);
for(long i=0;i<pointList.size();i++)//找到可用的顶点
{
if( lineList[triList[k].L0].p0!=i //不是三角形的顶点
&&lineList[triList[k].L0].p1!=i
&&lineList[triList[k].L1].p0!=i
&&lineList[triList[k].L1].p1!=i
&&lineList[triList[k].L2].p0!=i
&&lineList[triList[k].L2].p1!=i)
{
Fu=F(lineList[triList[k].L1],i);
if(Fuhao*Fu<0)//异号
{
usalbePlointList.push_back(i);
}
}
}
if(usalbePlointList.size()>0)
{
int idx=-1;
idx=Max(lineList[triList[k].L1],usalbePlointList);
long lineIdx1=-1;
long lineIdx2=-1;
int cout1=0;
int cout2=0;
T_line line1;
T_line line2;
line1.p0=lineList[triList[k].L1].p0;
line1.p1=idx;
line2.p0=lineList[triList[k].L1].p1;
line2.p1=idx;
for(long i=0;i<lineList.size();i++)
{
if(line1==lineList[i])
{
lineIdx1=i;
cout1=lineList[lineIdx1].useCount;
}
if(line2==lineList[i])
{
lineIdx2=i;
cout2=lineList[lineIdx2].useCount;
}
}
if(cout1<2&&cout2<2)
{
T_tri tri;
tri.L0=triList[k].L1;
if(cout1==0)
{
T_line line;
line.p0=lineList[triList[k].L1].p0;
line.p1=idx;
line.useCount=1;
lineList.push_back(line);
tri.L1=lineList.size()-1;
}
if(cout1==1)
{
lineList[lineIdx1].useCount=2;
tri.L1=lineIdx1;
}
if(cout2==0)
{
T_line line;
line.p0=lineList[triList[k].L1].p1;
line.p1=idx;
line.useCount=1;
lineList.push_back(line);
tri.L2=lineList.size()-1;
}
if(cout2==1)
{
lineList[lineIdx2].useCount=2;
tri.L2=lineIdx2;
}
triList.push_back(tri);
}
}
lineList[triList[k].L1].useCount=2;
}
/****第L2边***/
if(lineList[triList[k].L2].useCount<2)
{
//找拓展顶点
long tuo=-1;
if(lineList[triList[k].L2].p0==lineList[triList[k].L0].p0
||lineList[triList[k].L2].p1==lineList[triList[k].L0].p0)
tuo=lineList[triList[k].L0].p1;
if(lineList[triList[k].L2].p0==lineList[triList[k].L0].p1
||lineList[triList[k].L2].p1==lineList[triList[k].L0].p1)
tuo=lineList[triList[k].L0].p0;
usalbePlointList.clear();
double Fuhao=0;
double Fu=0;
Fuhao=F(lineList[triList[k].L2],tuo);
for(long i=0;i<pointList.size();i++)//找到可用的顶点
{
if( lineList[triList[k].L0].p0!=i //不是三角形的顶点
&&lineList[triList[k].L0].p1!=i
&&lineList[triList[k].L1].p0!=i
&&lineList[triList[k].L1].p1!=i
&&lineList[triList[k].L2].p0!=i
&&lineList[triList[k].L2].p1!=i)
{
Fu=F(lineList[triList[k].L2],i);
if(Fuhao*Fu<0)//异号
{
usalbePlointList.push_back(i);
}
}
}
if(usalbePlointList.size()>0)
{
int idx=-1;
idx=Max(lineList[triList[k].L2],usalbePlointList);
long lineIdx1=-1;
long lineIdx2=-1;
int cout1=0;
int cout2=0;
T_line line1;
T_line line2;
line1.p0=lineList[triList[k].L2].p0;
line1.p1=idx;
line2.p0=lineList[triList[k].L2].p1;
line2.p1=idx;
for(long i=0;i<lineList.size();i++)
{
if(line1==lineList[i])
{
lineIdx1=i;
cout1=lineList[lineIdx1].useCount;
}
if(line2==lineList[i])
{
lineIdx2=i;
cout2=lineList[lineIdx2].useCount;
}
}
if(cout1<2&&cout2<2)
{
T_tri tri;
tri.L0=triList[k].L2;
if(cout1==0)
{
T_line line;
line.p0=lineList[triList[k].L2].p0;
line.p1=idx;
line.useCount=1;
lineList.push_back(line);
tri.L1=lineList.size()-1;
}
if(cout1==1)
{
lineList[lineIdx1].useCount=2;
tri.L1=lineIdx1;
}
if(cout2==0)
{
T_line line;
line.p0=lineList[triList[k].L2].p1;
line.p1=idx;
line.useCount=1;
lineList.push_back(line);
tri.L2=lineList.size()-1;
}
if(cout2==1)
{
lineList[lineIdx2].useCount=2;
tri.L2=lineIdx2;
}
triList.push_back(tri);
}
}
lineList[triList[k].L2].useCount=2;
}
/***************************************/
k++;
if(k==triList.size())
{
CString s("good boy!");
AfxMessageBox(s);
break;
}
}
}
void T_TIN::draw(CDC*pDC)
{
/***********************************
for(long i=0;i<triList.size();i++)
{
T_tri tri=triList[i];
int x=pointList[tri.p0].x;
int y=pointList[tri.p0].y;
pDC->MoveTo(x,y);
x=pointList[tri.p1].x;
y=pointList[tri.p1].y;
pDC->LineTo(x,y);
x=pointList[tri.p2].x;
y=pointList[tri.p2].y;
pDC->LineTo(x,y);
x=pointList[tri.p0].x;
y=pointList[tri.p0].y;
pDC->LineTo(x,y);
}
**********************************/
for(long j=0;j<lineList.size();j++)
{
T_line line;
line=lineList[j];
int x=pointList[line.p0].x;
int y=pointList[line.p0].y;
pDC->MoveTo(x,y);
x=pointList[line.p1].x;
y=pointList[line.p1].y;
pDC->LineTo(x,y);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -