[CPP] 각도 클래스(+ 아크탄젠트 리턴값 조정)

simpled 2013.06.23 15:02 조회 수 : 6024

main.cpp


여러가지 공학적인 프로그래밍을 하다보니, 각도 변환하는게 그렇게 귀찮고 짜증날 수가 없다.

그래서 이번 기회에 아싸리 한번 만들어 보았다.

주목할 점은 가장 귀찮은 아크 탄젠트의 리턴값을 변환하는 기능도 들어있다는 것이다.
컴퓨터나 계산기의 아크탄젠트는 0~360도의 값을 반환하지 않고, 각 분면(1사분면 2사분면...)마다 다른 값을 출력하기 때문이다.
그것을 매번 생각하거나, 즉석으로 짜서 프로그래밍 했었는데, 이번에 짜증이 폭발해서 결국 클래스로 만들어버렸다.

이번에는 어디서 참고하지 않고, 직접 짰다.

003.png

또한 다음과 같은 경우를 보자.

90도가 정 방향이라고 생각한 경우에 우측으로 돌면 +a, 좌측으로 돌면 -a의 각도가 정의된다고 하면,

이것을 정확한 시점으로 되돌리기 위한 함수도 필요하다.

클래스 내부에 보면 이를 위한 멤버도 있으니 참고하자.


004.png


 #include <iostream>

#include <math.h>

 

using namespace std;

 

class clAngle

{

public:

    double PI;

    double CI;

 

public:

    clAngle()

    {

        PI=3.141592;

        CI=PI*2;

    }

public:

    double Radian(double Degree)

    {

        return Degree*(PI/180.0);

    }

    double Degree(double Radian)

    {

        return Radian*(180/PI);

    }

 

public:

    double Cell_Radian(double Degree)

    {

        if (Degree==0)

            return Radian(90);

        if (Degree>0)

        {

            if(Degree>90)

            {

                return Radian( 360+(90-Degree) );    // 4 사분면

            }

            else

            {

                return Radian(90-Degree);           // 1 사분면

            }

        }

        if (Degree<0)

        {

            return Radian(90-Degree);

        }

    }

    double Cell_Degree(double Radian)

    {

        if (Radian==0)

            return 90;

        if (Radian>0)

            return 90-Degree(Radian);

        if (Radian<0)

            return 90-Degree(Radian);

    }

public:

    double atan_Radian(double x, double y)

    {

        if(x==0 && y==0)

            return Radian(0);

        if(x>0 && y==0)     // 0도혹은360

            return Radian(0);

        if(x==0 && y>0)     // 90

            return Radian(90);

        if(x<0 && y==0)     // 180

            return Radian(180);

        if(x==0 && y<0)     // 270

            return Radian(270);

 

        if(x>0 && y>0) // 1 사분면

            return atan(y/x);

        if(x<0 && y>0) // 2 사분면

            return Radian(180)+atan(y/x);

        if(x<0 && y<0) // 3 사분면

            return Radian(180)+atan(y/x);

        if(x>0 && y<0) // 4 사분면

            return Radian(360)+atan(y/x);

    }

 

    double atan_Degree(double x, double y)

    {

        if(x==0 && y==0)

            return 0;

        if(x>0 && y==0)     // 0도혹은360

            return 0;

        if(x==0 && y>0)     // 90

            return 90;

        if(x<0 && y==0)     // 180

            return 180;

        if(x==0 && y<0)     // 270

            return 270;

 

        if(x>0 && y>0) // 1 사분면

            return Degree(atan(y/x));

        if(x<0 && y>0) // 2 사분면

            return 180+Degree(atan(y/x));

        if(x<0 && y<0) // 3 사분면

            return 180+Degree(atan(y/x));

        if(x>0 && y<0) // 4 사분면

            return 360+Degree(atan(y/x));

 

    }

};

 

int main(void)

