/********************************************************/
/* coordcnv.c This file contains  functions for			*/
/* coordinate conversion.								*/
/* Alexander Kolesnikov.				*/
/********************************************************/





#include "coordcnv.h"

#include "geo_def.h"
#include "ykj.h"
#include "utm.h"
#include "kkj.h"

/*------------------------------------------------------*/
void ForwardTransform(TCoordinate *Coordinate,
					  TProjected *Projected,
					  TProjection Projection, int nCorrection)
{
	switch (Projection)
	{
		case pYKJ:
			YKJ_ForwardTransform(Coordinate,Projected, nCorrection);
			break;
		case pUTM:
			UTM_ForwardTransform(Coordinate,Projected);
			break;
		case pKKJ:
			KKJ_ForwardTransform(Coordinate,Projected, nCorrection);
			break;
	}
}

/*------------------------------------------------------*/

void InverseTransform(TProjected *Projected,
					  TCoordinate *Coordinate,
					  TProjection Projection, int nCorrection)
{
	switch (Projection)
	{
		case pYKJ:
			YKJ_InverseTransform(Projected,Coordinate, nCorrection);
			break;
		case pUTM:
			UTM_InverseTransform(Projected,Coordinate);
			break;
		case pKKJ:
			KKJ_InverseTransform(Projected,Coordinate, nCorrection);
			break;
	}
}

/*------------------------------------------------------*/

int calcZoneNum(TCoordinate *Coordinate, TProjection Projection)
{
	switch (Projection)
	{
		case pYKJ:
			return YKJ_calcZoneNum(Coordinate);
		case pUTM:
			return UTM_calcZoneNum(Coordinate);
		case pKKJ:
			return KKJ_calcZoneNum(Coordinate);
	}
	return -1;
}

/*
Coordinate ED50_to_WGS84(Coordinate coord_src) 
{
     Coordinate  coord_dst = NULL;
     Datum       datum_src =  NULL;
     Datum       datum_dst =  NULL;

     //datum_src = DatumManager.getDatum("European 1950");
     //datum_dst = DatumManager.getDatum("WGS84");

     double sc   =   1d/(1d - 2.062/1000000.0);
     double EPSx =   0.246;
     double EPSy =  -0.109;
     double EPSz =  -0.068;

     double DX =   -93.477;
     double DY =  -103.453;
     double DZ =  -123.431;

     //coord_src.setDatum(datum_src);
     //XYZ xyz = coord_src.toXYZ();


     // 3D Rotation
     xyz.shift(DX, DY, DZ);

     xyz.rotate3D(sc, EPSx, EPSy, EPSz);

     coord_dst = new Coordinate(coord_src);
     coord_dst = coord_dst.toCoordinate(xyz, datum_dst);

     
 	 return  coord_dst;
}
*/
/***************************************************************
**  2D Rotate in (X,Y, Z) space
**  &param  a is for x-rotation
**  &param  b is for y-rotation
**    X_2 =  a*X_1 - b*Y_1;
**    Y_2 =  b*X_1 + a*Y_1;
**************************************************************/
/*
void rotate3D(double scale, double EpsX, double EpsY, double EpsZ)   
{
      XYZ     xyz_dst = null;

      double  eX = SEC2RAD * EpsX;
      double  eY = SEC2RAD * EpsY;
      double  eZ = SEC2RAD * EpsZ;

      double Xr = scale * (    X + eZ*Y - eY*Z);
      double Yr = scale * (-eZ*X +    Y + eX*Z);
      double Zr = scale * ( eY*X - eX*Y +    Z);

      X = Xr;
      Y = Yr;
      Z = Zr;
}
*/
/***************************************************************
**  2D Rotate in (X,Y) plane
**  &param  a is for x-rotation
**  &param  b is for y-rotation
**    X_2 =  a*X_1 - b*Y_1;
**    Y_2 =  b*X_1 + a*Y_1;
**************************************************************/
/*
void rotate2D(double a, double b, )   
{
      double Xr =  a*X - b*Y;
      double Yr =  b*X + a*Y;

      this.X = Xr;
      this.Y = Yr;
}
*/
/***************************************************************
**  Shift coordinates in (X,Y,Z) space
**  &param  dX
**  &param  dX
**  &param  dX
**    X =  += dX;
**    Y =  += dY;
**    Z =  += dZ;
**************************************************************/
/*
void shift(double dX, double dY, double dZ)   
{
       X += dX;
       Y += dY;
       Z += dZ;
}
*/
