Ahojte,
robil som jednu kalkulačku na výpočet času cesty zo súradníc X do súradníc Y, riešené je to cez pytagorovú vetu, takže to ráta dobre, je to kalkulačka pre travian, a teraz príde na radu ten problém, táto moja kalkulačka si myslí že mapa travianu je plochá, teda zo súradníc 400/400 do -400/-400 je cesta 1100 políčok, teda to vypočíta táto kalkulačka, ale travian mapa má tvar torusu ( wiki: http://en.wikipedia.org/wiki/Torus , teda to čo hojne pojedá Homer Simpson :) ) a zo súradníc 400/400 do -400/400 je to v traviane len 1 políčko, teda potreboval by som nejaký vzorec, alebo rovno kus kódu nech predídem hlúpym otázkam, z mojej strany, ktorý by vylepšil tú pytagorovu vetu, tak aby to rátala správnepo súradnice 200/200 to ráta dobre, ale nad už to ráta zle. V Travian je rozmedzie súradníc 400/400 až 0/00 a 4 svetové strany takže -/+, +/+, +/- atď. Tu je môj skript:
Editoval hrach: zdrojak z duvodu zbytecnosti a prehlednosti smazan.
Neviem si s tým už rady :( Ako to urobiť aby to rátalo správne. Ešte pre vysvetlenie súradnice 400/400 a -400/-400 sú to isté ako 0/0 a -1/-1 teda vzdialenosťou.
Ďakujem za pomoc
Fórum › PHP
Pytagorova veta
Fakt nikto nevie, ako to urobiť? :(
Nekoukal jsem přímo do zdroje, ale napadlo mne, jestli bys to nemohl resit tak, ze tu vzdálenost budeš počítat nadvakrát. jednou tak jak to děláš, tak že vzdálenost z -400/-400 > 400/400 je ohromná a pak ještě jednou a to tak, že bys dopočítal vzdálenost do maxima třeba z 399/399 > 400/400 a pak k přičetl vzdálenost z -399/-399 . Porovnal vzdálenosti a vyhodil vysledek. nevim, zda je to použitelný, ale tak mě to napadlo jako první
Prostě rozloži ten toroid na čtyřuhelnik a a s tim pak pracovat
1. Riešiš matematický problém, asi tak úrovne 5. ročníka základnej školy
2. Možno by ti niekto poradil hneď, keby si sa opýtal jasnejšie a hlavne stručnejšie.
3. Ten priložený zdroják aj tak nik nebude čítať, keďže máš problém prísť na vzorec. Ak ho pochopíš, a stále si nebudeš vedieť poradiť s implementáciou, potom sa pýtaj na to.
Ak som správne pochopil, tak mapa je vlastne štvorec rozdelený na 800x800 políčok stočený do rúry a jej konce sú následne spojené.
ak je to tak, tak
najkratsia_vzd = [ (abs(ax - bx) mod w)^2 + (abs(ay - by) mod h)^2 ) ]^0.5;
w,h - rozmery mapy - sirka vyska
ax, ay - bod a
bx, by - bod b
To Prog. : A[0,0] B[750, 0], w=h=800; |AB| = ?
Spravna odpoved: 50; tvoj vzorec = sqrt[ (abs(750-0) mod 800)^2 + (abs(0-0) mod 800)^2] = 750
"1. Riešiš matematický problém, asi tak úrovne 5. ročníka základnej školy " - to je ten rocnik do ktoreho pojdes po prazdninach, vsak ? Nabuduce ked budes chcet dokazovat svoju genialitu, tak si riesenie skontroluj aspon pre zopar extremnych pipadov.
Ale k rieseniu:
A[ax, ay]; B[bx, by]
suradnice su cele cisla, takze vseetky delenia budu celociselne
|AB| = sqrt[(w/2 *abs(ax-bx)/(w/2) - abs(ax-bx)%(w/2)) ^ 2 + (h/2*abs(ay-by)/(h/2) - abs(ay-by)%(h/2)) ^ 2]
/ je celociselne delenie; % je modulo
Preco je to tak:
Najvacisa mozna vzdialenost medzi 2 bodmi v smere x (y) je w/2 (h/2), lenze obycajne modulo w/2 nestaci, lebo ak by boli napr body [0,0] a [w/2+1, 0] tak ti to vrati 1, co je zle. Preto je tam to celociselne delenie, ak je vzdialenost (v smere x alebo y) mensia ako w/2 (h/2) tak 1. clen je nula a zrata sa normalna vzdialenost v pravouhlych suradniciach
Ak je vacsa ako w/2 (h/2) tak sa odcita od tejto max. vzdialenosti - tj, pojdeme cez okraj.
Fu, dufam ze som sa nepomylil ;) A sry, dal by som aj zdrojak ale v php nerobim.
Hlboko sa ospravedlnujem, zrejme by som si tu 5. triedu mal zopakovať.
Podstata je proste v tom, zistiť najprv minimálne vzdialenosti v smere x a smere y, myslieť pri tom na možnosť prejst okrajom, a až potom rátať pytagora.
Ok, v PHP by som to urobil asi takto:
function vzd($ax, $ay, $bx, $by, $w=800, $h=800)
{
$dx = abs($ax - $bx) % $w;
$dy = abs($ay - $by) % $h;
if ($dx > $w/2) $dx = $w - $dx;
if ($dy > $h/2) $dy = $h - $dy;
return sqrt( pow($dx, 2) + pow($dy, 2) );
}
to modulo slúži na stiahnutie do rozsahu 0 až w-1, a 0 až h-1 v prípade že sú body zadané mimo základných súradníc, napr 0, 800, 1600, 2400 je jeden a ten istý bod ak w (h) je 800.
ak dx > (w/2) tak to znamena, že "ísť cez okraj" je kratšie.
dufam že dobre :-)
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Obrácená věta — založil Tom
Pythagorova věta — založil blbka007
Theveninova věta — založil RePRO
Morseova Věta — založil Marek
Pythagorova věta — založil Petra
Moderátoři diskuze