/*
 * File:   wgs84.h
 * Author: Filip Niksic, fniksic@gmail.com
 *
 * Created on January 23, 2008, 10:50 PM
 */

#ifndef WGS84_H
#define	WGS84_H

#include <stdexcept>

#include "globals.h"

namespace WGS84 {
    const double pi         = 3.14159265358979;
    const double pipola     = 1.57079632679490;
    const double dvapi      = 6.28318530717959;
    const double deg2rad    = 1.74532925199433e-2;
    
    // Podatci prepisani s interneta:
    const double a_poluos   = 6378137;
    const double b_poluos   = 6356752.31424518;
    const double flat       = 0.00335281; // (a_poluos - b_poluos)/a_poluos
    
    const double eps        = 5e-13; // tocnost racunanja
    
    class Coords {
        Real_T _latitude, _longitude;

        // checkValues() provjerava jesu li vrijednosti _latitude
        // i _longitude unutar dozvoljenih granica:
        //    -90.0 <= _latitude  <= 90.0
        //   -180.0 <= _longitude <= 180.0
        // Ukoliko nisu, baca range_error iznimku.
        void checkValues() const {
            if (!(_latitude >= -90.0 && _latitude <= 90.0
                    && _longitude >= -180.0 && _longitude <= 180.0))
                throw std::range_error("WGS84 koordinate izvan dozvoljenog raspona.");
        }
     public:
        Coords(Real_T lat, Real_T lon) : _latitude(lat), _longitude(lon) {
            checkValues();
        }
        Real_T latitude() const {
            return _latitude;
        }
        Real_T longitude() const {
            return _longitude;
        }
    };

    Real_T geodesic(const Coords &, const Coords &); 
}

#endif	/* WGS84_H */

