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