Autor Zpráva
BlueShadow
Profil
Ahojte,

robím jednu kalkulačku pre tra*ian, ktorá vypočíta rýchlosť presunu zo súradníc A na súradnice B, využíva sa pritom pytagorova veta, a narazil som na jeden problémik, pokiaľ sú súradnice rovné, teda netreba ísť šikmo, tak to vypočíta dobrý čas, rovnaký ako tra*ian, ale pokiaľ zvolím súradnice, na ktoré treba ísť šikmo, tak mi to vyhodí o 1s menší čas ako vyhodí tra*ian, skript je tu:

<?php
$BodAX = 58;
$BodBX = 57;

$BodAY = 31;
$BodBY = 33;


$tmp = pow(abs($BodAX - $BodBX), 2) + pow(abs($BodAY - $BodBY), 2);
$Celkova_Vzdalenost = sqrt($tmp);

echo "Celkova vzdalenost: ";
printf($Celkova_Vzdalenost);

$dobaGa = ($Celkova_Vzdalenost / 12 );
$casGa = ($dobaGa * 60 * 60);
echo "Doba chuze: &nbsp;";
echo Date("H:i:s", $casGa);

echo "Gal prijde v &nbsp;";

// Promenná z aktuálním casem 
$Aktualni_cas = Time();

// Cesta
$Doba_min_cestyGa = $casGa;
$Doba_sec_cestyGa = $Doba_min_cestyGa; 
$PrichodGa = $Aktualni_cas+$Doba_sec_cestyGa;
echo Date("H:i:s", $PrichodGa);
echo "<p> ";

echo Date("H:i:s", $Aktualni_cas)


?>


Má to tam ísť 11:11 podľa tra*ian, ale nech robím čo robím skript stále hádže 11:10, potrebujem aby to bolo 100%. Nejaké nápady kde môže byť chyba? Môj skromný odhad že niekde v zaokruhľovaní, ale netuším kde.

Ďakujem za každú pomoc.
BS
nightfish
Profil
pravděpodobně
$casGa = ceil(60*60*$dobaGa);
BlueShadow
Profil
díky moc už to ráta presne ako tra*ian :)

Ale mal by som ešte jednu otázku, teraz mi pod Gal prijde v: xx:xx:xx zráta aktuálny čas s časom cesty, ale ja, by som potreboval nahradiť aktuálny čas, časom ktorý sám napíšem vo formulári, takže vo formulári napíšem napr. 14:00:00 odošlem, a pokiaľ je cesta 11:11, skript vyhodí že Gal prijde v 14:11:11. Dúfam že ste pochopili, skúšal som to, lenže mi to hádzalo chyby, a keď nehodilo, tak vyšiel totálny blud. Tu je skript:

<?php

//skontrolujeme ci uz formular nebol odoslany
  if (empty ($_REQUEST))
  {
?>
<html>
<form method="get" action="/index.php">
  Suradnice:  X <input type="text" name="AX"  size=1 >
              Y   <input type="text" name="AY"  size=1 >
              
Suradnice 2:  X <input type="text" name="BX" size=1 >
              Y  <input type="text" name="BY" size=1 >
    <input type="Submit" name="odoslat">
</form>
</html>
<?php
  }
  else
{
  
//pytagorova veta
$tmp = pow(abs($_REQUEST["AX"] - $_REQUEST["BX"]), 2) + pow(abs($_REQUEST["AY"] - $_REQUEST["BY"]), 2);
$distance = sqrt($tmp);

//celkova vzdialenost policok
echo "Celkova vzdalenost: ";
printf($distance);

//vzdialenost preratavame na cas
$timesec = ($distance / 12 );
$time = ceil(60*60*$timesec);
echo "Doba chuze: &nbsp;";
echo Date("H:i:s", $time);

//spocitame cas cesty s aktualnym casom
echo "Gal prijde v &nbsp;";

//premenna s aktualnym casom
$current_time = Time();

$min_travel_time = $time;
$travel_time_sec = $min_travel_time; 
$totaltime = $current_time+$travel_time_sec;
echo Date("H:i:s", $totaltime);
echo "<p> ";

//aktualny cas zobrazeny
echo Date("H:i:s", $current_time);

echo "<a href='/index.php'> Go back </a>";
}

?>


Ďakujem za pomoc!
nightfish
Profil
místo Time() použij mktime()
BlueShadow
Profil
fúú a nejaký návod k tomu? Pozrel som na PHP.net ale nejako nechápem.

