Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: PHP: Reitin pituuden laskija

Sivun loppuun

Dredge [06.08.2003 01:14:34]

#

Koodi näyttää kartan, jota klikkailemalla voi piirtää kartalle reitin, jonka pituuden koodi sitten laskee pikseleinä Pythagoraan lauseen avulla. Lisäksi käyttäjä voi syöttää mittakaavan jolla saatu pituus muutetaan metreiksi. Laitoin koodin myös mureakuha.comiin.

Testata voi osoitteessa http://koti.mbnet.fi/dredge/route.php

<?PHP
// Karttapohjana käytettävä kuva. Voi olla myös URL.
$kuva = "kartta.gif";

// Otin marginit pois että rastien sijoittelu
// kartalle olisi helpompaa.
print "<html><body topmargin=0 leftmargin=0>";

// Etsitään post-ympäristömuuttujista kaikki
// c-alkuiset, eli tässä koodissa kaikki aiempia
// koordinaatteja ilmaisevat, ja sijoitetaan
// ne omiin taulukoihinsa.
foreach($_POST as $name => $mail) {
  if(substr($name, 0, 1) == "c") {
    $crds = explode(":", $mail);
    $x[] = $crds[0];
    $y[] = $crds[1];
  }
}

// Jos käyttäjä on päätynyt sivulle klikkaamalla
// karttaa, sijoitetaan klikkauksen koordinaatit
// oikeiden taulukoiden loppuun.
if((isset($_POST['m_x']))&&(isset($_POST['m_y']))) {
  $x[] = $_POST['m_x'];
  $y[] = $_POST['m_y'];
}

// Näytetään kuvan koko, jotta käyttäjän olisi
// helpompi(?) selvittää kuvan mittakaava.
$kuvax = getimagesize($kuva);
$width = $kuvax[0];
$height = $kuvax[1];

// Aloitetaan formi ja näytetään pohjana oleva kuva.
// Mittakaava, jolla lasketaan pituus metreinä.
print "<form method='post' action='?'>";
print "<input type=image src=\"".$kuva."\" name=m>";
print "<br>Kartan leveys on ".$width." ja korkeus ".$height;
print "<br>Mittakaava: <input type=text size=4 name=mk_px value=\"".$_POST['mk_px']."\">px = ";
print "<input type=text size=4 name=mk_m value=\"".$_POST['mk_m']."\">m";

// Jos käyttäjä on aikaisemmin klikkaillut kuvaa
// tehdään aiemmista koordinaateista pieniä rasteja
// kartalle ja piilotettuja taulukkokenttiä, jotta
// sivu voisi lähettää ne jälleen itselleen postilla.
if((isset($x[0]))&&(isset($y[0]))) {
  for($i=0;$i<sizeof($x);$i++) {

    // Korotetaan kartalla näkyviä numeroita yhdellä.
    // Mielummin 123 kuin 012.
    $j = $i+1;

    // Rasteja pitää siirtää 2 px vasemmalle ja ylös,
    // koska rastin koko on 5*5px. Näin keskikohta
    // saadaan oikeaan paikkaan.
    $left = $x[$i] - 2;
    $top = $y[$i] - 2;
    print "<div style=\"position: absolute; left: ".$left.";";
    print "top: ".$top."; font-size: 10; font-family: Tahoma\">";
    print "<img src=risti.gif align=top>$j</div>";
    print "<input type=hidden name=c".$i." value=\"".$x[$i].":".$y[$i]."\">";
  }
}

// Kun reitissä on vähintään 2 pistettä, näytetään
// nappula, jota painamalla reitin pituus lasketaan.
if(sizeof($x)>1) {
  print "<br><input type=submit name=submit value=\"Laske reitin pituus\"> ";
}

// Jos käyttäjä halusi laskea reitin pituuden,
// laskemme sen yksi väli kerrallaan käyttäen
// pythagoraan lausetta.

// (Tehdään suorakulmainen kolmio laskemalla peräkkäisten
//  pisteiden x-koordinaattien ja y-koordinaattien erotukset
//  ja siitä pythagoraan lauseella hypotenuusa, eli
//  pisteiden välinen matka)
if($_POST['submit']) {
  for($n=0;$n<sizeof($x)-1;$n++) {
    if($x[$n] < $x[$n+1]) {
      $xx = $x[$n+1] - $x[$n];
    } else {
      $xx = $x[$n] - $x[$n+1];
    }
    if($y[$n] < $y[$n+1]) {
      $yy = $y[$n+1] - $y[$n];
    } else {
      $yy = $y[$n] - $y[$n+1];
    }
    $tulos += sqrt(($xx*$xx)+($yy*$yy));
  }
  // Lasketaan mittakaavan avulla pituus metreinä.
  if((isset($_POST['mk_px']))&&(isset($_POST['mk_m']))) {
    $tulos2 = $_POST['mk_m'] / $_POST['mk_px'] * $tulos;
    $tulos2 = round($tulos2, 2);
  } else {
    $tulos2 = "?";
  }
  // Pyöristetään snadisti ja syljetään tulos ulos.
  $tulos = round($tulos, 2);
  print "Reitin pituus: ".$tulos."px = <b>".$tulos2."m</b>";
}
// Tehdään vielä linkki jolla koko homman voi aloittaa alusta.
print "</form><a href='?restart'>Restart</a></body></html>";
?>

odys [06.08.2003 02:23:05]

#

Hemmetin hieno on :)
Varmasti joku saa tuosta mahtavan karttaskriptin sivuillensa kunhan vähän muokkaa omaan käyttöönsä.

T.M. [06.08.2003 16:52:51]

#

iha siisti, mut noi hidden inputtien tiedot vois tunkee vaikka kekseihin tai sessioneihin.

odys [06.08.2003 17:14:41]

#

Ei mitään keksejä.. istunnot on ihan ok.

T.M. [07.08.2003 00:12:24]

#

no keksit on ainakin parempi tapa ku miljoona inputtia :)

(nimetön) [07.08.2003 13:10:47]

#

keksit on huonoja.. istunnot ei vaadi käyttäjältä paljonkaan tukea

dera [30.01.2004 15:43:27]

#

Todella hieno! mut sit vaa pari muutaki kaupunkia kun tampere :D

E-P [12.02.2004 19:40:53]

#

On ihan kätevä ja varmaan hyvä ku tulis muitakin kaupunkeja :)

Fisher [21.03.2004 16:44:12]

#

esimerkkisivussa ei näy karttaa...


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta