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]));
}