Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Etäisyyden laskeminen?

Sivun loppuun

Pentu [29.12.2010 20:19:30]

#

Eli millä kaavalla saan laskettua kahden pisteen välisen matkan pituuden? Käytössä on geometrinen x-y kartta.

Sen tiedän että moinen onnistuu pythagoran lauseella. Etäisyys2 =x2 + y2


Mutta entäpä jos mennään pakkasen puolelle?? eli esimerkiksi matkustetaan pisteestä a(x -8 | y -7) pisteeseen b(x 9 | y -7) ??


Vaikeutetaan hommaa vielä siten että Jos kartan reunat yhidstettäisiin alareuna yläreunaan ja vasen- oikeaan- reunaan.. Tästä saamme donitsin muotoisen kartan, eikö niin??

Näin pisteestä a pisteeseen b olisi lyhyempi reitti ylittämällä kartan reuna..

Eli: tähän haen vastausta, miten saan laskettua etäisyyden ns. donitsi kartalla?

Toivottavasti joku ymmärsi ja osaa hjelppiä :D

Sienikasvusto [29.12.2010 20:45:34]

#

Negatiivisilla arvoilla lasketaan samalla tavoin, kuin positiivisillakin arvoilla. Jos sinua pelottaa kohdata matematiikan ilkeä todellisuus voit aina tietenkin käyttää koordinaatin itseisarvoa.
Kerrohan tarkemmin tuosta donitsistasi, missä origo sijaitsee ja miten pisteet jakaantuvat tuon donitsin pinnalle.
Toivottavasti ymmärrät speksata paremmin.

Pentu [29.12.2010 21:38:10]

#

Eli pelaan Travian -nimistä peliä ja suunnitelmissa olisi koodata itse pari työkalua PHP:lla. Tässä pelissä kartta on 801 x 801 kokoinen..

Tämän pitäisi selventää tuota "donitsin muotoista karttaa" :

Kartta
JA Kartta

Tossa toisessa kuvassa näkyy paremmin (0|0) keski piste, sekä (-400|400), (-400|-400), (400|-400) ja (400|400).. Eli ääri pisteet..

Eli käytännössä jos pisteet a ja b on tarpeeksi lähellä ääri reunaa, tulee matka lyhyemmäksi, jos ylitetään reuna.

Eli tuohon esimerkkiini soveltaen piste a(x -8 |y -7) ja piste b(x 9 |y -7) pythagoran lauseella matka olisi 17ruutua.
Donitsi mallissa matka olisi lyhyempi, jos hypättäisiin ns. alarajan (-10) ylitse, ja päädyttäisiin jatkamaan matkaa vastakkaisesta reunasta.

Jollain foorumilla tuosta donitsista käytettiin myös geometristä nimeä: Torus. Kun yritin etsiä... tuloksetta, laskukaavaa tähän propleemaani..

Grez [29.12.2010 21:44:01]

#

No eipä ole kovin vaikeaa. Jos kahden pisteen välisen etäisyyden d x- tai y-komponentti on > 400 niin etäisyyskomponentti on 800-d. Sama pätee siis yhtä aikaa sekä x että y -koordinaatissa ja kokonaisetäisyys saadaan sitten noista etäisyyden komponenteista pythagoraalla.

//ei testattu
function etäisyys($x1, $y1, $x2, $y2) {
  $dx = abs($x1 - $x2);
  if ($dx>400) $dx = 800 - $dx;
  $dy = abs($y1 - $y2);
  if ($dy>400) $dy = 800 - $dy;
  return sqrt($dx * $dx + $dy * $dy);
}

Pentu [29.12.2010 22:13:49]

#

En ole mikään matikka nero, mutta eikös tuo toi vain jos kuljetaan suoraan pysty- tai vaaka- suunnassa kartalla?? Jos kuljetaan karttaa 45asteen kulmassa (0|0 pisteestä 400|400 pisteeseen), niin pisin mahdollinen matka on 565.69 ruutua, joten tuota "Jos etäisyys on >400" -scriptiä ei voi käyttää tässä...

Korjaa jos olen väärässä.

Metabolix [29.12.2010 22:20:45]

#

Siinä tarkistetaan erikseen x- ja y-suuntainen etäisyys, ja kumpikaan erikseen ei voi olla yli 400 ruutua.

Grez [29.12.2010 22:26:33]

#

Niin siis maksimietäisyyshän on (400^2 + 400^2)^.5 eli juurikin se noin 565,69.

Pentu [29.12.2010 22:32:04]

#

:D Aivan niin... Minäkin voisin lukea koodin ajatuksen kanssa ennen kuin alan kyseleen...

SuurKiitos tästä funktiosta, testailenkin sitä heti huomenissa... Sen verran täytyy kysyä, että mitä toi "abs($x1 - $x2);" funktio tekee?

Grez [29.12.2010 22:33:15]

#

Palauttaa $x1 - $x2 laskutoimituksen itseisarvon. Eli siis jos $x2 on suurempi kuin $x1 niin palauttaa $x2 - $x1, muuten $x1 - $x2. Eli etäisyys on tietenkin aina plusmerkkinen, kuljettiin kumpaan suuntaan tahansa.

Pentu [29.12.2010 22:36:21]

#

Noniin nyt olen taas viisaampi amatööri :P


Sivun alkuun

Vastaus

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

Tietoa sivustosta