www.pudn.com > View3D.zip > GA_lib.cpp
#include "GA_lib.h"
//calculate a triangle's normal ,it three points is v1,v2,v3
//return normal is stored in n
float GeometryAlgo::CalcNormFloat( float *v1, float *v2, float *v3, float *n)
{
float n1[3],n2[3];
n1[0]= v1[0]-v2[0];
n2[0]= v2[0]-v3[0];
n1[1]= v1[1]-v2[1];
n2[1]= v2[1]-v3[1];
n1[2]= v1[2]-v2[2];
n2[2]= v2[2]-v3[2];
n[0]= n1[1]*n2[2]-n1[2]*n2[1];
n[1]= n1[2]*n2[0]-n1[0]*n2[2];
n[2]= n1[0]*n2[1]-n1[1]*n2[0];
return GAMath::Normalise(n);
}
//calculate angle p1,p2,p3
float GeometryAlgo::CalcAngle3P(float *p1, float *p2, float *p3)
{
float v1[3];
float v2[3];
v1[0] = p1[0] - p2[0];
v1[1] = p1[1] - p2[1];
v1[2] = p1[2] - p2[2];
v2[0] = p3[0] - p2[0];
v2[1] = p3[1] - p2[1];
v2[2] = p3[2] - p2[2];
float dot = v1[0]*v2[0]+v1[1]*v2[1]+v1[2]*v2[2];
float len = (v1[0]*v1[0]+v1[1]*v1[1]+v1[2]*v1[2])*
(v2[0]*v2[0]+v2[1]*v2[1]+v2[2]*v2[2]);
len = sqrt(len);
float ret = acos(dot/len);
return ret;
}
//calculate the area of a triangle
float GeometryAlgo::AreaTriangle(float *p1, float *p2, float *p3)
{
float v1[3],v2[3];
GAMath::Subtract(v1,p1,p2);
GAMath::Subtract(v2,p3,p2);
float c[3];
GAMath::Crossf(c,v1,v2);
float area = c[0]*c[0]+c[1]*c[1]+c[2]*c[2];
area = (float)sqrt(area);
return area/2.0;
}
//calculate distance^2 of two points
float GeometryAlgo::Distance2(float * p1, float * p2)
{
float ret;
ret = (p1[0]-p2[0])*(p1[0]-p2[0])+(p1[1]-p2[1])*(p1[1]-p2[1])+(p1[2]-p2[2])*(p1[2]-p2[2]);
return ret;
}
//calculate distance of two points
float GeometryAlgo::Distance(float * p1, float * p2)
{
float ret;
ret = (p1[0]-p2[0])*(p1[0]-p2[0])+(p1[1]-p2[1])*(p1[1]-p2[1])+(p1[2]-p2[2])*(p1[2]-p2[2]);
ret = (float)sqrt(ret);
return ret;
}