Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Określenie lokalizacji obiektu w konkretnym czasie
Forum PHP.pl > Forum > Przedszkole
northwest
Witam serdecznie,
Mam dość nietypowy problem.
Mam następujące zmienne:
$A - nazwa punktu startowego
$B - nazwa punktu docelowego
$CZAS - czas w jakim pojazd jedzie z punktu A do punktu B
$CZAS_PRZERWY - 1h (przerwa po dotarciu pojazdu z punktu A do punktu B lub z B do A - pojazd jeździ w kółko). Czyli przykładowo pojazd przyjechał z punktu B do A o 14.05 - to wyjazd z punktu A do B nastąpi o 15.05.

Pojazdy jeżdżą w "kółko" z zachowaniem przerwy.

Potrzebuję funkcję która określi w jakim punkcie będzie pojazd (lub do jakiego będzie zmierzał) o konkretnej godzinie i dacie.

Czyli pojazd sobie jeździ - wybieram termin 2014-07-26 11:43 - i funkcja powinna zwrócić informację w którym punkcie będzie pojazd.

Ma ktoś może pomysł jak to zrobić?

Bardzo proszę o pomoc,
Northwest

zapomniałem dodać w poprzednim poście, mamy jeszcze $CZAS_STARTU_KURSOW = data i czas pierwszego kursu
fate
zakładając brak przyspieszenia konstruujesz proporcje czyli zwykłe dzielenie = ułamki.
northwest
tak, prędkość jest stała ($CZAS)

masz jakiś pomysł jak to zapisać? Próbowałem także na kartce, ale nie wychodzi mi sad.gif
Michael2318
Napisałem na szybko takie cuś:

  1. <?php
  2.  
  3. $a = 'A';
  4. $b = 'B';
  5. $start_kursu = 1405305685;
  6. $data = 1405305795;
  7. $czas_przerwy = 60; // podajemy w sekundach
  8. $czas = 90; // czas twrania podróży w sekundach
  9.  
  10. function sprawdz_gdzie_jestes($a, $b, $start_kursu, $czas, $czas_przerwy, $data)
  11. {
  12. $count_travel_time = $czas + $czas_przerwy; // liczymy ile zajmie nam cała droga z pktu A do pkt B + przerwa
  13. $count_dates = $data - $start_kursu; // odejmujemy różnicę - data startu kursu od daty, którą wpisaliśmy aby sprawdzić gdzie jest dany pojazd w danym czasie
  14. $counter = ceil($count_dates/$count_travel_time); // dzielimy różnicę czasu staru kursu od daty, którą wpisaliśmy aby sprawdzić gdzie jest dany pojazd przez całkowity czas trwania jednej podróży wraz z przerwą i zaokrąglamy to w górę
  15.  
  16. $e_start = $a;
  17. $e_end = $b;
  18. $time = $start_kursu;
  19. $return_tab = array();
  20.  
  21. for($i=0; $i<=$counter; $i++)
  22. {
  23. if ( ($data - $time) <= $count_travel_time )
  24. {
  25. if ( ($data - $time) >= $czas )
  26. {
  27. $return_tab = array(
  28. 'start' => $e_start,
  29. 'end' => $e_end,
  30. 'break' => TRUE
  31. );
  32.  
  33. break;
  34. }
  35. else
  36. {
  37. $return_tab = array(
  38. 'start' => $e_start,
  39. 'end' => $e_end,
  40. 'break' => FALSE
  41. );
  42.  
  43. break;
  44. }
  45. }
  46.  
  47. $start = $e_start;
  48. $e_start = $e_end;
  49. $e_end = $start;
  50. $time = $time+$count_travel_time;
  51. }
  52.  
  53. if ( $return_tab['break'] == FALSE )
  54. {
  55. return 'Pojazd obecnie jest w drodze z punktu '.$return_tab['start'].' do punktu '.$return_tab['end'];
  56. }
  57. else
  58. {
  59. return 'Pojazd obecnie jest w trakcie przerwy. Przyjechał z punktu '.$return_tab['start'].' do punktu '.$return_tab['end'];
  60. }
  61. }
  62.  
  63. echo sprawdz_gdzie_jestes($a, $b, $start_kursu, $czas, $czas_przerwy, $data);
  64.  
  65. ?>


Ale musisz sprawdzić jakoś kalkulatorem czy to w ogóle dobrze oblicza. Po prostu na kartce przeliczyć i porównać wynik z tym co zwróci ta funkcja.
Daty są w formacie timtestamp.

Najpierw komentowałem co po niektóre linie, ale potem mi się odechciało, jak coś to pytaj tongue.gif

EDIT:

