CAngle类 角度转换类 C++

不是我写的,仅分享学习!书上配套,如有侵权,速删

与测绘程序设计配套(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:
	//设置常成员函数的作用:1.类成员不会被改变
	//2.可以被常类变量调用
	double Deg(double dDms) const;
	double Dms(double dDeg) const;
	
public:
	//获取指定的类型获取角度值,
    //由于返回的是dValue的引用,所以该值大小可以改变,即可以进行赋值
	double& operator() (AngleStyle style);

	//重载,获取指定的类型获取角度值,该值不可改变,const CAngle类型变量调用
	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) //指定的类型获取角度值
{
	//double dAngleValue;
    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;
}
//重载()函数,该函数是常函数,只能被常CAngle对象使用
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;
}


  • 6
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
#include <iostream> #include <string> using namespace std; struct CPoint { int x ; int y ; }; class CRectangle { private: const int id;//常量数据成员 static int total;//静态数据成员 const static string sclass; const static int f=1.0f; CPoint lefttop ; CPoint rightdown ; public: CRectangle( ); CRectangle( CPoint& lt, CPoint& rd ); CPoint GetLefttop() const { return lefttop; } CPoint GetRightdown() const { return rightdown; } void SetLefttop(CPoint & pt) { lefttop=pt; } void SetRightdown(CPoint & pt) { rightdown=pt; } int Getid() const { return id; } static int Gettotal() { return total; } int Area( ) const; int Perimeter( ) const; }; int CRectangle::total=0;//静态数据成员必须在的外部定义(正好一次)。 const string CRectangle::sclass="CRectangle"; CRectangle::CRectangle( ):id(++total) { lefttop.x=0; lefttop.y=0; rightdown.x=1; rightdown.y=1; } CRectangle::CRectangle( CPoint& lt, CPoint& rd ):id(++total) { lefttop = lt ; rightdown = rd ; } int CRectangle::Area( ) const { int wd= rightdown.x - lefttop.x ; int ht= rightdown.y - lefttop.y ; return wd * ht ; } int CRectangle::Perimeter( ) const { int wd= rightdown.x - lefttop.x ; int ht= rightdown.y - lefttop.y ; return 2 * ( wd + ht ) ; } int main() { CPoint lt, rd; cin >> lt.x >> lt.y; cin >> rd.x >> rd.y; CRectangle crt(lt,rd);//调用有参构造函数 CRectangle crt2;//调用默认构造函数 //创建常量对象 const CRectangle crt3(lt,rd); cout<<"当前创建的矩形个数为:"; cout<<CRectangle::Gettotal()<<endl; //返回矩形的左上和右下点 CPoint lt1=crt.GetLefttop(); CPoint lt2=crt.GetRightdown(); //显示矩形的坐标 cout<<crt.Getid()<<"号矩形的坐标是:"<<"("<<lt1.x<<","<<lt1.y<<"), "; cout<<"("<<lt2.x<<","<<lt2.y<<")"<<endl; //显示矩形的面积和周长 cout << "Area:"<<crt.Area( )<<endl; cout <<"Perimeter:"<<crt.Perimeter( )<<endl; //修改矩形的左上角点 cout<<"输入矩形新的左上点坐标:"; cin>> lt.x>>lt.y; crt.SetLefttop(lt); lt1=crt.GetLefttop(); //显示修改后矩形的坐标 cout<<"矩形的坐标是:"<<"("<<lt1.x<<","<<lt1.y<<"), "; cout<<"("<<lt2.x<<","<<lt2.y<<")"<<endl; //显示修改后矩形的面积和周长 cout << "Area:"<<crt.Area( )<<endl; cout <<"Perimeter:"<<crt.Perimeter( )<<endl; }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值