Beispiel #1
0
 /**
  * @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);
 }