Tu masz jeszcze gotową funkcję do zmiany zwykłych dat na format timtestamp: http://phpkurs.pl/przetwarzanie-daty/ :

  1. <?php
  2.  
  3. $dzien = 10;
  4. $miesiac = 4;
  5. $rok = 2002;
  6. $godzina = 12;
  7. $minuta = 32;
  8. $sekunda = 0;
  9.  
  10. $ts = mktime($godzina, $minuta, $sekunda, $miesiac, $dzien, $rok);
  11.  
  12. ?>
northwest
dziękuję, chyba to jest to co trzeba!! smile.gif

Da się jakoś prosto wyświetlić grafik tych przejazdów które się odbyły? Tzn jak podajemy datę do sprawdzenia - to informację jak wyglądały przejazdy przed tą datą? smile.gif
Michael2318
Spróbuj:

  1. <?php
  2.  
  3. $a = 'A';
  4. $b = 'B';
  5. $start_kursu = 1405305685;
  6. $data = 1405305986;
  7. $czas_przerwy = 60; // podajemy w sekundach
  8. $czas = 90; // czas twrania podróży w sekundach
  9.  
  10. function sprawdz_gdzie_jestes($a, $b, $start_kursu, $czas, $czas_przerwy, $data)
  11. {
  12. $count_travel_time = $czas + $czas_przerwy; // liczymy ile zajmie nam cała droga z pktu A do pkt B + przerwa
  13. $count_dates = $data - $start_kursu; // odejmujemy różnicę - data startu kursu od daty, którą wpisaliśmy aby sprawdzić gdzie jest dany pojazd w danym czasie
  14. $counter = ceil($count_dates/$count_travel_time)*2; // dzielimy różnicę czasu staru kursu od daty, którą sprawdzamy przez całkowity czas trwania jednej podróży wraz z przerwą i zaokrąglamy to w górę
  15.  
  16. $e_start = $a; // punkt startu
  17. $e_end = $b; // punkt, w którym kurs się kończy
  18. $time = $start_kursu; // startowy czas, jako domyśla wartość - czas startu pierwszego kursu
  19. $return_tab = array(); // tworzymy domyślną tablicę wynikową
  20.  
  21. for($i=0; $i<=$counter; $i++)
  22. {
  23. $breaking = ($i % 2 !== 0) ? TRUE : FALSE; // sprawdzamy czy obecnie jest przerwa czy jazda, TRUE = PRZERWA, FALSE = JAZDA
  24. $found = FALSE; // zmienna informująca o tym czy obecnie przelatywany rekord w pętli to ten szukany, domyślnie zmiennej przypisujemy FALSE
  25.  
  26. if ( ($data - $time) <= ($breaking ? $czas_przerwy : $czas) ) // Sprawdzamy czy obecnie przelatywany rekord w pętli to ten, którego szukaliśmy...
  27. {
  28. $found = TRUE; //... jeśli TAK to przypisujemy TRUE
  29. }
  30.  
  31. if ( $breaking ) // jeśli obecnie przelatywany rekord to przerwa...
  32. {
  33. $return_tab[] = array( // przypisujemy tablicę wynikową
  34. 'time_from' => $time+1, // data, od kiedy zaczyna się przerwa
  35. 'time_to' => ($breaking ? $time+$czas_przerwy : $time+$czas), // data, kiedy kończy się przerwa
  36. 'start' => $e_start, // punkt startu
  37. 'end' => $e_end, // punkt kończący trasę
  38. 'break' => TRUE, // zmienna logiczna informująca czy ta tablica wynikowa to przerwa, w tym wypadku TAK
  39. 'found' => $found ? TRUE : FALSE // sprawdzamy czy ta tablica wynikowa to nasza szukana po dacie
  40. );
  41. }
  42. else // jeśli obecnie przelatywany rekord to jazda...
  43. {
  44. $return_tab[] = array(
  45. 'time_from' => ($i == 0 ? $time : $time+1), // data, od kiedy zaczyna się przerwa
  46. 'time_to' => ($breaking ? $time+$czas_przerwy : $time+$czas), // data, kiedy kończy się przerwa
  47. 'start' => $e_start, // punkt startu
  48. 'end' => $e_end, // punkt kończący trasę
  49. 'break' => FALSE, // zmienna logiczna informująca czy ta tablica wynikowa to przerwa, w tym wypadku NIE
  50. 'found' => $found ? TRUE : FALSE // sprawdzamy czy ta tablica wynikowa to nasza szukana po dacie
  51. );
  52. }
  53.  
  54. if ( $found ) // jeśli obecnie przelatywany rekord to nasza szukana...
  55. {
  56. break; // przerywamy pętlę
  57. }
  58.  
  59. if ( $breaking ) // jeśli obecnie przelatywany rekord to przerwa...
  60. {
  61. $start = $e_start; // przypisujemy do zmiennej $start, punkt startowy z poprzedniego przelotu
  62. // teraz będziemy zamieniać punkt startu z punktem kończącym:
  63. $e_start = $e_end; // przypisujemy do punktu startu, punkt kończący...
  64. $e_end = $start; // oraz do punktu kończącego, punkt startowy
  65. }
  66.  
  67. $time = $breaking ? $time+$czas_przerwy : $time+$czas; // w zależności czy obecnie przelatywany rekord to była przerwa czy jazda - dodajemy odpowiednią ilość czasu
  68. }
  69.  
  70. $txt = ''; // zmienna wynikowa (tekstowa), na start pusta
  71.  
  72. foreach( $return_tab AS $key => $value )
  73. {
  74. if ( $value['break'] == FALSE && $value['found'] == TRUE )
  75. {
  76. $txt .= '<b>'.date('d-m-Y H:i:s', $value['time_from']).' - '.date('d-m-Y H:i:s', $value['time_to']).' - Pojazd obecnie jest w drodze z punktu '.$value['start'].' do punktu '.$value['end'].'</b><br>';
  77. }
  78. else if ( $value['break'] == TRUE && $value['found'] == TRUE )
  79. {
  80. $txt .= '<b>'.date('d-m-Y H:i:s', $value['time_from']).' - '.date('d-m-Y H:i:s', $value['time_to']).' - Pojazd obecnie jest w trakcie przerwy. Przyjechał z punktu '.$value['start'].' do punktu '.$value['end'].'</b><br>';
  81. }
  82. else if ( $value['break'] == TRUE && $value['found'] == FALSE )
  83. {
  84. $txt .= date('d-m-Y H:i:s', $value['time_from']).' - '.date('d-m-Y H:i:s', $value['time_to']).' - Pojazd odbył przerwę, po podróży z punktu '.$value['start'].' do punktu '.$value['end'].'<br>';
  85. }
  86. else if ( $value['break'] == FALSE && $value['found'] == FALSE )
  87. {
  88. $txt .= date('d-m-Y H:i:s', $value['time_from']).' - '.date('d-m-Y H:i:s', $value['time_to']).' - Pojazd odbywał podróż z punktu '.$value['start'].' do punktu '.$value['end'].'<br>';
  89. }
  90. }
  91.  
  92. return $txt;
  93. }
  94.  
  95. echo sprawdz_gdzie_jestes($a, $b, $start_kursu, $czas, $czas_przerwy, $data);
  96.  
  97. ?>
