📄 wzjcooang.cpp
字号:
// WzjCooAng.cpp: implementation of the CWzjCooAng class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "WzjCooAng.h"
#define PI 3.14159265
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CWzjCooAng::CWzjCooAng()
{
}
//角度构造对象
CWzjCooAng::CWzjCooAng(double fAngle):m_fAngle(fAngle)
{
}
//坐标构造对象
CWzjCooAng::CWzjCooAng(double x1,double y1,double x2,double y2):m_x1(x1),m_y1(y1),m_x2(x2),m_y2(y2)
{
}
//设置角度
void CWzjCooAng::SetAngle(double fAngle)
{
m_fAngle = fAngle;
}
//获得角度
double CWzjCooAng::GetAngle()
{
return m_fAngle;
}
//设置坐标
void CWzjCooAng::SetCoordinate(double x1,double y1,double x2,double y2)
{
m_x1 = x1; m_y1=y1;
m_x2 = x2; m_y2=y2;
}
//获取坐标
void CWzjCooAng::GetCoordinate(double& x1,double& y1,double& x2,double& y2)
{
x1 = m_x1; y1 = m_y1;
x2 = m_x2; y2 = m_y2;
}
//空析构函数
CWzjCooAng::~CWzjCooAng()
{
}
//六十进制转化为十进制
double CWzjCooAng::SexTranToDecAngle() const
{
double fAngle = m_fAngle;
int nAngleDeg = fAngle; //获取度值
fAngle = fabs(fAngle - nAngleDeg) * 100; //去掉度后整体扩大100倍使2位分成为整数部分
int nAngleMin = floor(fAngle); //获取分值
double nAngleSec = (fAngle - nAngleMin) * 100.0; //同样去掉分后扩大100倍就是秒值
if (nAngleDeg < 0) //如果角度为负
{
fAngle = nAngleDeg - nAngleMin / 60.0 - nAngleSec / 3600.0; //三部分分别转化
}
else //如果角度为正
{
fAngle = nAngleDeg + nAngleMin / 60.0 + nAngleSec / 3600.0; //三部分分别转化
}
return fAngle;
}
//六十进制转化为弧度制
double CWzjCooAng::SexTranToRadAngle() const
{
double fAngle = SexTranToDecAngle(); //六十进制转化为十进制角度
CWzjCooAng ang(fAngle); //用新的角度定义对象
return ang.DecTranToRadAngle(); //十进制转化为弧度制
}
double CWzjCooAng::DecTranToSexAngle() const
{
double fAngle = m_fAngle;
//绝对值增加一个小值,为了输出六十进制角度时不输出60秒
if (fAngle < 0)
{
fAngle -= 1.0e-8;
}
else if(fAngle > 0)
{
fAngle += 1.0e-8;
}
int nArray[2]; //保存度和分花为10进制后的值
nArray[0] = fAngle; //获取度值
fAngle = fabs(fAngle - nArray[0]) * 60; //去掉度获得以分为单位的角度值
nArray[1] = fAngle; //保存整分值
fAngle = fabs(fAngle - nArray[1]) * 60.0; //去掉分后转化为以秒为单位的角度值
if (m_fAngle<0) //如果角度为负
{
fAngle = 1.0 * nArray[0] - 0.01 * nArray[1] - fAngle * 0.0001;
}
else //如果角度为正
{
fAngle = 1.0 * nArray[0] + 0.01 * nArray[1] + fAngle * 0.0001;
}
return fAngle;
}
//十进制转化为弧度制角度
double CWzjCooAng::DecTranToRadAngle() const
{
return m_fAngle * PI / 180;
}
//弧度制转化为十进制角度
double CWzjCooAng::RadTranToDecAngle() const
{
return m_fAngle * 180.0 / PI;
}
//弧度制转化为六十进制角度
double CWzjCooAng::RadTranToSexAngle() const
{
double fAngle = RadTranToDecAngle(); //弧度制转化为十进制角度
CWzjCooAng ang(fAngle); //以新的角度定义对象
return ang.DecTranToSexAngle(); //十进制角度转化为六十进制角度
}
//获得距离
double CWzjCooAng::GetDistance() const
{
return sqrt((m_x1 - m_x2) * (m_x1 - m_x2) + (m_y1 - m_y2) * (m_y1 - m_y2));
}
//获得方位角,第一点指向第二点
double CWzjCooAng::GetDirAng() const
{
double fQuaAng = 0.0;
//如果两个坐标相同,特殊处理
if ((fabs(m_y2-m_y1) < 10e-8) && (fabs(m_x2-m_x1) < 1e-8))
{
AfxMessageBox("两个坐标值相同,方位角为任意!",MB_ICONWARNING);
fQuaAng = 0.0;
}
//如果X差值为0,则特殊处理方位角
else if (fabs(m_x2-m_x1)<1e-8)
{
if( (m_y2-m_y1) > 0)
{
fQuaAng = 0.5 * PI;
}
else if ((m_y2-m_y1) < 0)
{
fQuaAng = 1.5 * PI;
}
}
else
{
fQuaAng = atan2((m_y2-m_y1),(m_x2-m_x1));
if(fQuaAng<0)
{
fQuaAng += 2 * PI;
}
}
return fQuaAng;
}
CWzjCooAng CWzjCooAng::operator + (CWzjCooAng ang2) const
{
double fAngle=SexTranToRadAngle()+ang2.SexTranToRadAngle();
return CWzjCooAng(fAngle);
}
CWzjCooAng CWzjCooAng::operator - (CWzjCooAng ang2) const
{
double fAngle=SexTranToRadAngle()-ang2.SexTranToRadAngle();
return CWzjCooAng(fAngle);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -