﻿

function MapGeometry()

{

};



MapGeometry.prototype.MilesToRadians = function(miles)

{

    return miles/3963;

};



MapGeometry.prototype.KilometersToRadians = function(kilometers)

{

    return kilometers/6378.8;

};



MapGeometry.prototype.CreateCircle = function(centerLat, centerLon, radius)

{

    var result = null;



    var rCenterLat = (Math.PI/180)*centerLat;

    var rCenterLon = (Math.PI/180)*centerLon;

    var bounds = new GLatLngBounds();

    var gPoints = new Array();

    var pointCounter = 0;

    for(; pointCounter < 361; pointCounter++)

    {

        var tc = (Math.PI/180)*pointCounter;

        var y = Math.asin(Math.sin(rCenterLat)*Math.cos(radius)+Math.cos(rCenterLat)*Math.sin(radius)*Math.cos(tc));

        var dlng = Math.atan2(Math.sin(tc)*Math.sin(radius)*Math.cos(rCenterLat),Math.cos(radius)-Math.sin(rCenterLat)*Math.sin(y));

        var x = ((rCenterLon-dlng+Math.PI) % (2*Math.PI)) - Math.PI;

        var point = new GLatLng(parseFloat(y*(180/Math.PI)), parseFloat(x*(180/Math.PI)));

        gPoints.push(point);

        bounds.extend(point);

    }

    

    if (radius < 1.5678565720686044)

    {

        result = new GPolygon(gPoints, '#1E529E', 2, 1, '#419639', 0.25);

    }

    else

    {

        result = new GPolygon(gPoints, '#1E529E', 2, 1);

    }

    result.InternalBounds = bounds;



    return result;

};



MapGeometry.prototype.IsPointInPolygon = function(point, polygon)

{

    var result = false;



    var bounds = polygon.getBounds();

    if(!bounds.containsLatLng(point))

    {

        return result;

    }

   

    var numPoints = polygon.getVertexCount();

    var i;

    var j = numPoints-1;

   

    for(var i=0; i < numPoints; i++) {

        var vertex1 = polygon.getVertex(i);

        var vertex2 = polygon.getVertex(j);

       

        if (vertex1.lng() < point.lng() && vertex2.lng() >= point.lng() || vertex2.lng() < point.lng() && vertex1.lng() >= point.lng())  {

            if (vertex1.lat() + (point.lng() - vertex1.lng()) / (vertex2.lng() - vertex1.lng()) * (vertex2.lat() - vertex1.lat()) < point.lat()) {

                result = !result;

            }

        }

       

        j = i;

    }

   

    return result;

};



MapGeometry.prototype.CalculateDistance = function(_from, _to)

{

    var result = NaN;

    try

    {

        var R = 3963;

        var dLat = (_to.lat() - _from.lat()) * Math.PI / 180;

        var dLon = (_to.lng() - _from.lng()) * Math.PI / 180;

        var lat1 = _from.lat() * Math.PI / 180;

        var lat2 = _to.lat() * Math.PI / 180;

        var a = Math.sin(dLat/2) * Math.sin(dLat/2) + Math.cos(lat1) * Math.cos(lat2) * Math.sin(dLon/2)

        * Math.sin(dLon/2);

        var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));

        var d = R * c;

        result = Math.round(d);

    }

    catch (error)

    {

       // alert(error);
		result = NaN;

    }
    //alert(result);
    return result;

};


