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