﻿function calcAngle(x1, y1, x2, y2) {
    if (x1 == x2) {
        //the points are at the same vertical line
        if (y1 > y2)        //basis is under point p
            return Math.PI;
        if (y1 < y2)        //basis is over point p
            return 0;
    }
    if (y1 == y2) {
        //the points are at the same height
        if (x1 <= x2)        //basis is in front of point p
            return 3*Math.PI/2
        if (x1 > x2)        //basis is behind of point p
            return Math.PI/2
    }

    //calculate the angle
    var angle = Math.atan2((x1-x2),(y2-y1) )

    //the return value has to be between 0 and 2Pi, but atan2 returns a
    // value between -Pi and Pi --> add 2Pi if angle is < 0
    if (angle < 0) {
        angle = 2*Math.PI + angle
    }

    return angle;
}

function lineIntersect(a1, a2, b1, b2){

    var dx, dy, da, db, t, s 

    dx = a2[0] - a1[0]
    dy = a2[1] - a1[1]
    da = b2[0] - b1[0]
    db = b2[1] - b1[1]

    if (da * dy - db * dx == 0) {
        // The segments are parallel.
        return null;
    }
    
    s = (dx * (b1[1] - a1[1]) + dy * (a1[0] - b1[0])) / (da * dy - db * dx)
    t = (da * (a1[1] - b1[1]) + db * (b1[0] - a1[0])) / (db * dx - da * dy)

    if ((s >= 0) & (s <= 1) & (t >= 0) & (t <= 1)) {   
        return new Array(a1[0] + t * dx, a1[1] + t * dy)
    } else {
        return null;
    }
}


function ptInRegion(verts, test_point) {
  var i
  var j=verts.length-1 
  var c=false

  for (i=0; i<verts.length; i++) {
    if (verts[i][1]<test_point[1] && verts[j][1]>=test_point[1]
    ||  verts[j][1]<test_point[1] && verts[i][1]>=test_point[1]) {
      if ((test_point[1]-verts[i][1])/(verts[j][1]-verts[i][1])*(verts[j][0]-verts[i][0])<test_point[0]-verts[i][0]) {
        c=!c; }}
    j=i; }
  return c;
} 



function clipPoly(poly, v1, v2){
    newPol = clipEdge(poly, 0, v1[1])
    newPol = clipEdge(newPol, 1, v2[0])
    newPol = clipEdge(newPol, 2, v2[1])
    newPol = clipEdge(newPol, 3, v1[0])
    return newPol
}
 
function isVisible(x, y, edge, wert) {
    switch (edge){
        case 0: 
            return y >= wert
            break;
        case 1: 
            return x <= wert
            break;
        case 2: 
            return y <= wert
            break;
        case 3: 
            return x >= wert
            break;
    }
}
 
function intersection(x1,y1, x2, y2, edge, wert) {
    var a = isVisible(x1, y1, edge, wert);
    var b = isVisible(x2, y2, edge, wert);
    if((a && b ) || (!a && !b) ) {
        return 0;   
    }else{
        var slope =(y2 - y1) / (x2 - x1);
        if(edge == 1 || edge == 3) {
            return [wert, Math.round(((wert-x1) * slope)+y1)]
        }else{
            return [Math.round(((wert-y1) / slope)+x1), wert]
        }
    }
}
 
function clipEdge( poly, edge, wert) {
    sh_pol = new Array();
    var sx, sy, inter, np;
    np=-1;
    poly.push(poly[0])
    for( var i=1; i<poly.length; i++) {
        sx = poly[i-1][0]; 
        sy = poly[i-1][1];
        if(isVisible(sx, sy, edge, wert)) {
                np++;
                sh_pol[np] = new Array(sx, sy);
         }
         inter = intersection(sx,sy, poly[i][0], poly[i][1], edge, wert);
         if(inter != 0) {
                np++;
                sh_pol[np] = new Array(inter[0], inter[1]);
         }
    }
    return sh_pol;
}

function pointArrayFromString(str){
    var ptarry = trim(str).split(' ')

    for (var i=0;i<ptarry.length; i++){
        ptarry[i]=ptarry[i].split(',')
    }
    
    return ptarry
}