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


// Ver3D.cpp: implementation of the CVer3D 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 
////////////////////////////////////////////////////////////////////// 
 
CVer3D::CVer3D() 
{ 
	cp=0; 
	GauCurvature=0.0; 
	MeanCurvature=0.0; 
	i=0; 
	internode=0; 
	nfa=0; 
	triidx[0]=0;triidx[1]=0;triidx[2]=0; 
	x=0.0;y=0.0;z=0.0; 
    normale[0]=0.0;normale[1]=0.0;normale[2]=0.0; 
	dec_part=-1; 
} 
 
CVer3D::~CVer3D() 
{ 
 
} 
 
int CVer3D::IntorOut(int n, CTri3D face3d[]) 
{ 
	int l=1; 
	int i=0; 
	int j; 
	int j1=0; 
	int j2=0; 
	int n1,n2; 
    while(l==1&&i<=nfa-1) 
		{ j1=0;j2=0; 
		  if(n==face3d[triidx[i]].veridx[0]) 
			{n1=face3d[triidx[i]].veridx[1];n2=face3d[triidx[i]].veridx[2];} 
	      else if(n==face3d[triidx[i]].veridx[1]) 
			{n1=face3d[triidx[i]].veridx[2];n2=face3d[triidx[i]].veridx[0];} 
		  else if(n==face3d[triidx[i]].veridx[2]) 
			{n1=face3d[triidx[i]].veridx[0];n2=face3d[triidx[i]].veridx[1];} 
		  for(j=0;j<=nfa-1;j++) 
			{ 
			 if((n1==face3d[triidx[j]].veridx[0]||n1==face3d[triidx[j]].veridx[1])||(n1==face3d[triidx[j]].veridx[2])) 
			  j1=j1+1; 
		     if((n2==face3d[triidx[j]].veridx[0]||n2==face3d[triidx[j]].veridx[1])||(n2==face3d[triidx[j]].veridx[2])) 
			  j2=j2+1; 
			} 
		  i++; 
		  if(j1==1||j2==1) 
			  l=0; 
		} 
	internode=l; 
	return l; 
 
 
} 
 
void CVer3D::CompGaussianCurvature(int numi,CTri3D face3d[]) 
{ 
	int i; 
	double ctgang,surangle[100],sumarea=0.0; 
	double adj_normale[100][3],adj_area[100]; 
//	if(internode==1) 
//	{ 
		for(i=0;i<=nfa-1;i++) 
		{ 
			adj_normale[i][0]=face3d[triidx[i]].normal[0]; 
			adj_normale[i][1]=face3d[triidx[i]].normal[1]; 
            adj_normale[i][2]=face3d[triidx[i]].normal[2]; 
			adj_area[i]=face3d[triidx[i]].triarea; 
			sumarea+=face3d[triidx[i]].triarea;	 
			 
			if(numi==face3d[triidx[i]].veridx[0]) 
			{ 
				adj_vertex[i]=face3d[triidx[i]].veridx[1]; 
				ctgang=face3d[triidx[i]].ctgangle[0]*0.25; 
				if((fabs(ctgang))<1e-6) 
					surangle[i]=PI/2.0; 
				else 
				{ 
					surangle[i]=atan(1.0/ctgang); 
					if(surangle[i]<0) 
						surangle[i]+=PI; 
				} 
			} 
			else if(numi==face3d[triidx[i]].veridx[1]) 
			{ 
				adj_vertex[i]=face3d[triidx[i]].veridx[2]; 
				ctgang=face3d[triidx[i]].ctgangle[1]*0.25; 
				if((fabs(ctgang))<1e-6) 
					surangle[i]=PI/2.0; 
				else 
				{ 
					surangle[i]=atan(1.0/ctgang); 
					if(surangle[i]<0) 
						surangle[i]+=PI; 
				} 
			} 
			else 
			{ 
				adj_vertex[i]=face3d[triidx[i]].veridx[0]; 
				ctgang=face3d[triidx[i]].ctgangle[2]*0.25; 
				if((fabs(ctgang))<1e-6) 
					surangle[i]=PI/2.0; 
				else 
				{ 
					surangle[i]=atan(1.0/ctgang); 
					if(surangle[i]<0) 
						surangle[i]+=PI; 
				} 
			} 
		} 
		ctgang=0; 
		GauCurvature=0; 
		for(i=0;i<=nfa-1;i++) 
			ctgang+=surangle[i]; 
		if(internode==1) 
		{ 
			GauCurvature=(2*PI-ctgang);//*3/(sumarea); 
		} 
		else 
		{ 
			GauCurvature=(PI-ctgang);//*3/(sumarea);			 
		} 
		for(i=0;i<=nfa-1;i++) 
		{ 
			normale[0]+=adj_normale[i][0]*adj_area[i]/sumarea; 
			normale[1]+=adj_normale[i][1]*adj_area[i]/sumarea; 
			normale[2]+=adj_normale[i][2]*adj_area[i]/sumarea; 
		//	normale[0]+=adj_normale[i][0]/nfa; 
		//	normale[1]+=adj_normale[i][1]/nfa; 
		//	normale[2]+=adj_normale[i][2]/nfa; 
		} 
		double len=sqrt(normale[0]*normale[0]+normale[1]*normale[1]+normale[2]*normale[2]); 
		normale[0]=normale[0]/len; 
		normale[1]=normale[1]/len; 
		normale[2]=normale[2]/len; 
 
		norenergy=normale[0]*adj_normale[0][0]+normale[1]*adj_normale[0][1]+normale[2]*adj_normale[0][2]; 
		for(i=1; i< nfa; i++) 
		{ 
		     double ienergy=normale[0]*adj_normale[i][0]+normale[1]*adj_normale[i][1]+normale[2]*adj_normale[i][2]; 
			 if(norenergy