I've got an app that calculate and displays tides (high and low tides). All the math for the calculs are already done. I would like to add one line to my code that would calculate the actual tide (not the 2 highest of the day or the 2 lowest but the meters of the water now). I'm quite bad at math so any help would be good. I'm willing to pay 50$ for this job if needed. The code : /////// CALCULATE TIDES /////////////////// var $cfm:Number; var $cfs:Number; var $pmm:String; var $pms:String; var $bmm:String; var $bms:String; var $hpmm:Number; var $hpms:Number; var $hbmm:Number; var $hbms:Number; var $latitude:String; var $longitude:String; var $temps:String; var $port_maree:String; var $jour_maree:Number; var $mois_maree:Number; var $annee_maree:Number; var $nom_port:String; var $z0:Number; var $asa:Number; var $aq1:Number; var $ao1:Number; var $ak1:Number; var $an2:Number; var $am2:Number; var $as2:Number; var $amn4:Number; var $am4:Number; var $ams4:Number; var $gsa:Number; var $gq1:Number; var $go1:Number; var $gk1:Number; var $gn2:Number; var $gm2:Number; var $gs2:Number; var $gmn4:Number; var $gm4:Number; var $gms4:Number; var $la:String; var $lo:String; var $utc:String; var $coef_z0:Number; var $pref_z0:Number; var $a:Object; var $g:Object; var $coef_a:Object; var $coef_g:Object; var $pref_a:Object; var $pref_g:Object; // calcul_maree properties var $r0:Object; var $phi0:Object; var $r24:Object; var $phi24:Object; // tide data loader properties var _onDataCompleteFunc:Function; var _isDebug:Boolean = true; // public properties function get haute1():String { return $pmm; }; function get haute2():String { return $pms; } function get basse1():String { return $bmm; }; function get basse2():String { return $bms; }; function get metrehaute1():Number { return $hpmm; }; function get metrehaute2():Number { return $hpms; }; function get metrebasse1():Number { return $hbmm; }; function get metrebasse2():Number { return $hbms; }; // convenient way to retrieve public data function get results():Object { if (!$pmm) return {}; return { haute1:$pmm, haute2:$pms, basse1:$bmm, basse2:$bms, metrehaute1:$hpmm, metrehaute2:$hpms, metrebasse1:$hbmm, metrebasse2:$hbms }; } ///////////////////////////////////////////////////////////////////////////////////////////////////// // TideDataTools.as ///////////////////////////////////////////////////////////////////////////////////////////////////// function trim(pValue:String):String { var whitespace:RegExp = /(\t|\n|\s{2,})/g; var trimmedValue:String = pValue.replace(whitespace, ""); return trimmedValue; } function maree($inputport:String = "", $inputdate:String = "", onDataCompleteFunc:Function = null):void { if (onDataCompleteFunc != null) _onDataCompleteFunc = onDataCompleteFunc; $port_maree = trim($inputport).toUpperCase(); /*if ($inputdate != '') $infodate = getdate(date2timestamp($inputdate + " 00:00:00","d/m/Y h:i:s")); else $infodate = getdate(date2timestamp(date("dmY") + " 00:00:00","d/m/Y h:i:s")); $jour_maree = $infodate["mday"]; $mois_maree = $infodate["mon"]; $annee_maree = $infodate["year"];*/ var $infodate:Array = $inputdate.split("/"); $jour_maree = Number($infodate[0]); // 25; // Day $mois_maree = Number($infodate[1]); // 12; // Month $annee_maree = Number($infodate[2]); // 2015; // Year loadXmlData(); } // Load TideData XML function loadXmlData():void { // _tideData = new TideDataLoader(); // _tideData.loadLocalData(onTideLoaderCallBack); loadLocalData(onTideLoaderCallBack); } function onTideLoaderCallBack(data:Object):void { if (data["status"] == COMPLETE) { parseXmlData(); init_port(); calcul_maree(); } else if (data["status"] == IO_ERROR) { } if (_onDataCompleteFunc != null) _onDataCompleteFunc(data); } function parseXmlData():void { if (!_tideXmlData) return; // scan and parse xml data for each ( var dataItem:Object in _tideXmlData.row ) { if (dataItem.NOM == $port_maree) { $z0 = dataItem.ZO; $asa = dataItem.ASA; $aq1 = dataItem.AQ1; $ao1 =dataItem.AO1; $ak1 = dataItem.AK1; $an2 = dataItem.AN2; $am2 = dataItem.AM2; $as2 = dataItem.AS2; $amn4 = dataItem.AMN4; $am4 = dataItem.AM4; $ams4 = dataItem.AMS4; $gsa = dataItem.GSA; $gq1 = dataItem.GQ1; $go1 = dataItem.GO1; $gk1 = dataItem.GK1; $gn2 = dataItem.GN2; $gm2 = dataItem.GM2; $gs2 = dataItem.GS2; $gmn4 = dataItem.GMN4; $gm4 = dataItem.GM4; $gms4 = dataItem.GMS4; $la = dataItem.LA; $lo = dataItem.LO; $utc = dataItem.UTC; break; } } // Assignment longitude, latitude and time GMT $latitude = $la; $longitude = $lo; $temps = $utc; } // Port initialization function init_port($iscoef:Number = -1):void { var $i:int, $j:int; $a = { }; $g = { }; // initialization tables for ($j = 1; $j <= 5; $j++) { $a[$j] = {}; $g[$j] = {}; for ($i = 1; $i <= 11; $i++) { $a[$j][$i] = 0; $g[$j][$i] = 0; } } $coef_a = { }; $coef_g = { }; $pref_a = { }; $pref_g = { }; if ($iscoef >= 0) { $a[1][1] = 0; $a[2][1] = 0; $a[2][2] = 0; $a[2][3] = 0; $a[2][4] = 0; $a[2][5] = 0; $a[2][6] = 0; $a[3][1] = 668; $a[3][2] = 136; $a[3][3] = 245; $a[3][4] = (1 / 7.6) * 136; $a[3][5] = (1 / 6.3) * 136; $a[3][6] = (1 / 5.3) * 136; $a[3][7] = ( -1 / 35) * 668; $a[3][8] = (1 / 3.7) * 245; $a[3][9] = (1 / 17) * 245; $a[3][10] = ( -1 / 27) * 668; $a[3][11] = (1 / 12) * 245; $a[5][1] = 0; $a[5][2] = 0; $a[5][3] = 0; $g[1][1] = 0; $g[2][1] = 0; $g[2][2] = 0; $g[2][3] = 0; $g[2][4] = 0; $g[2][5] = 0; $g[2][6] = 0; $g[3][1] = 138; $g[3][2] = 119; $g[3][3] = 178; $g[3][4] = 119; $g[3][5] = 119; $g[3][6] = 119; $g[3][7] = 138; $g[3][8] = 178; $g[3][9] = -105; $g[3][10] = 138; $g[3][11] = 178; $g[5][1] = 0; $g[5][2] = 0; $g[5][3] = 0; $coef_z0 = 0; for ($j = 1; $j <= 5; $j++) { $coef_a[$j] = { }; $coef_g[$j] = { }; for ($i = 1; $i <= 11; $i++) { $coef_a[$j][$i] = $a[$j][$i]; $coef_g[$j][$i] = $g[$j][$i]; } } } else { $a[1][1] = $asa; $a[2][1] = $ak1; $a[2][2] = $ao1; $a[2][3] = $aq1; $a[2][4] = (-1/3) * $ak1; $a[2][5] = (1/5.3) * $ao1; $a[2][6] = (1/7.4) * $ak1; $a[3][1] = $am2; $a[3][2] = $an2; $a[3][3] = $as2; $a[3][4] = (1/7.6) * $an2; $a[3][5] = (1/6.3) * $an2; $a[3][6] = (1/5.3) * $an2; $a[3][7] = (-1/35) * $am2; $a[3][8] = (1/3.7) * $as2; $a[3][9] = (1/17) * $as2; $a[3][10] = (-1/27) * $am2; $a[3][11] = (1/12) * $as2; $a[5][1] = $amn4; $a[5][2] = $am4; $a[5][3] = $ams4; $g[1][1] = $gsa; $g[2][1] = $gk1; $g[2][2] = $go1; $g[2][3] = $gq1; $g[2][4] = $gk1; $g[2][5] = $go1; $g[2][6] = $gk1; $g[3][1] = $gm2; $g[3][2] = $gn2; $g[3][3] = $gs2; $g[3][4] = $gn2; $g[3][5] = $gn2; $g[3][6] = $gn2; $g[3][7] = $gm2; $g[3][8] = $gs2; $g[3][9] = $gs2 - 283; $g[3][10] = $gm2; $g[3][11] = $gs2; $g[5][1] = $gmn4; $g[5][2] = $gm4; $g[5][3] = $gms4; $pref_z0 = $z0; for ($j = 1; $j <= 5; $j++) { $pref_a[$j] = { }; $pref_g[$j] = { }; for ($i = 1; $i <= 11; $i++) { $pref_a[$j][$i] = $a[$j][$i]; $pref_g[$j][$i] = $g[$j][$i]; } } } } // calculation feature heights function calc_hauteur($valeur:Number):Number { var $h:Number = $z0 * 10; var $j:int; for ($j = 1; $j <= 5; $j++) { var $rj:Number = $r0[$j] + $valeur / 24 * ($r24[$j] - $r0[$j]); var $deltaj:Number = $phi24[$j] - $phi0[$j]; if ($deltaj < -180) $deltaj = $deltaj + 360; if ($deltaj > 180) $deltaj = $deltaj - 360; var $phij:Number = $phi0[$j] + $valeur / 24 * (($j - 1) * 360 + $deltaj); $h = $h + $rj * Math.cos($phij * Math.PI / 180); } return $h; } // calculating functions Tide function calcul_maree($iscoef:Number = -1):void { var $sigma:Number = 0; var $sigma2:Number = 0; var $dt:Number = 0; var $pb:Number = 0; var $pif:Number = 0; var $deltapm:Number = 0; // initialization method Tide init_maree($iscoef); var $j:int = 3; if ($phi0[$j] < 0) $deltapm = 0; else $deltapm = 1; var $t:Number = 0; var $deltaj:Number = 0; var $rj:Number = 0; var $phij:Number = 0; var $tpbs:Object = { }; for ($j = 1; $j <= 5; $j++) { $rj = $r0[$j] + $t / 24 * ($r24[$j] - $r0[$j]); $deltaj = $phi24[$j] - $phi0[$j]; if ($deltaj < -180) $deltaj = $deltaj + 360; if ($deltaj > 180) $deltaj = $deltaj - 360; $phij = $phi0[$j] + $t / 24 * (($j - 1) * 360 + $deltaj); $sigma = $sigma + Math.PI / 180 * $rj * (15 * ($j - 1) + $deltaj / 24) * Math.sin($phij * Math.PI / 180) - ($r24[$j] - $r0[$j]) / 24 * Math.cos($phij * Math.PI / 180); } for ($pb = 1; $pb <= 4; $pb++) { $dt = 0.4; for ($pif = 1; $pif <= 2; $pif++) { do { $t = $t + $dt; $sigma2 = $sigma; $sigma = 0; for ($j = 1; $j <= 5; $j++) { $rj = $r0[$j] + $t / 24 * ($r24[$j] - $r0[$j]); $deltaj = $phi24[$j] - $phi0[$j]; if ($deltaj < -180) $deltaj = $deltaj + 360; if ($deltaj > 180) $deltaj = $deltaj - 360; $phij = $phi0[$j] + $t / 24 * (($j - 1) * 360 + $deltaj); $sigma = $sigma + Math.PI / 180 * $rj * (15 * ($j - 1) + $deltaj / 24) * Math.sin($phij * Math.PI / 180) - ($r24[$j] - $r0[$j]) / 24 * Math.cos($phij * Math.PI / 180); } } while (sng($sigma) == sng($sigma2)); $t = $t - $dt; if ($pif == 1) { $sigma = $sigma2; $dt = 0.01; } } $tpbs[$pb] = $t; } if ($iscoef >= 0) { // Affects tidal coefficients $cfm = Math.round(calc_hauteur($tpbs[1 + $deltapm]) / 10); $cfs = Math.round(calc_hauteur($tpbs[3 + $deltapm]) / 10); } else { // Assigns hours and tidal heights $pmm = convdateheure($tpbs[1 + $deltapm]); $pms = convdateheure($tpbs[3 + $deltapm]); $bmm = convdateheure($tpbs[2 - $deltapm]); $bms = convdateheure($tpbs[4 - $deltapm]); $hpmm = convhauteur(calc_hauteur($tpbs[1 + $deltapm])); $hpms = convhauteur(calc_hauteur($tpbs[3 + $deltapm])); $hbmm = convhauteur(calc_hauteur($tpbs[2 - $deltapm])); $hbms = convhauteur(calc_hauteur($tpbs[4 - $deltapm])); } } // fonction d'initialisation de la marée function init_maree($iscoef:Number = -1):void { var $n1:Array = [[0,0,0,0,0,0,0,0,0,0,0], [0,-2,-3,0,-2,0,0,0,0,0,0], [-2,-3,0,-4,-4,-3,-1,0,0,-2,0], [0,0,0,0,0,0,0,0,0,0,0], [-5,-4,-2,0,0,0,0,0,0,0,0]]; var $n2:Array = [[1,0,0,0,0,0,0,0,0,0,0], [1,1,1,-1,1,1,0,0,0,0,0], [2,2,0,2,4,4,2,2,-1,2,2], [0,0,0,0,0,0,0,0,0,0,0], [4,4,2,0,0,0,0,0,0,0,0]]; var $n3:Array = [[0,0,0,0,0,0,0,0,0,0,0], [0,0,1,0,0,0,0,0,0,0,0], [0,1,0,2,0,-1,-1,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0], [1,0,0,0,0,0,0,0,0,0,0]]; var $n4:Array = [[0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,-1,1,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,-1,1], [0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0]]; var $n5:Array = [[0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0]]; var $n6:Array = [[0,0,0,0,0,0,0,0,0,0,0], [1,-1,-1,1,-1,1,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0]]; var $i:int, $j:int, $test:Number; if ($iscoef >= 0) { $z0 = $coef_z0; for ($j = 1; $j <= 5; $j++) { for ($i = 1; $i <= 11; $i++) { $a[$j][$i] = $coef_a[$j][$i]; $g[$j][$i] = $coef_g[$j][$i]; } } } else { $z0 = $pref_z0; for ($j = 1; $j <= 5; $j++) { for ($i = 1; $i <= 11; $i++) { $a[$j][$i] = $pref_a[$j][$i]; $g[$j][$i] = $pref_g[$j][$i]; } } } var $t:Number = 0; var $t2:Number = Math.floor(30.6001 * (1 + $mois_maree + 12 * Math.floor(1 / ($mois_maree + 1) + 0.7))) + Math.floor(365.25 * ($annee_maree - Math.floor(1 / ($mois_maree + 1) + 0.7))) + $jour_maree + $t / 24 - 723258; var $h:Number = 279.82 + 0.98564734 * $t2; var $s:Number = 78.16 + 13.17639673 * $t2; var $p:Number = 349.5 + 0.11140408 * $t2; var $n:Number = 208.1 + 0.05295392 * $t2; var $p1:Number = 282.6 + 0.000047069 * $t2; var $d:Number = 90; $r0 = { }; $phi0 = { }; for ($j = 1; $j <= 5; $j++) { var $xj:Number = 0; var $yj:Number = 0; for ($i = 1; $i <= 11; $i++) { var $vij:Number = 15 * ($j - 1) * $t + $n1[$j-1][$i-1] * $s + $n2[$j-1][$i-1] * $h + $n3[$j-1][$i-1] *$p + $n4[$j-1][$i-1] * $n + $n5[$j-1][$i-1] * $p1 + $n6[$j-1][$i-1] * $d; $xj = $xj + $a[$j][$i] * Math.cos(Math.PI / 180 * ($vij - $g[$j][$i])); $yj = $yj + $a[$j][$i] * Math.sin(Math.PI / 180 * ($vij - $g[$j][$i])); } $r0[$j] = Math.sqrt(($xj * $xj) + ($yj * $yj)); if ($r0[$j] == 0) $phi0[$j] = 90; else { $test = 180 / Math.PI * (Math.asin($yj / $r0[$j])); if ($test < 0) $phi0[$j] = 180 / Math.PI * (Math.acos($xj / $r0[$j])) * -1; else $phi0[$j] = 180 / Math.PI * (Math.acos($xj / $r0[$j])); } } $t = 24; $t2 = Math.floor(30.6001 * (1 + $mois_maree + 12 * Math.floor(1 / ($mois_maree + 1) + 0.7))) + Math.floor(365.25 * ($annee_maree - Math.floor(1 / ($mois_maree + 1) + 0.7))) + $jour_maree + $t / 24 - 723258; $h = 279.82 + 0.98564734 * $t2; $s = 78.16 + 13.17639673 * $t2; $p = 349.5 + 0.11140408 * $t2; $n = 208.1 + 0.05295392 * $t2; $p1 = 282.6 + 0.000047069 * $t2; $d = 90; $r24 = { }; $phi24 = { }; for ($j = 1; $j <= 5; $j++) { $xj = 0; $yj = 0; for ($i = 1; $i <= 11; $i++) { $vij = 15 * ($j - 1) * $t + $n1[$j-1][$i-1] * $s + $n2[$j-1][$i-1] * $h + $n3[$j-1][$i-1] *$p + $n4[$j-1][$i-1] * $n + $n5[$j-1][$i-1] * $p1 + $n6[$j-1][$i-1] * $d; $xj = $xj + $a[$j][$i] * Math.cos(Math.PI / 180 * ($vij - $g[$j][$i])); $yj = $yj + $a[$j][$i] * Math.sin(Math.PI / 180 * ($vij - $g[$j][$i])); } $r24[$j] = Math.sqrt(($xj * $xj) + ($yj * $yj)); if ($r24[$j] == 0) $phi24[$j] = 90; else { $test = 180 / Math.PI * (Math.asin($yj / $r24[$j])); if ($test < 0) $phi24[$j] = 180 / Math.PI * (Math.acos($xj / $r24[$j])) * -1; else $phi24[$j] = 180 / Math.PI * (Math.acos($xj / $r24[$j])); } } } ///////////////////////////////////////////////////////////////////////////////////////////////////// // Helper Functions ///////////////////////////////////////////////////////////////////////////////////////////////////// function sng($valeur:Number):Number { if ($valeur < 0) return -1; else return 1; } function convdateheure($valeur:Number):String { var $heure:Number = Math.floor($valeur); var $minute:Number = Math.floor(Math.floor(($valeur - Math.floor($valeur)) * 100) * 0.6); var hoursLabel:String = "", minsLabel:String = ""; if ($heure == 24) $heure = 0; // Check if at the 24 hour mark, change to 0 if ($heure < 10) hoursLabel += "0" + $heure.toString(); else hoursLabel = $heure.toString(); if ($minute < 10) minsLabel += "0" + $minute.toString(); else minsLabel = $minute.toString(); return hoursLabel + ":" + minsLabel; } function convhauteur($valeur:Number):Number { var $temp:Number = Math.floor($valeur / 10) / 100; return Number($temp.toFixed(2)); } ////////////////////////////////////// ////////////////////////////////////// ////////////////////////////////////// ////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////// // TideDataLoader.as ///////////////////////////////////////////////////////////////////////////////////////////////////// const COMPLETE:String = Event.COMPLETE; const IO_ERROR:String = IOErrorEvent.IO_ERROR; var _localPath:String = "data/"; var _localTideDataFile:String = "tide_data.xml"; var _tideXmlData:XML; function get tideXmlData():XML { return _tideXmlData; } var _callBackFunc:Function; var _configLoader:URLLoader; var _isDebugger:Boolean = true; ///////////////////////////////////////////////////////////////////////////////////////////////////// // Load Local Tide Data ///////////////////////////////////////////////////////////////////////////////////////////////////// function loadLocalData(callBackFunc:Function):void { _callBackFunc = callBackFunc; _configLoader = new URLLoader(); addDataEvents(); //var localDataFile:File = File.applicationDirectory; //localDataFile = localDataFile.resolvePath(_localPath + _localTideDataFile); // _configLoader.load( new URLRequest( localDataFile.url )); _configLoader.load( new URLRequest( _localTideDataFile )); } function addDataEvents():void { _configLoader.addEventListener( flash.events.Event.COMPLETE, onLoadDataCompleted, false, 0 ); _configLoader.addEventListener( IOErrorEvent.IO_ERROR, onLoadDataIOError, false, 0 ); } function removeDataEvents():void { _configLoader.removeEventListener( flash.events.Event.COMPLETE, onLoadDataCompleted ); _configLoader.removeEventListener( IOErrorEvent.IO_ERROR, onLoadDataIOError ); } function onLoadDataCompleted( event:flash.events.Event ):void { removeDataEvents(); _tideXmlData = new XML(event.target.data); _callBackFunc({status:COMPLETE}); } function onLoadDataIOError(e:IOErrorEvent):void { removeDataEvents(); _callBackFunc({status:IO_ERROR}); }
... View more