⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wzjcooang.cpp

📁 在工程交通行业如测绘部门经常用到角度单位的转换
💻 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 + -