
function distanceFrom(lat1, lon1, lat2, lon2){
    var R = 6371000; // Radius of the earth in m
    var dLat = (lat2-lat1) * Math.PI/180;  // Javascript functions in radians
    var dLon = (lon2-lon1) * Math.PI/180;
    var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
    Math.cos(lat1 * Math.PI/180) * Math.cos(lat2 * Math.PI/180) *
    Math.sin(dLon/2) * Math.sin(dLon/2);
    var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
    var d = R * c; // Distance in meters

    return d;
}

function polygonShape(point,r1,r2,r3,r4,rotation,vertexCount,tilt) {
    var rot = -rotation*Math.PI/180;
    var precision = 0.1;
    var lat = parseFloat(point.lat());
    var lng = parseFloat(point.lng());
    var distance1 = new google.maps.LatLng(lat + precision,lng);
    var distance2 = new google.maps.LatLng(lat,lng + precision);
    var points = [];
    var latConv = distanceFrom(point.lat(), point.lng(), distance1.lat(), distance1.lng())*10;
    var lngConv = distanceFrom(point.lat(), point.lng(), distance2.lat(), distance2.lng())*10;
    var step = (360/vertexCount)||10;
    var flop = -1;
    var I1 = 0;
    if (tilt) {
        I1=180/vertexCount;
    }
    for(var i=I1; i<=360.001+I1; i+=step) {
        var r1a = flop?r1:r3;
        var r2a = flop?r2:r4;
        flop = -1-flop;
        var y = r1a * Math.cos(i * Math.PI/180);
        var x = r2a * Math.sin(i * Math.PI/180);
        var pushLng = (x*Math.cos(rot)-y*Math.sin(rot))/lngConv;
        var pushLat = (y*Math.cos(rot)+x*Math.sin(rot))/latConv;

        points.push(new google.maps.LatLng(lat+pushLat,lng+pushLng));
    }
    return points;
}

function polygonCircle(point,radius) {
    return polygonShape(point,radius,radius,radius,radius,0,100,0)
}
