www.pudn.com > MeshProcess.rar > Tri3D.cpp


// Tri3D.cpp: implementation of the CTri3D class. 
// 
////////////////////////////////////////////////////////////////////// 
 
#include "stdafx.h" 
#include "Tri3D.h" 
#include "math.h" 
 
#ifdef _DEBUG 
#undef THIS_FILE 
static char THIS_FILE[]=__FILE__; 
#define new DEBUG_NEW 
#endif 
 
////////////////////////////////////////////////////////////////////// 
// Construction/Destruction 
////////////////////////////////////////////////////////////////////// 
 
CTri3D::CTri3D() 
{ 
	ctgangle[0]=0.0;ctgangle[1]=0.0;ctgangle[2]=0.0; 
	edgelength[0]=0.0;edgelength[1]=0.0;edgelength[2]=0.0; 
	halftgangle[0]=0.0;halftgangle[2]=0.0;halftgangle[2]=0.0; 
	normal[0]=0.0;normal[1]=0.0;normal[2]=0.0; 
	normidx[0]=0;normidx[1]=0;normidx[2]=0;     
	veridx[2]=0;veridx[0]=0;veridx[2]=0; 
	triarea=0.0; 
} 
 
CTri3D::~CTri3D() 
{ 
 
} 
 
void CTri3D::CompCtgangle(CVer3D ver3d[]) 
{ 
	double l0,l1,l2,cosangle,sinangle,tarea; 
	l0=(ver3d[veridx[1]].x-ver3d[veridx[2]].x)*(ver3d[veridx[1]].x-ver3d[veridx[2]].x)+ 
	   (ver3d[veridx[1]].y-ver3d[veridx[2]].y)*(ver3d[veridx[1]].y-ver3d[veridx[2]].y)+ 
	   (ver3d[veridx[1]].z-ver3d[veridx[2]].z)*(ver3d[veridx[1]].z-ver3d[veridx[2]].z); 
	l1=(ver3d[veridx[0]].x-ver3d[veridx[2]].x)*(ver3d[veridx[0]].x-ver3d[veridx[2]].x)+ 
	   (ver3d[veridx[0]].y-ver3d[veridx[2]].y)*(ver3d[veridx[0]].y-ver3d[veridx[2]].y)+ 
	   (ver3d[veridx[0]].z-ver3d[veridx[2]].z)*(ver3d[veridx[0]].z-ver3d[veridx[2]].z); 
	l2=(ver3d[veridx[0]].x-ver3d[veridx[1]].x)*(ver3d[veridx[0]].x-ver3d[veridx[1]].x)+ 
	   (ver3d[veridx[0]].y-ver3d[veridx[1]].y)*(ver3d[veridx[0]].y-ver3d[veridx[1]].y)+ 
	   (ver3d[veridx[0]].z-ver3d[veridx[1]].z)*(ver3d[veridx[0]].z-ver3d[veridx[1]].z); 
	cosangle=(l0+l1-l2)/(2*sqrt(l0)*sqrt(l1)); 
	sinangle=sqrt(1-cosangle*cosangle); 
	tarea=0.5*sqrt(l0)*sqrt(l1)*sinangle; 
	ctgangle[0]=(l1+l2-l0)/tarea; 
	ctgangle[1]=(l0+l2-l1)/tarea; 
	ctgangle[2]=(l0+l1-l2)/tarea; 
	halftgangle[2]=sinangle/(1+cosangle); 
	cosangle=(l0+l2-l1)/(2*sqrt(l0)*sqrt(l2)); 
	sinangle=sqrt(1-cosangle*cosangle); 
	halftgangle[1]=sinangle/(1+cosangle); 
	cosangle=(l2+l1-l0)/(2*sqrt(l2)*sqrt(l1)); 
	sinangle=sqrt(1-cosangle*cosangle); 
	halftgangle[0]=sinangle/(1+cosangle); 
	edgelength[0]=sqrt(l0); 
	edgelength[1]=sqrt(l1); 
	edgelength[2]=sqrt(l2);	 
} 
 
void CTri3D::CompNormale(CVer3D ver3d[]) 
{ 
	double ax,ay,az,bx,by,bz,len; 
	ax=ver3d[veridx[0]].x-ver3d[veridx[1]].x; 
	ay=ver3d[veridx[0]].y-ver3d[veridx[1]].y; 
	az=ver3d[veridx[0]].z-ver3d[veridx[1]].z; 
	bx=ver3d[veridx[1]].x-ver3d[veridx[2]].x; 
	by=ver3d[veridx[1]].y-ver3d[veridx[2]].y; 
	bz=ver3d[veridx[1]].z-ver3d[veridx[2]].z; 
//	normal[0]=-(ay*bz-az*by); 
//	normal[1]=-(az*bx-ax*bz); 
//  normal[2]=-(ax*by-ay*bx);	 
	 
	normal[0]=ay*bz-az*by; 
	normal[1]=az*bx-ax*bz; 
    normal[2]=ax*by-ay*bx;	 
	len=(sqrt)(normal[0]*normal[0]+normal[1]*normal[1]+normal[2]*normal[2]); 
	if(len<1e-6) 
	{ 
		normal[0]=0; 
		normal[1]=0; 
		normal[2]=0; 
	} 
	else 
	{ 
		normal[0]/=len; 
		normal[1]/=len; 
		normal[2]/=len; 
 
	} 
} 
void CTri3D::CompEdgeLeng(CVer3D ver3d[]) 
{ 
    double l0=(ver3d[veridx[1]].x-ver3d[veridx[2]].x)*(ver3d[veridx[1]].x-ver3d[veridx[2]].x)+ 
	          (ver3d[veridx[1]].y-ver3d[veridx[2]].y)*(ver3d[veridx[1]].y-ver3d[veridx[2]].y)+ 
	          (ver3d[veridx[1]].z-ver3d[veridx[2]].z)*(ver3d[veridx[1]].z-ver3d[veridx[2]].z); 
	double l1=(ver3d[veridx[0]].x-ver3d[veridx[2]].x)*(ver3d[veridx[0]].x-ver3d[veridx[2]].x)+ 
	          (ver3d[veridx[0]].y-ver3d[veridx[2]].y)*(ver3d[veridx[0]].y-ver3d[veridx[2]].y)+ 
			  (ver3d[veridx[0]].z-ver3d[veridx[2]].z)*(ver3d[veridx[0]].z-ver3d[veridx[2]].z); 
	double l2=(ver3d[veridx[0]].x-ver3d[veridx[1]].x)*(ver3d[veridx[0]].x-ver3d[veridx[1]].x)+ 
			  (ver3d[veridx[0]].y-ver3d[veridx[1]].y)*(ver3d[veridx[0]].y-ver3d[veridx[1]].y)+ 
	          (ver3d[veridx[0]].z-ver3d[veridx[1]].z)*(ver3d[veridx[0]].z-ver3d[veridx[1]].z); 
    edgelength[0]=sqrt(l0); 
	edgelength[1]=sqrt(l1); 
	edgelength[2]=sqrt(l2);	 
} 
 
void CTri3D::CompArea() 
{ 
	double p=0.5*(edgelength[0]+edgelength[1]+edgelength[2]); 
	triarea=sqrt(p*(p-edgelength[0])*(p-edgelength[1])*(p-edgelength[2])); 
}