⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 t_tin.cpp

📁 tin的生成,速度非常快.TIN10000point只用1分36秒
💻 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 + -