본문 바로가기

Native/C++

cos 세타 구하기

[code]
#include <iostream>
#include <math.h>
using namespace std;

#define PI            3.141592654f
#define RADIANPI    (180/PI)

int _tmain(int argc, _TCHAR* argv[])
{
    double a = 4.0, b = 5.0, c = 3.0;

    double x = (pow(a, 2) + pow(b, 2) - pow(c, 2)) / (2 * a * b);
    x = cos(x);
    wcout << L"result : " << x << endl;

    return 0;
}

double CLocationTrackingParser::GetDistance(CLocationTrackingData* pStart, CLocationTrackingData* pEnd)
{
    /*
    Haversine formula:

    R = earth’s radius (mean radius = 6,371km)
    Δlat = lat2 - lat1
    Δlong = long2 - long1
    a     = sin²(Δlat/2) + cos(lat1).cos(lat2).sin²(Δlong/2)
    c     = 2 * atan2(√a, √(1-a))
    d     = R * c
    */

    // NMEA ddmm.mmmm or dddmm.mmmm
    // ex> 3734.1111 => dd.dddddd...... 37 + (34.1111 /60) = result => fLat1 or fLat2
    // 리턴되는 값은 km 단위이므로 m단위를 하려면 1000을 곱해주자.
    //
    //
    // 시작점과 끝점에 거리를 알자.
    //
    double a=0.0, c=0.0, d=0.0;
    double dLat = 0.0;
    double dLong = 0.0;
    double dLat1 = 0.0;
    double dLong1 = 0.0;
    double dLat2 = 0.0;

    dLat1 = pStart->GetLatitude();
    dLong1 = pStart->GetLongitude();
    dLat2 = pEnd->GetLatitude();
    
    dLat = dLat1 - pEnd->GetLatitude();
    dLong = dLong1 - pEnd->GetLongitude();
    
    dLat1 *= GetPiRadian();
    dLong1 *= GetPiRadian();
    dLat *= GetPiRadian();
    dLong *= GetPiRadian();

    a = (sin(dLat / 2.0) * sin(dLat / 2.0)) + (cos(dLat1) * cos(dLat2)) * (sin(dLong / 2.0) * sin(dLong / 2.0));
    c = 2 * atan2(sqrt(a), sqrt(1 - a));
    d = m_nEarthRadius * c;

    return d;
}

double CLocationTrackingParser::GetAngle(CLocationTrackingData* a, CLocationTrackingData* b, CLocationTrackingData* c)
{
    //
    // cos 제 2법칙 이용
    // cos = a^2 + b^2 - c^2 / 2 * a * b
    //
    //     C
    //     /
    //     /
    //    /
    // A -------------------- B
    //
    double nAB = 0.0, nAC = 0.0, nBC = 0.0;

    nAB = GetDistance(a, b);
    nAC = GetDistance(a, c);
    nBC = GetDistance(b, c);

    double dAngle = 0.0;
    dAngle = acos((pow(nAB, 2) + pow(nAC, 2) - pow(nBC, 2)) / (2 * nAB * nAC)) * GetRadianPi();
    return dAngle;
}
[/code]

'Native > C++' 카테고리의 다른 글

L 리터럴과 유니코드 인코딩 (#pragma setlocale(  (0) 2013.10.02
reverse_iterator 를 iterator로...  (0) 2013.10.02
역방향 반복자 ::reverse_iterator  (0) 2013.10.02
__super::  (0) 2013.10.02
list  (0) 2013.10.02