I've got an AS3 code that calculates the thides (highs and lows). Want to calculate the actual tide.
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});
}