<?php

//skontrolujeme ci uz formular nebol odoslany
  if (empty ($_REQUEST))
  {
?>
<html>
<form method="get" action="/index.php">
  Suradnice:  X <input type="text" name="AX"  size=1 >
              Y   <input type="text" name="AY"  size=1 >
              
Suradnice 2:  X <input type="text" name="BX" size=1 >
              Y  <input type="text" name="BY" size=1 >
Cas prichodu     <input type="text" name="time" size=1 >
    <input type="Submit" name="odoslat">
</form>
</html>
<?php
  }
  else
{
  
//pytagorova veta
$tmp = pow(abs($_REQUEST["AX"] - $_REQUEST["BX"]), 2) + pow(abs($_REQUEST["AY"] - $_REQUEST["BY"]), 2);
$distance = sqrt($tmp);

//celkova vzdialenost policok
echo "Celkova vzdalenost: ";
printf($distance);

//vzdialenost preratavame na cas
$timesec = ($distance / 12 );
$time = ceil(60*60*$timesec);
echo "Doba chuze: &nbsp;";
echo Date("H:i:s", $time);

//spocitame cas cesty s aktualnym casom
echo "Gal prijde v &nbsp;";

//premenna s aktualnym casom
$current_time = mktime($_REQUEST["time"]);

$min_travel_time = $time;
$travel_time_sec = $min_travel_time; 
$totaltime = $current_time+$travel_time_sec;
echo Date("H:i:s", $totaltime);
echo "<p> ";

//aktualny cas zobrazeny
echo Date("H:i:s", $current_time);

echo "<a href='/index.php'> Go back </a>";
}

?>


Takto to hodí error:
Notice: A non well formed numeric value encountered in C:\Program Files\EasyPHP 3.0\www\index.php on line 41

Do inputu som zadal 14:00:00.
tiso
Profil
BlueShadow - návod použitia (examples) tam je, prejdi si aj komentáre.
BlueShadow
Profil
Prešiel som len tie prvé a keď som videl aké zacyklené je to, tak som už ďaľšie nepozeral, ale keď som pozrel znovu tak dole bol jeden ktorý pomohol, dík.

Už funguje výborne.
BlueShadow
Profil
Ok, mám ďaľší problém, teraz ráta všetko výborne, ani chyby nehádže, ale neviem prečo, po odoslaní, to vyhodí správnu dlžku polí, vyhodí správny výsledok čas cesty + zadaný čas príchodu, ale dobu cesty to priráta hodinu, teda keď je doba cesty čojaviem 10min, tak echo doba cesty ukáže 01:10:00, keď som to nahodil na hosting, tak tam zase pridáva 18 hodín, a vyhodí 18:10:00, ako celkový výsledok je správny, keď má zrátať čas príchodu tak to priráta len 10min, a nie aj tie hodiny, nevie niekto ako to opraviť?

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
  <meta http-equiv="content-type" content="text/html; charset=windows-1250">
  <meta name="generator" content="PSPad editor, www.pspad.com">;
  <title></title>
  </head>
  <body>
<?php

//skontrolujeme ci uz formular nebol odoslany
  if (empty ($_REQUEST))
  {
?>
<table>
<form method="get" action="/index.php">
<tr><td>Tvoje súradnice:</td></tr>
<tr><td>X<input type="text" name="AX"  size=1 ></td></tr>
<tr><td>Y<input type="text" name="AY"  size=1 ></td></tr>
</table>
<br>
<table>
<tr><td>Útočníkové súradnice:</td></tr>
<tr><td>X<input type="text" name="BX" size=1 ></td></tr>
<tr><td>Y<input type="text" name="BY" size=1 ></td></tr>
</table>
<br>
<table>
<tr><td>Čas príchodu útoku:</td></tr>
</table>
<table>
<tr><td>hodina<input type="text" name="hours" size=1 ></td>
<td>minúta<input type="text" name="minutes" size=1 ></td>
<td>sekunda<input type="text" name="seconds" size=1 ></td></tr>
</table>
<br>
<table>
<tr><td><input type="Submit" name="odoslat"></td></tr>
</form>
</table>
<?php
  }
  else
{
  
//pytagorova veta
$tmp = pow(abs($_REQUEST["AX"] - $_REQUEST["BX"]), 2) + pow(abs($_REQUEST["AY"] - $_REQUEST["BY"]), 2);
$distance = sqrt($tmp);
$distance_for_echo = round($distance, 2);

//celkova vzdialenost policok
echo "<table><tr><td>Celková vzdalenosť:</td><td> $distance_for_echo polí </td></tr></table>";

//vzdialenost preratavame na cas
$timesec = ($distance / 12 );
$time = ceil(60*60*$timesec);
echo "<table><tr><td>Doba cesty:</td><td>" .Date("H:i:s", $time). "</td></tr></table>";

//premenna ktora vytiahne cas zadany vo formulari
$current_time = mktime($_REQUEST["hours"],$_REQUEST["minutes"],$_REQUEST["seconds"],0,0,0);

//spocitame cas cesty s aktualnym casom
$min_travel_time = $time;
$travel_time_sec = $min_travel_time; 
$totaltime = $current_time+$travel_time_sec;
echo "<table><tr><td>Návrat útočníkových jednotiek:</td><td>".Date("H:i:s", $totaltime)."</td></tr></table><br><br><br>";

//aktualny cas zobrazeny
echo "<table><tr><td>Aktuálny čas:</td><td>".Date("H:i:s", $current_time)."</td></tr></table><br>";

//navrat na index
echo "<a href='/index.php'> <<< Go back </a>";
}

