Commit 90acde40 authored by Oleg Dzhimiev's avatar Oleg Dzhimiev
Browse files

moved functions to separate file

parent 7be238eb
Loading
Loading
Loading
Loading

js/align_functions.js

0 → 100644
+252 −0
Original line number Original line Diff line number Diff line
/*

  Copyright (C) 2017 Elphel Inc.

  License: GPL-3.0

  https://www.elphel.com

*/
/**
 * @file this file
 * @brief
 *
 * @copyright Copyright (C) 2017 Elphel Inc.
 * @author Oleg Dzhimiev <oleg@elphel.com>
 *
 * @licstart  The following is the entire license notice for the
 * JavaScript code in this page.
 *
 *   The JavaScript code in this page is free software: you can
 *   redistribute it and/or modify it under the terms of the GNU
 *   General Public License (GNU GPL) as published by the Free Software
 *   Foundation, either version 3 of the License, or (at your option)
 *   any later version.  The code is distributed WITHOUT ANY WARRANTY;
 *   without even the implied warranty of MERCHANTABILITY or FITNESS
 *   FOR A PARTICULAR PURPOSE.  See the GNU GPL for more details.
 *
 *   As additional permission under GNU GPL version 3 section 7, you
 *   may distribute non-source (e.g., minimized or compacted) forms of
 *   that code without the copy of the GNU GPL normally required by
 *   section 4, provided you include this license notice and a URL
 *   through which recipients can access the Corresponding Source.
 *
 *  @licend  The above is the entire license notice
 *  for the JavaScript code in this page.
 */

/**
 * hll_ and art_
 */

/**
 * Functions for heading and position latitude and longitude
 * hll_...
 */

/*
 * heading in degrees from 3D model
 */
function hll_f_3d_i(i,v){
  var base = Data.camera;
  var mark = Data.markers[i];
  var vec = new x3dom.fields.SFVec3f(mark.align.x-base.x,0,mark.align.z-base.z);
  var res = Math.atan2(vec.x,-vec.z)*180/Math.PI + v[2];

  if (res> 180) res = res - 360;
  if (res<-180) res = res + 360;

  return res;
}

/*
 * heading in degrees from map
 */
function hll_f_map_i(i,v){

  var mark = Data.markers[i];
  var p1_ll = new L.LatLng(v[0],v[1]);
  var p2_ll = new L.LatLng(mark.align.latitude,mark.align.longitude);

  //console.log(p1_ll);
  //console.log(p2_ll);

  p1_ll.lat = p1_ll.lat*Math.PI/180;
  p1_ll.lng = p1_ll.lng*Math.PI/180;

  p2_ll.lat = p2_ll.lat*Math.PI/180;
  p2_ll.lng = p2_ll.lng*Math.PI/180;

  var dlat = p2_ll.lat-p1_ll.lat;
  var dlon = p2_ll.lng-p1_ll.lng;

  var dy = Math.sin(dlon)*Math.cos(p2_ll.lat);
  var dx = Math.cos(p1_ll.lat)*Math.sin(p2_ll.lat)-Math.sin(p1_ll.lat)*Math.cos(p2_ll.lat)*Math.cos(dlon);

  //console.log("dy = "+dy+" dx = "+dx);

  var res = 180/Math.PI*Math.atan2(dy,dx);

  return res;

}

/*
 * residuals function
 */
function hll_r_i(i,v){
  var f1 = hll_f_3d_i(i,v);
  var f2 = hll_f_map_i(i,v);
  //return (f1-f2+360)%360;
  return (f1-f2);
}

/*
 * dr/dx(i)
 */
function hll_dr_dx_i(i,v){

  var mark = Data.markers[i];
  var p1_ll = new L.LatLng(v[0],v[1]);
  var p2_ll = new L.LatLng(mark.align.latitude,mark.align.longitude);

  p1_ll.lat = p1_ll.lat*Math.PI/180;
  p1_ll.lng = p1_ll.lng*Math.PI/180;

  p2_ll.lat = p2_ll.lat*Math.PI/180;
  p2_ll.lng = p2_ll.lng*Math.PI/180;

  var dlat = p2_ll.lat-p1_ll.lat;
  var dlon = p2_ll.lng-p1_ll.lng;

  var dy = Math.sin(dlon)*Math.cos(p2_ll.lat);
  var dx = Math.cos(p1_ll.lat)*Math.sin(p2_ll.lat)-Math.sin(p1_ll.lat)*Math.cos(p2_ll.lat)*Math.cos(dlon);

  var dydx = 0;
  var dxdx = (-Math.sin(p1_ll.lat)*Math.sin(p2_ll.lat)-Math.cos(p1_ll.lat)*Math.cos(p2_ll.lat)*Math.cos(dlon))*Math.PI/180;

  var Arg = dy/dx;

  var res = -180/Math.PI*1/(1+Math.pow(Arg,2))*(-dy*dxdx)/Math.pow(dx,2);

  return res;

}
/*
 * dr/dy(i)
 */
function hll_dr_dy_i(i,v){

  var mark = Data.markers[i];
  var p1_ll = new L.LatLng(v[0],v[1]);
  var p2_ll = new L.LatLng(mark.align.latitude,mark.align.longitude);

  p1_ll.lat = p1_ll.lat*Math.PI/180;
  p1_ll.lng = p1_ll.lng*Math.PI/180;

  p2_ll.lat = p2_ll.lat*Math.PI/180;
  p2_ll.lng = p2_ll.lng*Math.PI/180;

  var dlat = p2_ll.lat-p1_ll.lat;
  var dlon = p2_ll.lng-p1_ll.lng;

  var dy = Math.sin(dlon)*Math.cos(p2_ll.lat);
  var dx = Math.cos(p1_ll.lat)*Math.sin(p2_ll.lat)-Math.sin(p1_ll.lat)*Math.cos(p2_ll.lat)*Math.cos(dlon);

  var dydy = Math.cos(p2_ll.lat)*Math.cos(dlon)*(-1)*Math.PI/180;
  var dxdy = -Math.sin(p1_ll.lat)*Math.cos(p2_ll.lat)*(-1)*Math.sin(dlon)*(-1)*Math.PI/180;

  var Arg = dy/dx;

  var res = -180/Math.PI*1/(1+Math.pow(Arg,2))*(dydy*dx-dy*dxdy)/Math.pow(dx,2);

  return res;

}
/*
 * dr/dh(i)
 */
function hll_dr_dh_i(i,v){
  return 1;
}


/**
 * Functions for relative altitude, tilt and roll
 * art_...
 */

function art_f_3d_i(i,v){

  var mark = Data.markers[i];
  var xi = mark.align.x;
  var yi = mark.align.y;
  var zi = mark.align.z;

  var res  = -Math.cos(v[0])*Math.sin(v[1])*xi;
      res +=  Math.cos(v[0])*Math.cos(v[1])*yi;
      res += -Math.sin(v[0])*zi;

  return res;

}

function art_f_map_i(i,v){

  var mark = Data.markers[i];
  return (v[2]+mark.align.altitude);

}

function art_r_i(i,v){

  var f1 = art_f_3d_i(i,v);
  var f2 = art_f_map_i(i,v);
  //return (f1-f2+360)%360;
  return (f1-f2)/art_l_i(i);
}

function art_dr_dx_i(i,v){

  var mark = Data.markers[i];
  var xi = mark.align.x;
  var yi = mark.align.y;
  var zi = mark.align.z;

  var res  =  Math.sin(v[0])*Math.sin(v[1])*xi;
      res += -Math.sin(v[0])*Math.cos(v[1])*yi;
      res += -Math.cos(v[0])*zi;

  return res/art_l_i(i);

}

function art_dr_dy_i(i,v){

  var mark = Data.markers[i];
  var xi = mark.align.x;
  var yi = mark.align.y;
  var zi = mark.align.z;

  var res  = -Math.cos(v[0])*Math.cos(v[1])*xi;
      res += -Math.cos(v[0])*Math.sin(v[1])*yi;

  return res/art_l_i(i);

}

function art_dr_da_i(i,v){
  return -1;
}

