//
//Author			: walk.ly  
//Time			: 2009-05-08
//Version		: 1.0.0
//Description	: 度分秒与弧度转换	
//

#ifndef __ANGLE_PTOR_
#define __ANGLE_PTOR_

#ifdef _VS_WALK
#include "wkClassDefine.h"
#endif

#include "单进双不进.cpp"

/* ***********************************************************
	引出函数：

	【度分秒与度转换】
double dms_deg(double dms);

	【将度、分、秒转换为ddd.mmssss值】
double d_m_s_dms(int d, int m, double s, int secDec);

	【度转换为度分秒】
double deg_dms(double deg, int secDec);

	【度转换为弧度】
double deg_rad(double deg);

	【弧段转换为度】
double rad_deg(double rad);

	【将角度调整到0～360】
double AdjAngle0_360(double angle);

	【推导方位角（以度为单位）】
double CalT(double T0, double angle, bool bLeftA);

	【由一组观测角推求终点方位角（以度为单位）】
double CalTs(double t0, array &angles, bool bLeftA);


	【直角坐标转极坐标】
void rtop(double dN, double dE, double &r, double &a);

	【极坐标转直角坐标】
void ptor(double r, double a, double &dN, double &dE);

*********************************************************** */

double pai=3.141592653589793;

//*******************************************
//	度分秒与度以及弧度间的转换
//*******************************************

//【度分秒与度转换】
//	度分秒的数值表达形式：ddd.mmssss
//		如: 123度5分21.35秒，表达为：123.052135
//	将其转换为度：
double dms_deg(double dms)
{
	bool bNormal = dms<0? false:true;
	if (!bNormal)
		dms=abs(dms);

	int d=dms;
	int m=100.0*(dms-d);
	double s=(dms-d-0.01*m)*10000.0;

	//【将度、分、秒转换为度】
	double deg=d+m/60.0+s/3600.0;

	return bNormal? deg: -deg;
}

//【将度、分、秒转换为ddd.mmssss值】
double d_m_s_dms(int d, int m, double s, int secDec)
{
	//若秒=60则向分进位
	int dif=((round5(s, secDec)-60.0)*pow(10, secDec)+0.1);
	if (dif >= 0)
	{
		m++; s=round5(s-60.0, secDec);
	}

	//若分>=60则向度进位
	if (m>=60)
	{
		d++; m-=60;
	}

	//转换为度分秒格式
	double dms=1.0*d + 0.01*m + 0.0001*s;
	return round5(dms, secDec+4);
}

//【度转换为度分秒】
//	secDec: 秒所保留的小数位数，如对23.33秒保留1位=23.3秒
double deg_dms(double deg, int secDec)
{
	bool bNormal = deg<0? false:true;
	if (!bNormal)
		deg=abs(deg);

	int d=deg;
	double s=3600.0*(deg-d);
	int m=s/60.0;
	s= round5(s-60.0*m, secDec);

	double dms=d_m_s_dms(d,m,s, secDec);

	return bNormal? dms: -dms;
}

//【度转换为弧度】
double deg_rad(double deg)
{
	double rad=deg/180.0*pai;
	return rad;
}

//【弧段转换为度】
double rad_deg(double rad)
{
	double deg=rad*180.0/pai;
	return deg;
}

//将角度调整到0～360
double AdjAngle0_360(double angle)
{
	while(angle<0) angle+=360.0;
	while(angle>360.0) angle-=360;
	return angle;
}

//推导方位角（以度为单位）
double CalT(double T0, double angle, bool bLeftA)
{
	double t;
	if (bLeftA)
		t= T0+angle-180.0;
	else
		t= T0-angle+180.0;
	return AdjAngle0_360(t);
}

//由一组观测角推求终点方位角（以度为单位）
double CalTs(double t0, array &angles, bool bLeftA)
{
	for (int i=0; i<angles.getSize(); i++)
		t0=CalT(t0, angles[i], bLeftA);
	return t0;
}


//*******************************************
//	直角坐标与极坐标转换
//*******************************************

//【直角坐标转极坐标】
void rtop(double dN, double dE, double &r, double &a)
{
	r=sqrt(dN*dN+dE*dE);
	a=atan2(dE, dN);
}

//【极坐标转直角坐标】
void ptor(double r, double a, double &dN, double &dE)
{
	dN=r*cos(a);
	dE=r*sin(a);
}

#endif //__ANGLE_PTOR_