northwest
liczy smile.gif dziękuje smile.gif

Witaj,
Próbuję zaadaptować Twój skrypt do mojego kodu, ale natrafiłem na parę problemów których wcześniej nie przewidziałem sad.gif

Mam taką tabelkę MySQL:
  1. CREATE TABLE IF NOT EXISTS `jazdy` (
  2. `bf_id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT,
  3. `nazwa` varchar(160) COLLATE utf8_unicode_ci DEFAULT NULL,
  4. `odleglosc` int(11) DEFAULT NULL,
  5. `czaslotu` int(11) DEFAULT NULL,
  6. `lotstart` int(11) DEFAULT NULL,
  7. `lotcel` int(11) DEFAULT NULL,
  8. `datastart` datetime DEFAULT NULL,
  9. `datacel` datetime DEFAULT NULL,
  10. `datarozpoczeciakursow` datetime DEFAULT NULL,
  11. UNIQUE KEY `id` (`bf_id`)
  12. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;

i wywołuje sobie Twój kod tak:
  1. $zasieg = 150;
  2.  
  3. $dddzis = "$dddzis 23:59:59";
  4. $date = new DateTime($dddzis);
  5. $dtg2 = $date->modify('+1 day');
  6. $dddzis = $dtg2->format("Y-m-d H:i") . ":00";
  7.  
  8. $a = $rodw['lotstart'];
  9. $b = $rodw['lotcel'];
  10. $start_kursu = strtotime($rodw['datarozpoczeciakursow']);
  11. $data = strtotime($dddzis);
  12. $czas_przerwy = 3600; // podajemy w sekundach
  13. $czas = $zasiegminut * 60; // czas twrania podróży w sekundach
  14.  
  15. echo sprawdz_gdzie_jestes($a, $b, $start_kursu, $czas, $czas_przerwy, $data);



I ten kod działa... Zaczyna się problem kiedy w ciągu dnia zmieniają się dane (tzn zamiast ściśle ustalonej trasy dochodzi kolejna - w inne miejsce)...

Masz może jakiś pomysł jak to rozwiązać?

Bardzo proszę o pomoc,
Northwest
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.