{

    clAngle angle;

 

    cout<<"Degree->Radian"<<endl;

    for(int i=0; i<=360; i+=90)

        cout<<i <<" : "<<angle.Radian(i)<<endl;

    cout<<endl;

 

    cout<<"Radian->Degree"<<endl;

    for(int i=0; i<=360; i+=90)

        cout<<angle.Radian(i) <<" : " <<angle.Degree(angle.Radian(i)) <<endl;

    cout<<endl;

 

    cout<<"atan_Test_Degree"<<endl;

    cout <<angle.atan_Degree(0, 0)

        <<"tt" <<angle.atan_Degree(1, 0)

        <<"tt" <<angle.atan_Degree(0, 1)

        <<"tt" <<angle.atan_Degree(-1, 0)

        <<"tt" <<angle.atan_Degree(0, -1)

        <<endl;

 

    cout <<angle.atan_Degree(0.5, 1)

        <<"tt" <<angle.atan_Degree(-0.5, 1)

        <<"tt" <<angle.atan_Degree(-0.5, -1)

        <<"tt" <<angle.atan_Degree(0.5, -1)

        <<endl;

    cout <<endl;

 

    cout<<"atan_Test_Radian"<<endl;

    cout <<angle.Degree(angle.atan_Radian(0, 0))

        <<"tt" <<angle.Degree(angle.atan_Radian(1, 0))

        <<"tt" <<angle.Degree(angle.atan_Radian(0, 1))

        <<"tt" <<angle.Degree(angle.atan_Radian(-1, 0))

        <<"tt" <<angle.Degree(angle.atan_Radian(0, -1))

        <<endl;

 

    cout <<angle.Degree(angle.atan_Radian(0.5, 1))

        <<"tt" <<angle.Degree(angle.atan_Radian(-0.5, 1))

        <<"tt" <<angle.Degree(angle.atan_Radian(-0.5, -1))

        <<"tt" <<angle.Degree(angle.atan_Radian(0.5, -1))

        <<endl;

    cout <<endl;

 

    cout<<"Cell_Angle_Test"<<endl;

 

    cout <<angle.Cell_Degree(angle.Radian(0))

        <<"tt" <<angle.Cell_Degree(angle.Radian(-1))

        <<"tt" <<angle.Cell_Degree(angle.Radian(-90))

        <<"tt" <<angle.Cell_Degree(angle.Radian(1.0))

        <<"tt" <<angle.Cell_Degree(angle.Radian(90))

        <<endl;

 

    cout <<angle.Degree(angle.Cell_Radian(0))

        <<"tt" <<angle.Degree(angle.Cell_Radian(-1))

        <<"tt" <<angle.Degree(angle.Cell_Radian(-90))

        <<"tt" <<angle.Degree(angle.Cell_Radian(1.0))

        <<"tt" <<angle.Degree(angle.Cell_Radian(90))

        <<endl;

 

    return 0;

}

번호 제목 글쓴이 날짜 조회 수
29 [CPP] file 입출력 : space data file simpled 2013.06.23 5257
28 [CPP] 1차 방정식을 통한 y값 구하기 simpled 2013.06.23 5777
27 [CPP] Vector 계산 클래스 (v2.0) file simpled 2013.06.23 4675
26 [CPP] 자리수 표현 simpled 2013.06.23 5618
» [CPP] 각도 클래스(+ 아크탄젠트 리턴값 조정) file simpled 2013.06.23 6024
24 [CPP] 벡터 계산 클래스 file simpled 2013.06.23 6090
23 [CPP] file 입출력 simpled 2013.06.23 4964
22 [CPP] 수치해석 : Rectangle Method 구분구적분 (적분 프로그래밍) simpled 2013.06.23 8111
21 [CPP] 분포하중 _ Beam의 SFD, BMD 값 simpled 2013.06.23 6471
20 [CPP] OOP6. CPP Programming :: Virtual Banking system PPT [끝] file 심플디 2013.06.23 6607
19 [CPP] OOP6. CPP Programming :: Virtual Banking system v3.8 file simpled 2013.06.23 5920
18 [CPP] OOP6. CPP Programming :: Virtual Banking system 모듈프로그램들 file simpled 2013.06.23 5244
17 [CPP] OOP6. CPP Programming :: Virtual Banking system v3.7 file simpled 2013.06.23 5954
16 [CPP] OOP6. CPP Programming :: Virtual Banking system v3.6 file simpled 2013.06.23 6287
15 [CPP] OOP6. CPP Programming :: Virtual Banking system v3.5.1 file simpled 2013.06.23 6442
14 [CPP] OOP6. CPP Programming :: Virtual Banking system v3.5 file simpled 2013.06.23 6620
13 [CPP] -----------------------------------절취선----------------------------------- simpled 2013.06.23 5830
12 [CPP] Banksys 휴식 simpled 2013.06.23 6496
11 [CPP] OOP5. CPP Programming :: Virtual Banking system v3.0.2 [Class design3. String Sorting] simpled 2013.06.23 5612
10 [CPP] OOP5. CPP Programming :: Virtual Banking system v3.0.2 [Class design2. File I/O] simpled 2013.06.23 6548