METHODPREFIX
Point<ScalarParam,dimensionParam>
ProjectiveTransformationOperationsBase<ScalarParam,dimensionParam>::inverseTransformP(
	const Matrix<ScalarParam,dimensionParam+1,dimensionParam+1>& m,
	const Point<ScalarParam,dimensionParam>& p)
	{
	/* Create the extended matrix: */
	double temp[dimensionParam+1][dimensionParam+2];
	for(int i=0;i<dimensionParam;++i)
		{
		for(int j=0;j<=dimensionParam;++j)
			temp[i][j]=m(i,j);
		temp[i][dimensionParam+1]=double(p[i]);
		}
	for(int j=0;j<=dimensionParam;++j)
		temp[dimensionParam][j]=m(dimensionParam,j);
	temp[dimensionParam][dimensionParam+1]=ScalarParam(1);
	
	/* Perform Gaussian elimination with column pivoting on the extended matrix: */
	gaussElimination<dimensionParam+1,dimensionParam+2>(temp);
	
	/* Return the result point: */
	Point<ScalarParam,dimensionParam> result;
	temp[dimensionParam][dimensionParam+1]/=temp[dimensionParam][dimensionParam];
	for(int i=dimensionParam-1;i>=0;--i)
		{
		for(int j=i+1;j<=dimensionParam;++j)
			temp[i][dimensionParam+1]-=temp[i][j]*temp[j][dimensionParam+1];
		temp[i][dimensionParam+1]/=temp[i][i];
		result[i]=ScalarParam(temp[i][dimensionParam+1]/temp[dimensionParam][dimensionParam+1]);
		}
	return result;
	}
void calcRadiusPos(ScalarParam latitude,ScalarParam longitude,ScalarParam radius,double scaleFactor,ScalarParam pos[3])
	{
	double s0=Math::sin(double(latitude));
	double c0=Math::cos(double(latitude));
	double r=radius*scaleFactor;
	double xy=r*c0;
	double s1=Math::sin(double(longitude));
	double c1=Math::cos(double(longitude));
	pos[0]=ScalarParam(xy*c1);
	pos[1]=ScalarParam(xy*s1);
	pos[2]=ScalarParam(r*s0);
	}
Exemplo n.º 3
0
namespace Geometry {

/******************************
Static elements of class Point:
******************************/

template <class ScalarParam,int dimensionParam>
const Point<ScalarParam,dimensionParam> Point<ScalarParam,dimensionParam>::origin(ScalarParam(0));

#if !defined(NONSTANDARD_TEMPLATES)

/***************************************************************
Force instantiation of all standard Point classes and functions:
***************************************************************/

template const Point<int,2> Point<int,2>::origin;

template const Point<int,3> Point<int,3>::origin;

template const Point<float,2> Point<float,2>::origin;

template const Point<float,3> Point<float,3>::origin;

template const Point<double,2> Point<double,2>::origin;

template const Point<double,3> Point<double,3>::origin;

#endif

}
void calcDepthPos(ScalarParam latitude,ScalarParam longitude,ScalarParam depth,double scaleFactor,ScalarParam pos[3])
	{
	/* Constant parameters for geoid formula: */
	const double a=6378.14e3; // Equatorial radius in m
	const double f=1.0/298.247; // Geoid flattening factor
	
	double s0=Math::sin(double(latitude));
	double c0=Math::cos(double(latitude));
	double r=(a*(1.0-f*Math::sqr(s0))-depth)*scaleFactor;
	double xy=r*c0;
	double s1=Math::sin(double(longitude));
	double c1=Math::cos(double(longitude));
	pos[0]=ScalarParam(xy*c1);
	pos[1]=ScalarParam(xy*s1);
	pos[2]=ScalarParam(r*s0);
	}
void glLoadMatrix(const Geometry::AffineTransformation<ScalarParam,3>& t)
{
    /* Copy the transformation coefficients into a temporary array: */
    ScalarParam temp[16];
    const typename Geometry::AffineTransformation<ScalarParam,3>::Matrix& m=t.getMatrix();
    ScalarParam* tPtr=temp;
    for(int j=0;j<4;++j)
    {
        for(int i=0;i<3;++i,++tPtr)
            *tPtr=m(i,j);
        *tPtr=ScalarParam(0);
        ++tPtr;
    }
    temp[15]=ScalarParam(1);
    
    /* Upload the temporary array: */
    glLoadMatrix(temp);
}
METHODPREFIX OrthonormalTransformation<ScalarParam,dimensionParam>::OrthonormalTransformation(const RotationTransformation<SourceScalarParam,dimensionParam>& source)
	:translation(ScalarParam(0)),rotation(source.getRotation())
	{
	}