/** * @param $mareeRestriction: points de la restriction * @param $a: de l'équation y = a sin(wt + Phi) + b * @param $b: de l'équation y = a sin(wt + Phi) + b * @param $w: de l'équation y = a sin(wt + Phi) + b * @param $phi: de l'équation y = a sin(wt + Phi) + b * @param $tHMax: time lorsque la courbe est au + haut pour la 1er fois de la journée * Return tableau et le temps (en sec) correspondant à cette restriction entre HEURE_MATIN et HEURE_SOIR */ static function calculTimeInState($mareeRestriction, $listePrevisionMaree) { $timeRestriction = 0; $timeTab = array(); $hMaxRestriction = $mareeRestriction->getHauteurMax(); // hauteur haute de la restriction $hMinRestriction = $mareeRestriction->getHauteurMin(); // hauteur basse de la restriction $previsionMaree = $listePrevisionMaree->first(); $dayBegin = new \DateTime($previsionMaree->getMareeDate()->getDatePrev()->format('Y-m-d')); $dayBegin->modify('+' . CreateNoteCommand::HEURE_MATIN . ' hours'); $dayEnd = new \DateTime($previsionMaree->getMareeDate()->getDatePrev()->format('Y-m-d')); $dayEnd->modify('+' . CreateNoteCommand::HEURE_SOIR . ' hours'); $tBegin = $dayBegin->getTimestamp(); // jour J à 8h00 $tEnd = $dayEnd->getTimestamp(); // jour J à 20h00 $tabDataSinu = self::generateSinousoidal($listePrevisionMaree); // hauteur min de la sinousoidal $yMax = $tabDataSinu['yMax']; $yMin = $tabDataSinu['yMin']; $periode = $tabDataSinu['periode']; $tyMin = $tabDataSinu['tyMin']; $tyMax = $tabDataSinu['tyMax']; $tyMax = $tyMax > $tBegin ? $tyMax : $tyMax + $periode; // $tyMax : premiere time au max de la courbe en periode naviguable $tyMin = $tyMin > $tBegin ? $tyMin : $tyMin + $periode; // $tyMin : premiere time au max de la courbe en periode naviguable if ($hMaxRestriction >= $yMax) { // Courbe au dessous de la restriction: $hMaxRestriction // -> tous ce qui est au dessus de $hmin est à comptabiliser if ($hMinRestriction <= $yMin) { // Courbe au dessus de la restriction: $hMinRestriction => Aucun interet d'avoir une restriction... // -> tous est à comptabiliser $timeRestriction = $tEnd - $tBegin; $timeTab[] = array("begin" => date("H:i:s", $tBegin), "end" => date("H:i:s", $tEnd)); } else { // courbe au dessous de la restriction max et min -> intersection entre la restriction min et la courbe $c = $hMinRestriction; // intersection avec la droite $y=$c //tous ce qui est au dessus de $hmin est à comptabiliser ($hMin coupe la courbe sinusoidale de la marée) list($k, $tInter) = MareeTools::findTInterBegin($tabDataSinu, 0, 0, $tBegin, $c); // courbe montante ou descendante ? if (MareeTools::isMontant($tabDataSinu, $tInter, $c)) { // courbe montante //on prend tous ce qui suit, jusqu'au point d'intersection suivant // Calcul point d'intersection suivant if ($tInter >= $tyMax) { // point d'intersection avant la 1er marée haute -> (tHauteurMax-$tInterReel) x 2 $timeToAdd = ($tyMax + $periode - $tInter) * 2; } else { // point d'intersection après la 1er marée haute -> (tHauteurMax-$tInterReel) x 2 $timeToAdd = ($tyMax - $tInter) * 2; } //$timeRestriction +=$timeToAdd; // $tInter est au debut d'une periode à prendre en compte } else { // courbe descendante // on prend de tBegin à tInter $timeRestriction += $tInter - $tBegin; $timeTab[] = array("begin" => date("H:i:s", $tBegin), "end" => date("H:i:s", $tInter)); // calcul le temps à ajouter pour chaque période if ($tInter <= $tyMin) { // t intersection avec restriction est avant la 1er marée basse $timeToAdd = $periode - ($tyMin - $tInter) * 2; $tInter = $tInter + ($tyMin - $tInter) * 2; // $tInter est au debut d'une periode à prendre en compte } else { // t intersection avec restriction est après la 1er marée basse $timeToAdd = $periode - ($tyMin + $periode - $tInter) * 2; $tInter = $tInter + ($tyMin + $periode - $tInter) * 2; // $tInter est au debut d'une periode à prendre en compte } } // Calcul combien de fois il faut ajouter ce temps dans la journée (max 3) for ($i = 0; $i < 3; $i++) { // Le premier est déjà ajouté if ($tInter + $timeToAdd + $i * $periode <= $tEnd) { // on peut ajouter la période $timeRestriction += $timeToAdd; // ajoute la période $timeTab[] = array("begin" => date("H:i:s", $tInter + $i * $periode), "end" => date("H:i:s", $tInter + $timeToAdd + $i * $periode)); } else { if ($tInter + $i * $periode <= $tEnd) { // debut de la période OK, mais la fin dépasse l'heure de la fin de la session $timeRestriction += $tEnd - ($tInter + $i * $periode); $timeTab[] = array("begin" => date("H:i:s", $tInter + $i * $periode), "end" => date("H:i:s", $tEnd)); } } } } } else { // la restriction haute croise la courbe if ($hMaxRestriction > $yMin) { // Cas classique hMaxRestriction est au dessus de la + petite valeur de la courbe if ($hMinRestriction <= $yMin) { // tous ce qui est au dessous de $hMaxRestriction est a compter $c = $hMaxRestriction; // intersection avec la droite $y=$c //tous ce qui est au dessus de $hmin est à comptabiliser ($hMin coupe la courbe sinusoidale de la marée) list($k, $tInter) = MareeTools::findTInterBegin($tabDataSinu, 0, 0, $tBegin, $c); if (MareeTools::isMontant($tabDataSinu, $tInter, $c)) { // courbe montante // on prend de tBegin à tInter $timeRestriction += $tInter - $tBegin; $timeTab[] = array("begin" => date("H:i:s", $tBegin), "end" => date("H:i:s", $tInter)); // calcul le temps à ajouter pour chaque période if ($tInter <= $tyMax) { // t intersextion est avant la 1er marée haute $timeToAdd = $periode - ($tyMax - $tInter) * 2; $tInter = $tInter + ($tyMax - $tInter) * 2; // $tInter: debut d'un interval à compter } else { // t intersextion est après la 1er marée haute $timeToAdd = $periode - ($tyMax + $periode - $tInter) * 2; $tInter = $tInter + ($tyMax + $periode - $tInter) * 2; // $tInter: debut d'un interval à compter } } else { // courbe descendante //on prend tous ce qui suit, jusqu'au point d'intersection suivant if ($tInter <= $tyMin) { // t Intersection avec restriction max, est avant la 1er marée basse de la journnée $timeToAdd = ($tyMin - $tInter) * 2; } else { // la 1er marée basse de la journnée, est avant t Intersection avec restriction max $timeToAdd = ($tyMin + $periode - $tInter) * 2; } } // Calcul combien de fois il faut ajouter ce temps dans la journée (max 3) for ($i = 0; $i < 4; $i++) { if ($tInter + $timeToAdd + $i * $periode <= $tEnd) { // on peut ajouter la période $timeRestriction += $timeToAdd; // ajoute la période $timeTab[] = array("begin" => date("H:i:s", $tInter + $i * $periode), "end" => date("H:i:s", $tInter + $timeToAdd + $i * $periode)); } else { if ($tInter + $i * $periode <= $tEnd) { // debut de la période OK, mais la fin dépasse l'heure de la fin de la session $timeRestriction += $tEnd - ($tInter + $i * $periode); $timeTab[] = array("begin" => date("H:i:s", $tInter + $i * $periode), "end" => date("H:i:s", $tEnd)); //***************** ICI EST l ERREUR ********************* } } } } else { // pire des cas intersection pour partie haute et partie basse de la restriction.... // on va devoir regarder les 2 intersections (typique de la retriction Warn) // On se cale sur tInterMin en pente montante // Find intersection after $tBegin list($kMax, $tInterMax) = MareeTools::findTInterBegin($tabDataSinu, 0, 0, $tBegin, $hMaxRestriction); list($kMin, $tInterMin) = MareeTools::findTInterBegin($tabDataSinu, 0, 0, $tBegin, $hMinRestriction); // $tInterMax : date intersection avec la restriction haute // $tInterMin : date intersection avec la restriction basse $timeToAdd = 0; // temps entre $tInterMin et $tInterMax en phase montante $timeInter2tInterMax = 0; // temps entre les 2 tInterMax (pente montante et pente descendante) if ($tInterMax < $tInterMin) { // 1er intersection: $tInterMax -> descendante ou tBegin entre les deux if (MareeTools::isMontant($tabDataSinu, $tInterMin, $hMinRestriction)) { // Ajoute $tBegin -> $tInterMax list($timeRestriction, $timeTab) = MareeTools::calculTimeRestrictionBetweenTInterFirstAndTInterSecond($tBegin, $tInterMax, $tEnd, $timeRestriction, $timeTab); // Chercher l'intersection suivante, symetrique par rapport à $tHMax $timeInter2tInterMax = ($tyMax - $tInterMax) * 2; $tInterMax = $tInterMax + $timeInter2tInterMax; // calcul entre $tInterMax et $tInterMin list($timeRestriction, $timeTab) = MareeTools::calculTimeRestrictionBetweenTInterFirstAndTInterSecond($tInterMax, $tInterMin, $tEnd, $timeRestriction, $timeTab); $timeToAdd = $tInterMin - $tInterMax; // On se cale sur tInterMin en pente montante $tInterMin = $tInterMin + ($tyMin - $tInterMin) * 2; } else { // pente descendante // calcul entre $tInterMax et $tInterMin list($timeRestriction, $timeTab) = MareeTools::calculTimeRestrictionBetweenTInterFirstAndTInterSecond($tInterMax, $tInterMin, $tEnd, $timeRestriction, $timeTab); $timeToAdd = $tInterMin - $tInterMax; $timeInter2tInterMin = ($tyMin - $tInterMin) * 2; $timeInter2tInterMax = $periode - 2 * $timeToAdd - $timeInter2tInterMin; //prend un crayon pour t'en assurer... // On se cale sur tInterMin en pente montante $tInterMin = $tInterMin + $timeInter2tInterMin; } } else { // $tInterMin<$tInterMax // 1er intersection est la restriction basse // 1er intersection: $tInterMin -> montante ou tBegin entre les deux if (MareeTools::isMontant($tabDataSinu, $tInterMin, $hMinRestriction)) { // On est calé sur tInterMin en pente montante // Nickel on ne fait rien $timeToAdd = $tInterMax - $tInterMin; // On est en pente montante, tInterMax est l'interception avec restriction haute et la courbe // -> prochaine interception courbe descendante symétrique avec le sommet qui est en tyMax $timeInter2tInterMax = 2 * ($tyMax - $tInterMax); //prend un crayon pour t'en assurer... Faux // ***** Faux lorsque montant puis resdescendant **** //$timeInter2tInterMax=2*($timeToAdd+$tyMax-$tInterMin); //prend un crayon pour t'en assurer...Mais c'est faux... } else { // pente descendante // add $tBegin -> $tInterMin list($timeRestriction, $timeTab) = MareeTools::calculTimeRestrictionBetweenTInterFirstAndTInterSecond($tBegin, $tInterMin, $tEnd, $timeRestriction, $timeTab); // On se cale sur tInterMin en pente montante // aller à l'intersection suivante - symetrique avec THMin $timeInter2tInterMin = ($tyMin - $tInterMin) * 2; $tInterMin = $tInterMin + $timeInter2tInterMin; $timeToAdd = $tInterMax - $tInterMin; $timeInter2tInterMax = $periode - 2 * $timeToAdd - $timeInter2tInterMin; //prend un crayon pour t'en assurer... Mais c'est faux ??? } } // $timeToAdd, $timeInter2tInterMax et $epriode sont définits // On est calé sur tInterMin en pente montante list($timeRestriction, $timeTab) = MareeTools::calculTimeRestrictionFromTInterMin($tInterMin, $periode, $timeToAdd, $timeInter2tInterMax, $tEnd, $timeRestriction, $timeTab); } } } return array($timeRestriction, $timeTab); }