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); }
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()) { }