aitoff_proj.lua


NAME
    aitoff_proj

FUNCTION
    aitoff_proj(lon, lat)

NOTES
    Aitoff projection.

    Based on the equations
    
        x = 2 * a * cos(lat) * sin(0.5 *lon) / sin(a)
        y = a * sin(lat) / sin(a)
        cos(a) = cos(lat) * cos(0.5 * lon)
        
    of Cartographic Projection Procedures by G.I. Evenden, September 24, 1995
    
    lon and lat are expected to vary from -180 to 180 and from -90 to 90, respectively.
    Resulted lon varies from -3.06 to 3.10 and lat from -1.48 to 1.54.

INPUTS
    lon  - number or zeArray object as longitude in degree
    lat  - number or zeArray object as latitude in degree

OUTPUTS
    Modifies lon and lat if they are zeArray objects; otherwise returns lon and lat.

SOURCE

require("register")

function aitoff_proj(lon, lat)
    if (type(lon) == "userdata") then
        zeMath.deg2rad(lon)
        zeMath.deg2rad(lat)
        lon:div(2)
        local a, b = zeUtl.new("double", "double")
        lat:copy(a)
        lon:copy(b)
        zeMath.sin(lon)
        zeMath.sin(lat)
        zeMath.cos(a)
        zeMath.cos(b)
        lon:mul(a)
        a:mul(b)
        zeMath.acos(a)
        a:copy(b)
        zeMath.sin(b)
        lon:mul(2)
        lon:mul(a)
        lon:div(b)
        lat:mul(a)
        lat:div(b)
    else
        lon = lon * 0.017453293 / 2
        lat = lat * 0.017453293
        local a = math.acos(math.cos(lat) * math.cos(lon))
        a = a / (1.e-5 + math.sin(a))
        lon = 2 * a * math.cos(lat) * math.sin(lon)
        lat = a * math.sin(lat)
        return lon, lat
    end
end