function art_l_i(i){

  var mark = Data.markers[i];
  var xi = mark.align.x;
  var yi = mark.align.y;
  var zi = mark.align.z;

  return Math.sqrt(xi*xi+yi*yi+zi*zi);

}
+100 −223
Original line number Original line Diff line number Diff line
@@ -45,11 +45,11 @@ function align_init(){
        //if (DEBUG_ALIGN) test_markers_set1();
        //if (DEBUG_ALIGN) test_markers_set1();
        if (DEBUG_ALIGN) test_markers_set2();
        if (DEBUG_ALIGN) test_markers_set2();
        //if (DEBUG_ALIGN) test_markers_set3();
        //if (DEBUG_ALIGN) test_markers_set3();
        x3dom_align_GN();
        x3dom_align_hll();
    });
    });


    $("#align_tr_button").on("click",function(){
    $("#align_tr_button").on("click",function(){
        x3dom_align_tr();
        x3dom_align_art();
    });
    });


    /*
    /*
@@ -100,7 +100,7 @@ function check_markers(){
/*
/*
 * run the Gauss-Newton algorithm iterations
 * run the Gauss-Newton algorithm iterations
 */
 */
function x3dom_align_GN(){
function x3dom_align_hll(){


  // need at least 3 points
  // need at least 3 points
  if (Data.markers != undefined){
  if (Data.markers != undefined){
@@ -131,7 +131,7 @@ function x3dom_align_GN(){


  var xyh = [x0,y0,(h0>180)?h0-360:h0];
  var xyh = [x0,y0,(h0>180)?h0-360:h0];


  var result = numbers.calculus.GaussNewton(xyh,Data.markers.length,r_i,[dr_dx_i,dr_dy_i,dr_dh_i],epsilon);
  var result = numbers.calculus.GaussNewton(xyh,Data.markers.length,hll_r_i,[hll_dr_dx_i,hll_dr_dy_i,hll_dr_dh_i],epsilon);


  xyh = result.v;
  xyh = result.v;
  var s1 = result.error;
  var s1 = result.error;
@@ -146,133 +146,6 @@ function x3dom_align_GN(){


}
}


/*
 * heading in degrees from 3D model
 */
function f1_3d_i(i,v){
  var base = Data.camera;
  var mark = Data.markers[i];
  var vec = new x3dom.fields.SFVec3f(mark.align.x-base.x,0,mark.align.z-base.z);
  var res = Math.atan2(vec.x,-vec.z)*180/Math.PI + v[2];

  if (res> 180) res = res - 360;
  if (res<-180) res = res + 360;

  return res;
}

/*
 * heading in degrees from map
 */
function f2_map_i(i,v){

  var mark = Data.markers[i];
  var p1_ll = new L.LatLng(v[0],v[1]);
  var p2_ll = new L.LatLng(mark.align.latitude,mark.align.longitude);

  //console.log(p1_ll);
  //console.log(p2_ll);

  p1_ll.lat = p1_ll.lat*Math.PI/180;
  p1_ll.lng = p1_ll.lng*Math.PI/180;

  p2_ll.lat = p2_ll.lat*Math.PI/180;
  p2_ll.lng = p2_ll.lng*Math.PI/180;

  var dlat = p2_ll.lat-p1_ll.lat;
  var dlon = p2_ll.lng-p1_ll.lng;

  var dy = Math.sin(dlon)*Math.cos(p2_ll.lat);
  var dx = Math.cos(p1_ll.lat)*Math.sin(p2_ll.lat)-Math.sin(p1_ll.lat)*Math.cos(p2_ll.lat)*Math.cos(dlon);

  //console.log("dy = "+dy+" dx = "+dx);

  var res = 180/Math.PI*Math.atan2(dy,dx);

  return res;

}

/*
 * residuals function
 */
function r_i(i,v){
  var f1 = f1_3d_i(i,v);
  var f2 = f2_map_i(i,v);
  //return (f1-f2+360)%360;
  return (f1-f2);
}

/*
 * dr/dx(i)
 */
function dr_dx_i(i,v){

  var mark = Data.markers[i];
  var p1_ll = new L.LatLng(v[0],v[1]);
  var p2_ll = new L.LatLng(mark.align.latitude,mark.align.longitude);

  p1_ll.lat = p1_ll.lat*Math.PI/180;
  p1_ll.lng = p1_ll.lng*Math.PI/180;

  p2_ll.lat = p2_ll.lat*Math.PI/180;
  p2_ll.lng = p2_ll.lng*Math.PI/180;

  var dlat = p2_ll.lat-p1_ll.lat;
  var dlon = p2_ll.lng-p1_ll.lng;

  var dy = Math.sin(dlon)*Math.cos(p2_ll.lat);
  var dx = Math.cos(p1_ll.lat)*Math.sin(p2_ll.lat)-Math.sin(p1_ll.lat)*Math.cos(p2_ll.lat)*Math.cos(dlon);

  var dydx = 0;
  var dxdx = (-Math.sin(p1_ll.lat)*Math.sin(p2_ll.lat)-Math.cos(p1_ll.lat)*Math.cos(p2_ll.lat)*Math.cos(dlon))*Math.PI/180;

  var Arg = dy/dx;

  var res = -180/Math.PI*1/(1+Math.pow(Arg,2))*(-dy*dxdx)/Math.pow(dx,2);

  return res;

}
/*
 * dr/dy(i)
 */
function dr_dy_i(i,v){

  var mark = Data.markers[i];
  var p1_ll = new L.LatLng(v[0],v[1]);
  var p2_ll = new L.LatLng(mark.align.latitude,mark.align.longitude);

  p1_ll.lat = p1_ll.lat*Math.PI/180;
  p1_ll.lng = p1_ll.lng*Math.PI/180;

  p2_ll.lat = p2_ll.lat*Math.PI/180;
  p2_ll.lng = p2_ll.lng*Math.PI/180;

  var dlat = p2_ll.lat-p1_ll.lat;
  var dlon = p2_ll.lng-p1_ll.lng;

  var dy = Math.sin(dlon)*Math.cos(p2_ll.lat);
  var dx = Math.cos(p1_ll.lat)*Math.sin(p2_ll.lat)-Math.sin(p1_ll.lat)*Math.cos(p2_ll.lat)*Math.cos(dlon);

  var dydy = Math.cos(p2_ll.lat)*Math.cos(dlon)*(-1)*Math.PI/180;
  var dxdy = -Math.sin(p1_ll.lat)*Math.cos(p2_ll.lat)*(-1)*Math.sin(dlon)*(-1)*Math.PI/180;

  var Arg = dy/dx;

  var res = -180/Math.PI*1/(1+Math.pow(Arg,2))*(dydy*dx-dy*dxdy)/Math.pow(dx,2);

  return res;

}
/*
 * dr/dh(i)
 */
function dr_dh_i(i,v){
  return 1;
}


/*
/*
 * ui dialog to apply or cancel results
 * ui dialog to apply or cancel results
 */
 */
@@ -370,7 +243,7 @@ function distance_error(x,y,h){


  for(var i=0;i<Data.markers.length;i++){
  for(var i=0;i<Data.markers.length;i++){
      var angle0 = h;
      var angle0 = h;
      var angle1 = f2_map_i(i,[x,y,h]);
      var angle1 = hll_f_map_i(i,[x,y,h]);
      var z_map = Math.cos(Math.PI/180*(angle0-angle1))*Data.markers[i].d_map;
      var z_map = Math.cos(Math.PI/180*(angle0-angle1))*Data.markers[i].d_map;
      var z_x3d = -Data.markers[i].align.z;
      var z_x3d = -Data.markers[i].align.z;
      sum += 1/z_map-1/z_x3d;
      sum += 1/z_map-1/z_x3d;
@@ -385,32 +258,20 @@ function distance_error(x,y,h){


}
}


function x3dom_align_tr(){
/**
 * Tilt, roll and relative height
 */
function x3dom_align_art(){

  //test_height_alignment_set1();


  if (Data.markers.length<2){
  if (Data.markers.length<2){
    console.log("Too few points");
    console.log("Too few points");
    return;
    return;
  }
  }


  var mark0 = Data.markers[0];
  var mark1 = Data.markers[1];

  var v0 = { x: mark0.align.x, y: mark0.align.y, z: mark0.align.z};
  var v1 = { x: mark1.align.x, y: mark1.align.y, z: mark1.align.z};

  var dx = Math.abs(v1.x-v0.x);
  var dy = Math.abs(v1.y-v0.y);
  var dz = Math.abs(v1.z-v0.z);

  console.log(dx+" "+dy+" "+dz);

  var tilt = 180/Math.PI*Math.asin(dy/Math.sqrt(dy*dy+dz*dz));
  var roll = 180/Math.PI*Math.asin(dy/Math.sqrt(dy*dy+dx*dx));

  console.log("Tilt: "+tilt+" Roll: "+roll);

  var epsilon = 1e-8;
  var epsilon = 1e-8;
  var result = numbers.calculus.GaussNewton([0,0,0],Data.markers.length,_r_i,[_dr_dx_i,_dr_dy_i,_dr_da_i],epsilon);
  var result = numbers.calculus.GaussNewton([0,0,0],Data.markers.length,art_r_i,[art_dr_dx_i,art_dr_dy_i,art_dr_da_i],epsilon);


  console.log(result);
  console.log(result);


@@ -425,79 +286,7 @@ function align_roll(){


}
}


function _f1_3d_i(i,v){

  var mark = Data.markers[i];
  var xi = mark.align.x;
  var yi = mark.align.y;
  var zi = mark.align.z;

  var res  = -Math.cos(v[0])*Math.sin(v[1])*xi;
      res +=  Math.cos(v[0])*Math.cos(v[1])*yi;
      res += -Math.sin(v[0])*zi;


  return res;

}

function _f2_map_i(i,v){

  var mark = Data.markers[i];
  return (v[2]+mark.align.altitude);

}

function _r_i(i,v){

  var f1 = _f1_3d_i(i,v);
  var f2 = _f2_map_i(i,v);
  //return (f1-f2+360)%360;
  return (f1-f2)/_l_i(i);
}

function _dr_dx_i(i,v){

  var mark = Data.markers[i];
  var xi = mark.align.x;
  var yi = mark.align.y;
  var zi = mark.align.z;

  var res  =  Math.sin(v[0])*Math.sin(v[1])*xi;
      res += -Math.sin(v[0])*Math.cos(v[1])*yi;
      res += -Math.cos(v[0])*zi;

  return res/_l_i(i);

}

function _dr_dy_i(i,v){

  var mark = Data.markers[i];
  var xi = mark.align.x;
  var yi = mark.align.y;
  var zi = mark.align.z;

  var res  = -Math.cos(v[0])*Math.cos(v[1])*xi;
      res += -Math.cos(v[0])*Math.sin(v[1])*yi;

  return res/_l_i(i);

}

function _dr_da_i(i,v){
  return 1;
}

function _l_i(i){

  var mark = Data.markers[i];
  var xi = mark.align.x;
  var yi = mark.align.y;
  var zi = mark.align.z;

  return Math.sqrt(xi*xi+yi*yi+zi*zi);

}


/*
/*
 * not used
 * not used
@@ -550,3 +339,91 @@ function test_markers_set3(){
  ];
  ];


}
}

function test_height_alignment_set1(){

  Data.markers = [
    // mark 1
    {
      d_map:59.51564928339807,
      d_x3d:58.313592803937226,
      align:{
        altitude: -13.5,
        latitude: 40.723442371919724,
        longitude: -111.93217635154726,
        x: 23.459612763633526,
        y: -16.16174219091789,
        z: -53.38653083581816
      }
    },
    // mark 2
    {
      d_map:33.27803820582991,
      d_x3d:33.751031067385306,
      align:{
        altitude: -13.5,
        latitude: 40.72351402663441,
        longitude: -111.9325089454651,
        x: 3.874545773959316,
        y: -14.990277738492225,
        z: -33.52789872862751
      }
    },
    // mark 3
    {
      d_map:190.2700432380853,
      d_x3d:182.86147956244875,
      align:{
        altitude: -13.5,
        latitude: 40.72385908620143,
        longitude: -111.93070113658906,
        x: 37.888760344786206,
        y: -21.838175845671834,
        z: -178.89315958779198
      }
    },
    // mark 4
    {
      d_map:123.91365898007855,
      d_x3d:121.69257093022782,
      align:{
        altitude: -11.5,
        latitude: 40.724090818868255,
        longitude: -111.93171232938768,
        x: -22.176096746469145,
        y: -16.83997830234069,
        z: -119.65493116750253
      }
    }

  ];

}



























+2 −0
Original line number Original line Diff line number Diff line
@@ -42,6 +42,8 @@
    <script type='text/javascript' src='js/ui_functions.js'></script>
    <script type='text/javascript' src='js/ui_functions.js'></script>
    <script type='text/javascript' src='js/ui_align.js'></script>
    <script type='text/javascript' src='js/ui_align.js'></script>


    <script type='text/javascript' src='js/align_functions.js'></script>

    <script type='text/javascript' src='js/util_functions.js'></script>
    <script type='text/javascript' src='js/util_functions.js'></script>


    <script type='text/javascript' src='js/kml.js'></script>
    <script type='text/javascript' src='js/kml.js'></script>