?>
  </body>
</html>


Online skript je tu:
http://tools.divsveta.eu/index.php
BlueShadow
Profil
Hm nikto nevie čím nahradiť tú funkciu Date aby si nedosadzovala serverový čas keď neni hodina vyplnená? Teda keď je cesta čojaviem 11min 11s tak si to dosadí namiesto hodín serverový čas, a ostatné normálne podľa výstupu vyplní. Neviem ako to oblbnúť, skúsil by som niečo s funkciou if, ak je viac ako 3600sekúnd ten výstup $time tak nič nerobiť, a keď je pod, tak dať namiesto hodiny 00. Ale neviem jak na to. Alebo nejaká iná funkcia ktorá vie premeniť sekundy na formát HH:MM:SS ?

Díky
tiso
Profil
BlueShadow - čo presne znamená „keď neni hodina vyplnená“?
fajzen
Profil
// EDIT: sorry, zle som si prečítal otázku


nerozumiem zápisu
$min_travel_time = $time;
$travel_time_sec = $min_travel_time; 
$totaltime = $current_time+$travel_time_sec;

nebolo by jednoduchšie len
$totaltime = $current_time+$time;
?
BlueShadow
Profil
@Tiso:

ukazuje to vždy čas vo formáte HH:MM:SS, takže 00:00:00, a keď je napríklad cesta 11min 11sec, tak by to malo ukázať takto: 00:11:11, ale to sa práveže nestane, keď je hodina nula, teda cesta trvá menej ako hodinu, tak to namiesto tej mojej cielenej 00:11:11 ukáže pravdepodobne serverovú hodinu, na hentom americkom hostingu to ukáže 18:11:11, u mňa na localhoste to ukáže 01:11:11 a neviem prísť nato kde je chyba. Funkciu som hľadal, prekopal som trochu php.net a funkcie s časom, ale je to obtiažne s mojou angličtinou nájsť niečo čo by mi fungovalo, na tento problém. Dúfam že som vysvetlil podrobne problém.

@fajzen:

áno máš pravdu, tá premenná je pozostatok z nejakého pokusu ten čas spraviť, predtým než som to sem postol.
tiso
Profil
BlueShadow - keď si na riadok 60 doplníš miesto tých núl aktuálny mesiac, deň a rok, tak to funguje?
$current_time = mktime($_REQUEST["hours"],$_REQUEST["minutes"],$_REQUEST["seconds"],0,0,0);//myslim tieto nuly


A som tiso!
BlueShadow
Profil
Nefunguje :( Stále to isté, na localhoste tam hádže 1tku, na hostingu 18tku na miesto hodín. Ono to v celkovom výsledku ráta ten čas dobre, keď sa zrátava s aktuálnym časom, len na to echo to nejako blbne :( Neexistuje nejaká iná funkcia čo prepíše sekundy do formátu HH:MM:SS ?

btw: prepáč, som myslel že ako Dr. Jozef Tiso :))
tiso
Profil
BlueShadow - v podstate si ju môžeš spraviť sám, deliť 60-timi a pracovať so zvyškom hádam vieš...
BlueShadow
Profil
Hm nejako ma nenapadá ako to presne urobiť, kódovo, teda s tým zvyškom konkrétne, nemohol by si ten kus kódu nakódiť? Ja už som z toho de-bil.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: