不是我写的,仅分享学习!书上配套,如有侵权,速删
与测绘程序设计配套(C++) 角度转换类
代码:
Angle.h (CAngle.h):
#pragma once
enum AngleStyle
{
DEG,
DMS,
RAD
};
class Angle
{
public:
Angle(double value=0,AngleStyle style=DMS);
~Angle(void);
private:
double dValue;
AngleStyle nCurStyle;
private:
double Deg(double dDms) const;
double Dms(double dDeg) const;
public:
double& operator() (AngleStyle style);
double operator() (AngleStyle style) const;
friend Angle operator + (const Angle& m1,const Angle& m2);
friend Angle operator - (const Angle& m1,const Angle& m2);
};
Angle.cpp (CAngle.cpp):
#include "StdAfx.h"
#include "Angle.h"
#include "math.h"
const double EPSILON=1.0E-12;
const double PI=4.0*atan(1.0);
Angle::Angle(double value,AngleStyle style)
{
dValue=value;
nCurStyle=style;
}
Angle::~Angle(void)
{
}
double& Angle::operator() (AngleStyle style)
{
if(style==DMS)
{
if(nCurStyle==DEG)
{
dValue=Dms(dValue);
}
else if(nCurStyle==RAD)
{
dValue=Dms(dValue*180.0/PI);
}
nCurStyle=DMS;
}
else if(style==DEG)
{
if(nCurStyle==DMS)
{
dValue=Deg(dValue);
}
else if(nCurStyle==RAD)
{
dValue=dValue*180.0/PI;
}
nCurStyle=DEG;
}
else
{
if(nCurStyle==DMS)
{
dValue=Deg(dValue)*PI/180;
}
else if(nCurStyle==DEG)
{
dValue=dValue*PI/180;
}
nCurStyle=RAD;
}
return dValue;
}
double Angle::operator() (AngleStyle style) const
{
double dAngleValue;
if(style==DMS)
{
if(nCurStyle==DEG)
{
dAngleValue=Dms(dValue);
}
else if(nCurStyle==RAD)
{
dAngleValue=Dms(dValue*180.0/PI);
}
else
{
dAngleValue=dValue;
}
}
else if(style==DEG)
{
if(nCurStyle==DMS)
{
dAngleValue=Deg(dValue);
}
else if(nCurStyle==RAD)
{
dAngleValue=dValue*180.0/PI;
}
else
{
dAngleValue=dValue;
}
}
else
{
if(nCurStyle==DMS)
{
dAngleValue=Deg(dValue)*PI/180;
}
else if(nCurStyle==DEG)
{
dAngleValue=dValue*PI/180;
}
else
{
dAngleValue=dValue;
}
}
return dAngleValue;
}
double Angle::Deg(double dDms) const
{
int iDeg,iMin;
double dSec;
iDeg = int(dDms + EPSILON);
iMin = int((dDms - iDeg) * 100+ EPSILON);
dSec = ((dDms - iDeg) * 100 - iMin) * 100 ;
return iDeg + (double)iMin / 60 + dSec / 3600;
}
double Angle::Dms(double dDeg) const
{
int iDeg,iMin;
double dSec;
double dTmp;
iDeg = int(dDeg + EPSILON);
dTmp = (dDeg - iDeg) * 60;
iMin = int(dTmp+ EPSILON);
dSec = (dTmp - iMin) * 60;
return iDeg + (double)iMin / 100 + dSec / 10000;
}
Angle operator + (const Angle& m1,const Angle& m2)
{
Angle addAngle(0,RAD);
addAngle(RAD)=m1(RAD)+m2(RAD);
return addAngle;
}
Angle operator - (const Angle& m1,const Angle& m2)
{
Angle subAngle(0,RAD);
subAngle(RAD)=m1(RAD)-m2(RAD);
return subAngle;
}