denoyer_proj.lua


NAME
    denoyer_proj

FUNCTION
    denoyer_proj(lon, lat)

NOTES
    Denoyer projection for map.
    
    Based on the equations:
        x = lon * cos((0.95 - lon/12 + lon^3/600) * lat)
        y = lat
    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.07 to 3.10 and lat from -1.37 to 1.46.

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 denoyer_proj(lon, lat)
    local p1 = 0.95
    local p2 = 12
    local p3 = 600
    
    if (type(lon) == "userdata") then
        zeMath.deg2rad(lon)
        zeMath.deg2rad(lat)
        
        local v1, v2 = zeUtl.new("double", "double")
        lon:copy(v1)
        zeMath.abs(v1)
        lon:copy(v2)
        zeMath.abs(v2)
        v1:div(-p2)
        v1:add(p1)
        v2:mul(lon)
        v2:mul(lon)
        v2:div(p3)
        v2:add(v1)
        v2:mul(lat)
        zeMath.cos(v2)
        lon:mul(v2)
    else
        lon = lon * 0.017453293
        lat = lat * 0.017453293
        lon = lon * math.cos((p1 - math.abs(lon) / p2 + math.cos(lon* lon * lon) / p3) * lat)
        return lon, lat
    end
end