Konstrukcija pravilnog šesterokuta - kako nacrtati šesterokut. Kako izgraditi pravilan šesterokut Kako nacrtati šesterokut olovkom

Ima li olovka u tvojoj blizini? Pogledajte njegov presjek - to je pravilan šesterokut ili, kako ga još zovu, šesterokut. Takav oblik imaju i presjek oraha, šesterokutno šahovsko polje, neke složene molekule ugljika (na primjer, grafit), pahuljica, saće i drugi predmeti. Divovski pravilni šesterokut nedavno je otkriven u Ne čini li se čudno da priroda tako često koristi strukture ovog posebnog oblika za svoje kreacije? Pogledajmo pobliže.

Pravilni šesterokut je mnogokut sa šest jednakih stranica i jednakih kutova. Iz školskog tečaja znamo da ima sljedeća svojstva:

  • Duljina njegovih stranica odgovara polumjeru opisane kružnice. Od svih, samo pravilni šesterokut ima ovo svojstvo.
  • Kutovi su međusobno jednaki, a svaka mjera iznosi 120°.
  • Opseg šesterokuta može se pronaći pomoću formule P=6*R, ako je poznat polumjer kružnice opisane oko njega, ili P=4*√(3)*r, ako je kružnica upisana u nju. R i r su polumjeri opisane i upisane kružnice.
  • Površina koju zauzima pravilan šesterokut određena je na sljedeći način: S=(3*√(3)*R 2)/2. Ako polumjer nije poznat, zamijenite duljinu jedne od strana - kao što je poznato, ona odgovara duljini polumjera opisane kružnice.

Pravilni šesterokut ima jednu zanimljivu značajku, zahvaljujući kojoj je postao toliko raširen u prirodi - sposoban je ispuniti bilo koju površinu ravnine bez preklapanja ili praznina. Postoji čak i tzv. Palova lema prema kojoj je pravilan šesterokut čija je stranica jednaka 1/√(3) univerzalni pokrov, odnosno može pokriti bilo koji skup promjera jedne jedinice .

Sada pogledajmo konstrukciju pravilnog šesterokuta. Postoji nekoliko metoda, od kojih najjednostavnija uključuje korištenje šestara, olovke i ravnala. Prvo šestarom nacrtamo proizvoljnu kružnicu, a zatim na proizvoljnom mjestu na toj kružnici napravimo točku. Ne mijenjajući kut šestara, postavimo vrh na ovu točku, označimo sljedeći urez na krugu i nastavimo tako dok ne dobijemo svih 6 točaka. Sada ostaje samo da ih povežete ravnim segmentima i dobit ćete željenu figuru.

U praksi postoje slučajevi kada trebate nacrtati veliki šesterokut. Na primjer, na dvoslojnom stropu od gipsanih ploča, oko mjesta ugradnje središnjeg lustera, trebate instalirati šest malih svjetiljki na donjoj razini. Kompase ove veličine bit će vrlo, vrlo teško pronaći. Što učiniti u ovom slučaju? Kako uopće nacrtati veliki krug? Jako jednostavno. Morate uzeti jaku nit potrebne duljine i vezati jedan od njegovih krajeva nasuprot olovke. Sada ostaje samo pronaći pomoćnika koji bi pritisnuo drugi kraj konca na strop na željenoj točki. Naravno, u ovom slučaju moguće su manje pogreške, ali malo je vjerojatno da će ih uopće primijetiti autsajder.

Sadržaj:

Pravilni šesterokut, koji se naziva i savršeni šesterokut, ima šest jednakih stranica i šest jednakih kutova. Možete nacrtati šesterokut mjernom trakom i kutomjerom, grubi šesterokut okruglim predmetom i ravnalom ili još grublji šesterokut samo olovkom i malo intuicije. Ako želite znati kako nacrtati šesterokut na različite načine, samo čitajte dalje.

Koraci

1 Nacrtajte savršeni šesterokut pomoću šestara

  1. 1 Koristeći šestar nacrtajte krug. Umetnite olovku u kompas. Proširite kompas na željenu širinu polumjera kruga. Radijus može biti širok od nekoliko do deset centimetara. Zatim stavite šestar i olovku na papir i nacrtajte krug.
    • Ponekad je lakše prvo nacrtati pola kruga, a zatim drugu polovicu.
  2. 2 Pomaknite iglu kompasa do ruba kruga. Stavite ga na vrh kruga. Nemojte mijenjati kut ili položaj kompasa.
  3. 3 Napravite malu oznaku olovkom na rubu kruga. Neka bude jasno, ali ne pretamno jer ćete ga kasnije izbrisati. Ne zaboravite zadržati kut koji ste postavili za kompas.
  4. 4 Pomaknite iglu kompasa na oznaku koju ste upravo napravili. Stavite iglu izravno na oznaku.
  5. 5 Napravite još jednu oznaku olovkom na rubu kruga. Na taj način ćete napraviti drugu oznaku na određenoj udaljenosti od prve oznake. Nastavite se kretati u jednom smjeru.
  6. 6 Na isti način napravite još četiri oznake. Morate se vratiti na izvornu oznaku. Ako nije, onda se najvjerojatnije promijenio kut pod kojim ste držali kompas i pravili oznake. To se moglo dogoditi jer ste ga previše stisnuli ili, naprotiv, malo olabavili.
  7. 7 Spojite oznake pomoću ravnala.Šest mjesta na kojima se vaše oznake sijeku s rubom kruga su šest vrhova šesterokuta. Pomoću ravnala i olovke nacrtajte ravne linije koje povezuju susjedne oznake.
  8. 8 Obrišite krug, oznake na rubovima kruga i sve druge oznake koje ste napravili. Nakon što ste izbrisali sve građevinske linije, vaš savršeni šesterokut trebao bi biti spreman.

2 Nacrtajte grubi šesterokut pomoću okruglog predmeta i ravnala

  1. 1 Olovkom ocrtajte rub čaše. Na ovaj način nacrtat ćete krug. Vrlo je važno crtati olovkom, jer ćete kasnije morati obrisati sve pomoćne linije. Također možete nacrtati naopako okrenutu čašu, staklenku ili bilo što drugo što ima okruglu podlogu.
  2. 2 Nacrtajte vodoravne linije kroz središte vašeg kruga. Možete koristiti ravnalo, knjigu - bilo što s ravnim rubom. Ako imate ravnalo, možete označiti sredinu tako da izračunate okomitu duljinu kruga i podijelite ga na pola.
  3. 3 Nacrtajte "X" preko polovine kruga, dijeleći ga na šest jednakih dijelova. Budući da ste već nacrtali crtu kroz sredinu kruga, X mora biti širi nego što je visok kako bi dijelovi bili jednaki. Zamislite da podijelite pizzu na šest dijelova.
  4. 4 Napravite trokute od svakog dijela. Da biste to učinili, pomoću ravnala nacrtajte ravnu crtu ispod zakrivljenog dijela svakog odjeljka, povezujući je s druge dvije crte u obliku trokuta. Učinite to s preostalih pet dijelova. Zamislite to kao da napravite koru oko svojih kriški pizze.
  5. 5 Izbrišite sve pomoćne linije. Vodeće linije uključuju vaš krug, tri linije koje dijele vaš krug na dijelove i druge oznake koje ste napravili na putu.

3 Jednom olovkom nacrtajte grubi šesterokut

  1. 1 Nacrtajte vodoravnu liniju. Da biste nacrtali ravnu crtu bez ravnala, jednostavno nacrtajte početnu i završnu točku vodoravne crte. Zatim postavite olovku na početnu točku i povucite liniju do kraja. Duljina ove linije može biti samo nekoliko centimetara.
  2. 2 Nacrtajte dvije dijagonalne crte od krajeva vodoravne. Dijagonalna linija na lijevoj strani trebala bi biti usmjerena prema van na isti način kao i dijagonalna linija na desnoj strani. Možete zamisliti da ove linije čine kut od 120 stupnjeva u odnosu na vodoravnu liniju.
  3. 3 Nacrtajte još dvije vodoravne linije koje dolaze od prvih vodoravnih linija povučenih prema unutra. Ovo će stvoriti zrcalnu sliku prve dvije dijagonalne linije. Donja lijeva linija trebala bi biti odraz gornje lijeve linije, a donja desna linija trebala bi biti odraz gornje desne linije. Dok bi gornje vodoravne linije trebale gledati prema van, donje bi trebale gledati prema unutra prema bazi.
  4. 4 Nacrtajte još jednu vodoravnu crtu koja povezuje dvije donje dijagonalne crte. Na ovaj način ćete nacrtati bazu za vaš šesterokut. U idealnom slučaju, ova linija bi trebala biti paralelna s gornjom vodoravnom linijom. Sada ste dovršili svoj šesterokut.
  • Olovka i šestar trebaju biti oštri kako bi se smanjile pogreške od preširokih oznaka.
  • Kada koristite metodu šestara, spojite li svaku oznaku umjesto svih šest, dobit ćete jednakostranični trokut.

Upozorenja

  • Kompas je prilično oštar predmet, budite vrlo oprezni s njim.

Princip rada

  • Svaka metoda pomoći će vam da nacrtate šesterokut sastavljen od šest jednakostraničnog trokuta polumjera jednakog duljini svih stranica. Šest nacrtanih polumjera iste su duljine i sve linije koje stvaraju šesterokut također su iste duljine, budući da se širina šestara nije promijenila. Zbog činjenice da je šest trokuta jednakostraničan, kutovi između njihovih vrhova su 60 stupnjeva.

Ono što će vam trebati

  • Papir
  • Olovka
  • Vladar
  • Par kompasa
  • Nešto što se može staviti ispod papira kako bi se spriječilo klizanje igle kompasa.
  • Gumica za brisanje

Pravilan opisani trokut konstruira se na sljedeći način(Slika 38). Iz središta zadane kružnice radijusa R 1 nacrtati krug s radijusom R2 = 2R1 i podijelite ga na tri jednaka dijela. Bodovi podjele A, B, C su vrhovi pravilnog trokuta opisanog krugu polumjera R 1 .

Slika 38

Pravilan opisani četverokut (kvadrat) može se konstruirati pomoću šestara i ravnala (slika 39). U zadanoj kružnici nacrtana su dva međusobno okomita promjera. Uzimajući točke sjecišta promjera s krugom za središta, radijus kruga R opisivati ​​lukove dok se ne presjeku u točkama A, B, C, D . Bodovi A , B , C , D i vrhovi su kvadrata opisanog oko zadane kružnice.

Slika 39

Za konstruiranje pravilnog opisanog šesterokuta potrebno je prvo konstruirati vrhove opisanog kvadrata na gore naveden način (slika 40, a). Istovremeno s određivanjem vrhova kvadrata, zadana kružnica polumjera R podijeljen na šest jednakih dijelova na točkama 1, 2, 3, 4, 5, 6 i nacrtajte okomite stranice kvadrata. Crtanje kružnice kroz razdjelne točke 2–5 I 3–6 ravne linije dok se ne sijeku s okomitim stranama kvadrata (slika 40, b), dobivamo vrhove A, B, D, E opisani pravilni šesterokut.

Slika 40

Ostali vrhovi C I F određuje pomoću luka kruga radijusa O.A., koja se provodi dok se ne siječe s nastavkom vertikalnog promjera zadane kružnice.
3 PARENJA

Naučimo kako nacrtati šesterokutnu prizmu u različitim položajima.

Proučiti različite načine konstruiranja pravilnog šesterokuta, izraditi crteže šesterokuta, provjeriti ispravnost njihove konstrukcije. Na temelju šesterokuta konstruirajte šesterokutne prizme.

Razmotrimo heksagonalnu prizmu na sl. 3.52 i njegove ortogonalne projekcije na sl. 3.53. U podnožju šesterokutne prizme (heksagon) nalaze se pravilni šesterokuti, bočne strane su identični pravokutnici. Da biste pravilno prikazali šesterokut u perspektivi, prvo morate naučiti kako pravilno prikazati njegovu bazu u perspektivi (slika 3.54). U šesterokutu na Sl. 3.55 vrhovi su označeni brojevima od jedan do šest. Spojite li točke 1 i 3, 4 i 6 okomitim ravnim crtama, primijetit ćete da te ravne linije, zajedno sa središnjom točkom kruga, dijele promjer 5 - 2 na četiri jednaka segmenta (ovi segmenti su označeni lukovima ). Suprotne stranice šesterokuta paralelne su jedna s drugom i s pravcem koji prolazi njegovim središtem i povezuje dva vrha (na primjer, stranice 6 - 1 i 4 - 3 paralelne su s pravcem 5 - 2). Ova zapažanja pomoći će vam da konstruirate šesterokut u perspektivi, kao i da provjerite ispravnost ove konstrukcije. Postoje dva načina za konstruiranje pravilnog šesterokuta iz prikaza: na temelju opisane kružnice i na temelju kvadrata.

Na temelju opisane kružnice. Pogledajte sl. 3.56. Svi vrhovi pravilnog šesterokuta pripadaju opisanoj kružnici čiji je polumjer jednak stranici šesterokuta.


Horizontalni šesterokut. Nacrtajte horizontalnu elipsu proizvoljnog otvora, tj. opisani krug u perspektivi. Sada na njemu trebate pronaći šest točaka, koje su vrhovi šesterokuta. Nacrtajte bilo koji promjer zadane kružnice kroz njezino središte (slika 3.57). Ekstremne točke promjera - 5 i 2, koje leže na elipsi, vrhovi su šesterokuta. Da biste pronašli preostale vrhove, potrebno je podijeliti ovaj promjer na četiri jednaka segmenta. Promjer je središnjom točkom kruga već podijeljen na dva polumjera; preostaje samo podijeliti svaki radijus na pola. U perspektivnom crtežu sva se četiri segmenta ravnomjerno skupljaju kako se udaljavaju od promatrača (slika 3.58). Sada povucite kroz središta polumjera - točke A i B - ravne crte okomite na ravnu crtu 5 - 2. Možete pronaći njihov smjer pomoću tangenti na elipsu u točkama 5 i 2 (Sl. 3.59). Te će tangente biti okomite na promjer 5 - 2, a pravci povučeni kroz točke A i B paralelne s tim tangentama također će biti okomiti na pravac 5 - 2. Označite točke dobivene na sjecištu ovih pravaca s elipsom kao 1, 3, 4, 6 (Slika 3.60). Svih šest vrhova spojite ravnim crtama (sl. 3.61).

Provjerite ispravnost svoje konstrukcije na različite načine. Ako je konstrukcija ispravna, tada se pravci koji spajaju suprotne vrhove šesterokuta sijeku u središtu kružnice (sl. 3.62), a suprotne stranice šesterokuta paralelne su s odgovarajućim promjerima (sl. 3.63). Druga metoda provjere prikazana je na sl. 3.64.

Okomiti šesterokut. U takvom šesterokutu, pravci koji spajaju točke 7 i 3, b i 4, kao i tangente na opisanu kružnicu u točkama 5 i 2, imaju okomit smjer i zadržavaju ga u perspektivnom crtežu. Dakle, povlačenjem dviju okomitih tangenti na elipsu nalazimo točke 5 i 2 (točke dodirivanja). Spojite ih ravnom linijom, a zatim dobiveni promjer 5 - 2 podijelite na 4 jednaka segmenta, uzimajući u obzir njihova perspektivna smanjenja (sl. 3.65). Kroz točke A i B povucite okomite crte, au njihovom sjecištu s elipsom pronađite točke 1,3,6l4. Zatim spojite točke 1 - 6 uzastopno ravnim linijama (Sl. 3.66). Provjerite ispravnost konstrukcije šesterokuta na isti način kao u prethodnom primjeru.

Opisana metoda konstruiranja šesterokuta omogućuje nam da dobijemo ovu figuru na temelju kruga, koji je lakše prikazati u perspektivi nego kvadrat zadanih proporcija. Stoga se ova metoda konstruiranja šesterokuta čini najtočnijom i univerzalnom. Metoda konstrukcije koja se temelji na kvadratu olakšava prikazivanje šesterokuta u slučaju kada na crtežu već postoji kocka, drugim riječima, kada se određuju proporcije kvadrata i smjer njegovih stranica.

Na temelju kvadrata. Pogledajte sl. 3.67. Kvadratu upisani šesterokut jednak je stranici kvadrata u vodoravnom smjeru 5 - 2, a u okomitom smjeru manji od njegove duljine.

Okomiti šesterokut. Nacrtajte okomiti kvadrat u perspektivi. Nacrtajte ravnu liniju kroz sjecište dijagonala paralelno s njezinim vodoravnim stranama. Dobiveni segment 5 - 2 podijelite na četiri jednaka dijela i povucite okomite crte kroz točke A i B (slika 3.68). Linije koje ograničavaju šesterokut na vrhu i dnu ne podudaraju se sa stranicama kvadrata. Nacrtajte ih na određenoj udaljenosti (1114 a) od vodoravnih stranica kvadrata i paralelno s njima. Spajanjem ovako nađenih točaka 1 i 3 s točkom 2, a točaka 6 i 4 s točkom 5, dobivamo šesterokut (sl. 3.69).

Horizontalni šesterokut izgrađen je u istom nizu (sl. 3.70 i 3.71).

Ova metoda konstrukcije prikladna je samo za šesterokute s dovoljnim otvorom. Ako je otvor šesterokuta beznačajan, bolje je koristiti metodu koja se temelji na opisanom krugu. Da biste provjerili šesterokut konstruiran kroz kvadrat, možete koristiti metode koje su vam već poznate.

Osim toga, postoji još jedan način - opisati krug oko dobivenog šesterokuta (u vašem crtežu - elipsa). Svi vrhovi šesterokuta moraju pripadati ovoj elipsi.

Nakon što ste svladali vještine crtanja šesterokuta, moći ćete slobodno prijeći na crtanje šesterokutne prizme. Pažljivo pogledajte dijagram na sl. 3.72, kao i dijagrame za konstrukciju šesterokutnih prizmi na osnovi opisane kružnice (sl. 3.73; 3.74 i 3.75) i na osnovi kvadrata (sl. 3.76; 3.77 i 3.78). Nacrtajte okomite i vodoravne šesterokute na različite načine. Na crtežu okomitog šesterokuta, duge strane bočnih strana bit će okomite ravne linije paralelne jedna s drugom, a šesterokut baze će biti otvoreniji što je dalje od linije horizonta. Na crtežu vodoravnog šesterokuta, duge stranice bočnih stranica će se skupiti u točki nestajanja na horizontu, a otvor osnovnog šesterokuta bit će veći što je dalje od promatrača. Kada prikazujete šesterokut, također pazite da paralelni rubovi obiju baza konvergiraju u perspektivi (sl. 3.79; 3.80).

Šesterokutne mreže (šesterokutne mreže) koriste se u nekim igrama, ali nisu tako jednostavne ili uobičajene kao pravokutne mreže. Skupljao sam resurse o hex mrežama gotovo 20 godina i napisao sam ovaj vodič za najelegantnije pristupe, implementirane u najjednostavniji kod. Ovaj članak u velikoj mjeri koristi vodiče Charlesa Fua i Clarka Verbruggea. Opisat ću različite načine stvaranja šesterokutnih mreža, njihove odnose i najčešće algoritme. Mnogi dijelovi ovog članka su interaktivni: odabirom vrste mreže mijenjaju se odgovarajući dijagrami, kôd i tekstovi. (Napomena po: ovo se odnosi samo na izvornik, savjetujem da ga proučite. U prijevodu su sačuvane sve informacije izvornika, ali bez interaktivnosti.).

Primjeri koda u članku napisani su u pseudokodu, tako da ih je lakše čitati i razumjeti kako biste napisali vlastitu implementaciju.

Geometrija

Heksagoni su šesterostrani poligoni. Pravilni šesterokuti imaju sve stranice (brdove) iste duljine. Radit ćemo samo s pravilnim šesterokutima. Tipično, šesterokutne mreže koriste vodoravnu (šiljasti vrh) i okomitu (ravni vrh) usmjerenja.


Šesterokuti s ravnim (lijevo) i oštrim (desno) vrhovima

Šesterokuti imaju 6 lica. Svaka strana je zajednička za dva šesterokuta. Šesterokuti imaju 6 kutnih točaka. Svaka kutna točka je zajednička za tri šesterokuta. Više o središtima, rubovima i kutnim točkama možete pročitati u mom članku o mrežastim dijelovima (kvadrati, šesterokuti i trokuti).

Kutovi

U pravilnom šesterokutu unutarnji kutovi iznose 120°. Postoji šest "klinova", od kojih je svaki jednakostraničan trokut s unutarnjim kutovima od 60°. Kutna točka ja nalazi se na udaljenosti od (60° * i) + 30°, jedinica veličine od centra središta. U kodu:

Funkcija hex_corner(center, size, i): var angle_deg = 60 * i + 30 var angle_rad = PI / 180 * angle_deg return Point(center.x + size * cos(angle_rad), center.y + size * sin(angle_rad) )
Da biste ispunili šesterokut, trebate dobiti vrhove poligona od hex_corner(…, 0) do hex_corner(…, 5) . Da biste nacrtali obris šesterokuta, trebate upotrijebiti ove vrhove, a zatim ponovno nacrtati liniju u hex_corner(..., 0) .

Razlika između dvije orijentacije je u tome što su x i y zamijenjeni, što rezultira promjenom kutova: šesterokuti s ravnim vrhom imaju kutove od 0°, 60°, 120°, 180°, 240°, 300°, a šesterokuti sa šiljastim vrhom šesterokuti imaju kutove od 30°, 90°, 150°, 210°, 270°, 330°.


Kutovi šesterokuta s ravnim i oštrim vrhovima

Veličina i mjesto

Sada želimo postaviti nekoliko šesterokuta zajedno. U horizontalnoj orijentaciji, visina šesterokuta je visina = veličina * 2 . Okomita udaljenost između susjednih šesterokuta je vert = visina * 3/4 ​​​​.

Širina šesterokuta = sqrt(3)/2 * visina. Vodoravni razmak između susjednih šesterokuta je horiz = širina.

Neke igre koriste pikselnu umjetnost za šesterokute, što ne odgovara točno pravilnim šesterokutima. Formule za kut i položaj opisane u ovom odjeljku neće odgovarati dimenzijama takvih šesterokuta. Ostatak članka koji opisuje algoritme heksagonalne mreže primjenjuje se čak i ako su šesterokuti malo rastegnuti ili zgnječeni.



Koordinatni sustavi

Počnimo sastavljati šesterokute u mrežu. U slučaju mreža kvadrata, postoji samo jedan očit način sastavljanja. Za šesterokute postoji mnogo pristupa. Preporučujem korištenje kubičnih koordinata kao vašeg primarnog prikaza. Aksijalne koordinate ili koordinate pomaka trebale bi se koristiti za pohranu karata i prikaz koordinata korisniku.

Offset koordinate

Najčešći pristup je kompenzacija svakog sljedećeg stupca ili retka. Stupci su označeni col ili q. Redovi se označavaju s red ili r . Možete pomaknuti neparne ili parne stupce/redove, tako da vodoravni i okomiti šesterokuti imaju dvije mogućnosti.


Horizontalni raspored "odd-r"


Horizontalni raspored “par-r”


Vertikalni "odd-q" raspored


Vertikalni raspored "parno-q"

Kubične koordinate

Drugi način gledanja na šesterokutne mreže je da ih vidite kao tri glavne osi, ne dva, kao u mrežama kvadrata. Pokazuju elegantnu simetriju.

Uzmimo mrežu od kocaka i prekinimo dijagonalna ravnina na x + y + z = 0. Ovo je čudna ideja, ali će nam pomoći da pojednostavimo algoritme šesterokutne mreže. Konkretno, moći ćemo koristiti standardne operacije iz Kartezijevih koordinata: zbrajanje i oduzimanje koordinata, množenje i dijeljenje skalarnom veličinom, kao i udaljenosti.

Obratite pozornost na tri glavne osi na rešetki kocaka i njihov odnos prema šest dijagonala pravci šesterokutne mreže. Dijagonalne osi mreže odgovaraju glavnom smjeru šesterokutne mreže.


šesterokuti


kocke

Budući da već imamo algoritme za kvadratnu i kockastu mrežu, korištenje kubičnih koordinata omogućuje nam prilagodbu ovih algoritama na šesterokutnu mrežu. Koristit ću ovaj sustav za većinu algoritama članka. Da bih koristio algoritme s drugim koordinatnim sustavom, pretvaram kubične koordinate, pokrećem algoritam, a zatim ih pretvaram natrag.

Naučite kako kubične koordinate rade za šesterokutnu mrežu. Kada odaberete šesterokute, označene su kubične koordinate koje odgovaraju trima osima.

  1. Svaki smjer rešetke kocke odgovara linije na mreži šesterokuta. Pokušajte odabrati šesterokut sa z jednakim 0, 1, 2, 3 da biste vidjeli vezu. Linija je označena plavom bojom. Pokušajte isto za x (zeleno) i y (ljubičasto).
  2. Svaki smjer mreže šesterokuta kombinacija je dva smjera mreže kocke. Na primjer, "sjever" šesterokutne mreže nalazi se između +y i -z, tako da svaki korak "sjevera" povećava y za 1 i smanjuje z za 1.
Kubične koordinate su razuman izbor za koordinatni sustav šesterokutne mreže. Uvjet je x + y + z = 0, pa se mora sačuvati u algoritmima. Uvjet također osigurava da će uvijek postojati kanonska koordinata za svaki šesterokut.

Postoji mnogo različitih koordinatnih sustava za kocke i šesterokute. U nekima od njih uvjet je različit od x + y + z = 0. Pokazao sam samo jedan od mnogih sustava. Također možete stvoriti kubične koordinate s x-y, y-z, z-x, koje imaju vlastiti skup zanimljivih svojstava, ali neću ulaziti u njih ovdje.

Ali možete tvrditi da ne želite pohraniti 3 broja za koordinate jer ne znate kako pohraniti kartu na taj način.

Aksijalne koordinate

Aksijalni koordinatni sustav, koji se ponekad naziva "trapezoidni" koordinatni sustav, konstruiran je od dvije ili tri koordinate iz kubičnog koordinatnog sustava. Budući da imamo uvjet x + y + z = 0, treća koordinata nije potrebna. Aksijalne koordinate korisne su za pohranu karata i prikazivanje koordinata korisniku. Kao i kod kubičnih koordinata, možete koristiti standardne operacije zbrajanja, oduzimanja, množenja i dijeljenja Kartezijevih koordinata.

Postoji mnogo kubičnih koordinatnih sustava i mnogo aksijalnih. Neću pokriti svaku kombinaciju u ovom vodiču. Odabrat ću dvije varijable, q (stupac) i r (redak). U dijagramima u ovom članku, q odgovara x, a r odgovara z, ali ta je korespondencija proizvoljna jer možete rotirati i rotirati dijagrame da biste dobili različite korespondencije.

Prednost ovog sustava u odnosu na rešetke pomaka je što su algoritmi razumljiviji. Loša strana sustava je da je pohranjivanje pravokutne kartice pomalo čudno; pogledajte odjeljak o spremanju karata. Neki algoritmi su još jasniji u kubičnim koordinatama, ali budući da imamo uvjet x + y + z = 0, možemo izračunati treću impliciranu koordinatu i koristiti je u ovim algoritmima. U svojim projektima osi nazivam q, r, s, tako da stanje izgleda kao q + r + s = 0, a ja mogu izračunati s = -q - r kada je potrebno.

Osovine

Koordinate pomaka prva su stvar na koju većina ljudi pomisli jer su iste kao i standardne kartezijeve koordinate koje se koriste za mreže kvadrata. Nažalost, jedna od dvije osi mora biti u suprotnosti s ciljem, a to na kraju komplicira stvari. Cube i axis sustavi idu dalje i imaju jednostavnije algoritme, ali pohrana kartica je malo složenija. Postoji još jedan sustav koji se zove "izmjenični" ili "dualni", ali ga ovdje nećemo razmatrati; nekima je lakše raditi nego s kubičnim ili aksijalnim.


Offset koordinate, kubične i aksijalne

Os je smjer u kojem odgovarajuća koordinata raste. Okomito na os je linija na kojoj koordinata ostaje konstantna. Gornji mrežni dijagrami prikazuju okomite linije.

Transformacija koordinata

Vjerojatno ćete koristiti aksijalne ili pomaknute koordinate u svom dizajnu, ali mnoge algoritme je lakše izraziti u kubičnim koordinatama. Stoga moramo biti u mogućnosti pretvoriti koordinate između sustava.

Aksijalne koordinate su usko povezane s kubičnim koordinatama, tako da je pretvorba jednostavna:

# pretvaranje kubičnih u aksijalne koordinate q = x r = z # pretvaranje aksijalnih u kubične koordinate x = q z = r y = -x-z
U kodu se ove dvije funkcije mogu napisati na sljedeći način:

Funkcija cube_to_cube(h): # axial var q = h.x var r = h.z return Hex(q, r) funkcija hex_to_cube(h): # cubic var x = h.q var z = h.r var y = -x-z return Cube(x, y) , z)
Offset koordinate su dosta kompliciranije:

Susjedni šesterokuti

S obzirom na jedan šesterokut, pored kojih je šest šesterokuta? Kao što možete očekivati, odgovor je najlakši u kubičnim koordinatama, prilično lak u aksijalnim koordinatama, a malo teži u koordinatama pomaka. Možda ćete također morati izračunati šest "dijagonalnih" šesterokuta.

Kubične koordinate

Pomicanje jednog razmaka u heksadecimalnim koordinatama uzrokuje promjenu jedne od tri kubične koordinate u +1, a druge u -1 (zbroj mora ostati 0). Na +1 mogu se promijeniti tri moguće koordinate, a na -1 preostale dvije. Ovo nam daje šest mogućih promjena. Svaki odgovara jednom od smjerova šesterokuta. Najjednostavniji i najbrži način je unaprijed izračunati promjene i staviti ih u kubičnu koordinatnu tablicu Cube(dx, dy, dz) tijekom kompajliranja:

Var smjerova = [ kocka(+1, -1, 0), kocka(+1, 0, -1), kocka(0, +1, -1), kocka(-1, +1, 0), kocka( -1, 0, +1), kocka(0, -1, +1)] funkcija cube_direction(smjer): povratni smjerovi funkcija cube_neighbor(hex, smjer): return cube_add(hex, cube_direction(smjer))

Aksijalne koordinate

Kao i prije, za početak koristimo kubični sustav. Uzmimo tablicu Cube(dx, dy, dz) i pretvorimo je u tablicu Hex(dq, dr):

Promjenjivi smjerovi = [ Hex(+1, 0), Hex(+1, -1), Hex(0, -1), Hex(-1, 0), Hex(-1, +1), Hex(0, +1) ] funkcija hex_direction(direction): smjerovi povratka function hex_neighbor(hex, direction): var dir = hex_direction(direction) return Hex(hex.q + dir.q, hex.r + dir.r)

Offset koordinate

U aksijalnim koordinatama radimo promjene ovisno o tome gdje se nalazimo na mreži. Ako smo u pomaku stupca/retka, tada se pravilo razlikuje od slučaja stupca/retka bez pomaka.

Kao i prije, stvaramo tablicu brojeva koje je potrebno dodati stupcu i redu. Međutim, ovaj put ćemo imati dva niza, jedan za neparne stupce/redove, a drugi za parne. Pogledajte (1,1) na gornjoj slici mrežne karte i primijetite kako se stupac i red mijenjaju dok se krećete u svakom od šest smjerova. Sada ponovimo postupak za (2,2) . Tablice i šifra će se razlikovati za svaku od četiri vrste rešetki pomaka; ovdje je odgovarajuća šifra za svaku vrstu mreže.

Nepar-r
var directions = [ [ Hex(+1, 0), Hex(0, -1), Hex(-1, -1), Hex(-1, 0), Hex(-1, +1), Hex(0 , +1) ], [ Hex(+1, 0), Hex(+1, -1), Hex(0, -1), Hex(-1, 0), Hex(0, +1), Hex( +1, +1) ] ] funkcija offset_neighbor(hex, smjer): var parity = hex.row & 1 var dir = smjerovi return Hex(hex.col + dir.col, hex.row + dir.row)


Čak-r
var directions = [ [ Hex(+1, 0), Hex(+1, -1), Hex(0, -1), Hex(-1, 0), Hex(0, +1), Hex(+1) , +1) ], [ Hex(+1, 0), Hex(0, -1), Hex(-1, -1), Hex(-1, 0), Hex(-1, +1), Hex (0, +1) ] ] funkcija offset_neighbor(hex, smjer): var parity = hex.row & 1 var dir = smjerovi return Hex(hex.col + dir.col, hex.row + dir.row)


Mreža za parne (EVEN) i neparne (ODD) retke

Nepar-q
var directions = [ [ Hex(+1, 0), Hex(+1, -1), Hex(0, -1), Hex(-1, -1), Hex(-1, 0), Hex(0) , +1) ], [ Hex(+1, +1), Hex(+1, 0), Hex(0, -1), Hex(-1, 0), Hex(-1, +1), Hex (0, +1) ] ] funkcija offset_neighbor(hex, smjer): var parity = hex.col & 1 var dir = smjerovi return Hex(hex.col + dir.col, hex.row + dir.row)


Parni-q
var directions = [ [ Hex(+1, +1), Hex(+1, 0), Hex(0, -1), Hex(-1, 0), Hex(-1, +1), Hex(0) , +1) ], [ Hex(+1, 0), Hex(+1, -1), Hex(0, -1), Hex(-1, -1), Hex(-1, 0), Hex (0, +1) ] ] funkcija offset_neighbor(hex, smjer): var parity = hex.col & 1 var dir = smjerovi return Hex(hex.col + dir.col, hex.row + dir.row)


Mreža za parne (EVEN) i neparne (ODD) stupce

Dijagonale

Kretanje u "dijagonalnom" prostoru u hex koordinatama mijenja jednu od tri kubične koordinate za ±2, a druge dvije za ∓1 (zbroj mora ostati 0).

Promjenljive dijagonale = [ Kocka (+2, -1, -1), Kocka (+1, +1, -2), Kocka (-1, +2, -1), Kocka (-2, +1, +1 ), Kocka(-1, -1, +2), Kocka(+1, -2, +1) ] funkcija cube_diagonal_neighbor(hex, smjer): return cube_add(hex, dijagonale)
Kao i prije, ove koordinate možemo pretvoriti u aksijalne koordinate ispuštanjem jedne od tri koordinate ili ih pretvoriti u koordinate pomaka tako da prvo izračunamo rezultate.


Udaljenosti

Kubične koordinate

U kubnom koordinatnom sustavu svaki šesterokut je kocka u trodimenzionalnom prostoru. Susjedni šesterokuti razmaknuti su 1 u šesterokutnoj mreži, ali razmaknuti su 2 u mreži kocke. To čini izračun udaljenosti jednostavnim. U mreži kvadrata manhattanske udaljenosti su abs(dx) + abs(dy) . U mreži kocaka, manhattanske udaljenosti su abs(dx) + abs(dy) + abs(dz) . Udaljenost u šesterokutnoj mreži jednaka je njihovoj polovici:

Funkcija cube_distance(a, b): return (abs(a.x - b.x) + abs(a.y - b.y) + abs(a.z - b.z)) / 2
Ekvivalent ove oznake bio bi reći da jedna od tri koordinate mora biti zbroj druge dvije, a zatim to uzeti kao udaljenost. U nastavku možete odabrati oblik prepolovljenja ili oblik maksimalne vrijednosti, ali oni daju isti rezultat:

Funkcija cube_distance(a, b): povratak max(abs(a.x - b.x), abs(a.y - b.y), abs(a.z - b.z))
Na slici su maksimalne vrijednosti označene bojom. Imajte na umu također da svaka boja predstavlja jedan od šest "dijagonalnih" smjerova.

GIF


Aksijalne koordinate

U aksijalnom sustavu treća koordinata izražena je implicitno. Pretvorimo iz aksijalnog u kubni da izračunamo udaljenost:

Funkcija hex_distance(a, b): var ac = hex_to_cube(a) var bc = hex_to_cube(b) return cube_distance(ac, bc)
Ako je kompajler inline (inline) hex_to_cube i cube_distance u vašem slučaju, onda će generirati kod ovako:

Funkcija hex_distance(a, b): return (abs(a.q - b.q) + abs(a.q + a.r - b.q - b.r) + abs(a.r - b.r)) / 2
Postoji mnogo različitih načina za pisanje udaljenosti između šesterokuta u osnim koordinatama, ali bez obzira na način pisanja udaljenost između šesterokuta u aksijalnom sustavu izvađena je iz manhattanske udaljenosti u kubnom sustavu. Na primjer, opisana "razlika razlika" dobije se pisanjem a.q + a.r - b.q - b.r kao a.q - b.q + a.r - b.r i korištenjem oblika maksimalne vrijednosti umjesto oblika bisekcije cube_distance . Sve su slične ako vidite vezu s kubnim koordinatama.

Offset koordinate

Kao i kod aksijalnih koordinata, koordinate pomaka pretvaramo u kubične koordinate i zatim koristimo kubičnu udaljenost.

Funkcija offset_distance(a, b): var ac = offset_to_cube(a) var bc = offset_to_cube(b) return cube_distance(ac, bc)
Koristit ćemo isti uzorak za mnoge algoritme: pretvoriti iz šesterokuta u kocke, pokrenuti kubičnu verziju algoritma i pretvoriti kubične rezultate u šesterokutne koordinate (aksijalne ili offset koordinate).

Crtanje linija

Kako nacrtati liniju od jednog šesterokuta do drugog? Koristim linearnu interpolaciju za crtanje linija. Pravac se ravnomjerno uzorkuje u N+1 točki i izračunava se u kojim se šesterokutima ti uzorci nalaze.

GIF


  1. Prvo izračunavamo N, što će biti udaljenost u šesterokutima između krajnjih točaka.
  2. Zatim ravnomjerno uzorkujemo N+1 točaka između točaka A i B. Koristeći linearnu interpolaciju, određujemo da će za vrijednosti i od 0 do N uključujući i njih, svaka točka biti A + (B - A) * 1,0/N * ja Na slici su te kontrolne točke prikazane plavom bojom. Rezultat su koordinate s pomičnim zarezom.
  3. Pretvorimo svaku kontrolnu točku (float) natrag u šesterokute (int). Algoritam se zove cube_round (vidi dolje).
Stavite sve zajedno da nacrtate crtu od A do B:

Funkcija lerp(a, b, t): // za float vraća a + (b - a) * t funkcija cube_lerp(a, b, t): // za šesterokute vraća kocku(lerp(a.x, b.x, t), lerp(a.y, b.y, t), lerp(a.z, b.z, t)) funkcija cube_linedraw(a, b): var N = cube_distance(a, b) var rezultati = za svaki 0 ​​≤ i ≤ N: rezultati.append( cube_round(cube_lerp(a, b, 1.0/N * i))) vrati rezultate
Bilješke:

  • Postoje slučajevi u kojima cube_lerp vraća točku koja je točno na rubu između dva šesterokuta. Zatim ga cube_round pomiče u jednom ili drugom smjeru. Linije izgledaju bolje ako se pomiču u jednom smjeru. To se može učiniti dodavanjem "epsilon"-heksagonalne kocke (1e-6, 1e-6, -2e-6) na jednu ili obje krajnje točke prije pokretanja petlje. Ovo će "gurnuti" liniju u jednom smjeru kako ne bi udarila u rubove.
  • DDA linijski algoritam u kvadratnim mrežama izjednačuje N s maksimalnom udaljenosti duž svake od osi. Istu stvar radimo u kubičnom prostoru, koji je sličan udaljenosti u šesterokutnoj mreži.
  • Funkcija cube_lerp trebala bi vratiti kocku s float koordinatama. Ako programirate na statički tipiziranom jeziku, nećete moći koristiti tip Cube. Umjesto toga možete definirati vrstu FloatCube ili umetnuti funkciju u svoj kod za crtanje linija ako ne želite definirati drugu vrstu.
  • Možete optimizirati kod pomoću inline cube_lerp i zatim izračunati B.x-A.x, B.x-A.y i 1.0/N izvan petlje. Množenje se može pretvoriti u ponovljeno zbrajanje. Rezultat će biti nešto poput DDA linijskog algoritma.
  • Koristim aksijalne ili kubične koordinate za crtanje linija, ali ako želite raditi s koordinatama pomaka, pogledajte .
  • Postoji mnogo opcija za crtanje linija. Ponekad je potrebno "premazivanje". Poslan mi je kod za crtanje super-pokrivenih linija u šesterokutima, ali ga još nisam pogledao.

Pokretni raspon

Raspon koordinata

Dato je središte šesterokuta i raspon N, koji su šesterokuti unutar N koraka od njega?

Možemo napraviti inverziju iz formule udaljenosti između šesterokuta udaljenost = max(abs(dx), abs(dy), abs(dz)) . Da bismo pronašli sve šesterokute unutar N potrebno nam je max(abs(dx), abs(dy), abs(dz)) ≤ N . To znači da su potrebne sve tri vrijednosti: abs(dx) ≤ N i abs(dy) ≤ N i abs(dz) ≤ N. Uklanjanjem apsolutne vrijednosti dobivamo -N ≤ dx ≤ N i -N ≤ dy ≤ N i -N ≤ dz ≤ N . U kodu će to biti ugniježđena petlja:

Var rezultati = za svaki -N ≤ dx ≤ N: za svaki -N ≤ dy ≤ N: za svaki -N ≤ dz ≤ N: ako je dx + dy + dz = 0: rezultati.append(cube_add(center, Cube(dx) , dy, dz)))
Ovaj ciklus će djelovati, ali će biti prilično neučinkovit. Od svih dz vrijednosti koje prolazimo kroz petlju, samo jedna zapravo zadovoljava uvjet kocke dx + dy + dz = 0. Umjesto toga, izravno ćemo izračunati vrijednost dz koja zadovoljava uvjet:

Var rezultati = za svaki -N ≤ dx ≤ N: za svaki max(-N, -dx-N) ≤ dy ≤ min(N, -dx+N): var dz = -dx-dy rezultati.append(cube_add( centar, kocka(dx, dy, dz)))
Ovaj ciklus prolazi samo duž traženih koordinata. Na slici je svaki raspon par linija. Svaka linija je nejednadžba. Uzimamo sve šesterokute koji zadovoljavaju šest nejednakosti.

GIF


Rasponi koji se preklapaju

Ako trebate pronaći šesterokute koji su u više raspona, možete presijecati raspone prije generiranja popisa šesterokuta.

Ovom problemu možete pristupiti sa stajališta algebre ili geometrije. Algebarski se svaka regija izražava kao uvjeti nejednakosti oblika -N ≤ dx ≤ N , a mi trebamo pronaći presjek tih uvjeta. Geometrijski, svaka regija je kocka u 3D prostoru, a mi ćemo presjeći dvije kocke u 3D prostoru da bismo dobili kvadar u 3D prostoru. Zatim ga projiciramo natrag na ravninu x + y + z = 0 da bismo dobili šesterokute. Ovaj ću problem riješiti algebarski.

Prvo, prepisujemo uvjet -N ≤ dx ≤ N u općenitijem obliku x min ≤ x ≤ x max i uzimamo x min = center.x - N i x max = center.x + N . Učinimo isto za y i z, što rezultira općim oblikom koda iz prethodnog odjeljka:

Var rezultati = za svaki xmin ≤ x ≤ xmax: za svaki max(ymin, -x-zmax) ≤ y ≤ min(ymax, -x-zmin): var z = -x-y rezultati.append(Cube(x, y, z))
Sjecište dvaju raspona a ≤ x ≤ b i c ≤ x ≤ d je max(a, c) ≤ x ≤ min(b, d) . Budući da je površina šesterokuta izražena kao rasponi preko x, y, z, možemo zasebno presjeći svaki od raspona x, y, z, a zatim koristiti ugniježđenu petlju za generiranje popisa šesterokuta u presjeku. Za jednu površinu šesterokuta uzimamo x min = H.x - N i x max = H.x + N, slično za y i z. Za sjecište dva šesterokutna područja uzimamo x min = max(H1.x - N, H2.x - N) i x max = min(H1.x + N, H2.x + N), slično za y i z . Isti obrazac funkcionira za sjecište tri ili više područja.

GIF


Prepreke

Ako postoje prepreke, najlakši način je popuniti s ograničenjem udaljenosti (traži prvo širinom). Na donjoj slici ograničili smo se na četiri poteza. U kodu, fringes[k] je niz svih šesterokuta do kojih se može doći u k koraka. Svaki put kada prolazimo kroz glavnu petlju, proširujemo razinu k-1 za razinu k.

Funkcija cube_reachable(start, movement): var visited = set() dodaj početak posjećenom var fringes = fringes.append() za svaki 1< k ≤ movement: fringes.append() for each cube in fringes: for each 0 ≤ dir < 6: var neighbor = cube_neighbor(cube, dir) if neighbor not in visited, not blocked: add neighbor to visited fringes[k].append(neighbor) return visited

Okreti

Zadani vektor šesterokuta (razlika između dva šesterokuta), možda ćemo ga trebati rotirati tako da pokazuje na drugi šesterokut. To je lako učiniti s kubičnim koordinatama ako se držite rotacije od 1/6 kruga.

Rotacija od 60° udesno pomiče svaku koordinatu za jedan položaj udesno:

[ x, y, z] do [-z, -x, -y]
Rotacija od 60° ulijevo pomiče svaku koordinatu jednu poziciju ulijevo:

[ x, y, z] do [-y, -z, -x]



“Poigravši se” [u izvornom članku] s dijagramom, možete vidjeti da je svaka rotacija 60° promjene potpisuje i fizički “rotira” koordinate. Nakon rotacije od 120°, znakovi ponovno postaju isti. Rotacija od 180° mijenja predznak, ali se koordinate vraćaju u prvobitni položaj.

Ovdje je kompletan niz rotacije položaja P oko središnjeg položaja C, što rezultira novim položajem R:

  1. Pretvorite položaje P i C u kubične koordinate.
  2. Izračunavanje vektora oduzimanjem središta: P_od_C = P - C = kocka(P.x - C.x, P.y - C.y, P.z - C.z) .
  3. Rotirajte vektor P_from_C kako je gore opisano i dodijelite konačnom vektoru oznaku R_from_C.
  4. Pretvaranje vektora natrag u položaj dodavanjem centra: R = R_od_C + C = kocka(R_od_C.x + C.x, R_od_C.y + C.y, R_od_C.z + C.z) .
  5. Pretvara kubičnu poziciju R natrag u željeni koordinatni sustav.
Postoji nekoliko faza transformacije, ali svaka je vrlo jednostavna. Moguće je skratiti neke od ovih koraka definiranjem rotacije izravno u aksijalnim koordinatama, ali heksadecimalni vektori ne rade s koordinatama pomaka, a ja ne znam kako skratiti korake za koordinate pomaka. Također pogledajte raspravu o stackexchangeu za druge načine izračuna rotacije.

Prstenje

Jednostavan prsten

Da biste saznali pripada li dati šesterokut prstenu zadanog polumjera radijusa, morate izračunati udaljenost od tog šesterokuta do središta i saznati je li jednaka polumjeru. Da biste dobili popis svih takvih šesterokuta, morate napraviti radijusne korake od središta, a zatim slijediti rotirane vektore duž putanje duž prstena.

Funkcija cube_ring(center, radius): var results = # ovaj kod ne radi za radius == 0; razumiješ li zašto? var cube = cube_add(center, cube_scale(cube_direction(4), radius)) za svaki 0 ​​≤ i< 6: for each 0 ≤ j < radius: results.append(cube) cube = cube_neighbor(cube, i) return results
U ovom kodu, kocka počinje na prstenu, prikazanom velikom strelicom od središta prema kutu dijagrama. Odabrao sam kut 4 za početak jer odgovara putanji kojom se kreću moji brojevi smjera. Možda će vam trebati drugačiji početni kut. U svakoj fazi unutarnje petlje, kocka se pomiče za jedan šesterokut oko prstena. Nakon 6 * radijusa koraka on završava gdje je i počeo.


Spiralni prstenovi

Prolazeći kroz prstenove u spiralnom uzorku, možemo ispuniti unutarnje dijelove prstenova:

Funkcija cube_spiral(center, radius): var rezultati = za svaki 1 ≤ k ≤ radius: rezultati = rezultati + cube_ring(center, k) vraća rezultate



Površina velikog šesterokuta je zbroj svih krugova plus 1 za središte. Koristite ovu formulu za izračun površine.

Prelaženje šesterokuta na ovaj način također se može koristiti za izračunavanje raspona kretanja (vidi gore).

Područje vidljivosti

Što je vidljivo s određenog položaja na određenoj udaljenosti, a nije blokirano preprekama? Najjednostavniji način da to odredite je crtanje crte do svakog šesterokuta u danom rasponu. Ako linija ne spaja zidove, tada vidite šesterokut. Pomaknite miš preko šesterokuta [na dijagramu u izvornom članku] da biste vidjeli kako su linije nacrtane na tim šesterokutima i zidovima s kojima se linije susreću.

Ovaj algoritam može biti spor na velikim područjima, ali ga je lako implementirati, pa preporučujem da počnete s njim.

GIF



Postoji mnogo različitih definicija vidljivosti. Želite li vidjeti središte drugog šesterokuta iz središta izvornog? Želite li vidjeti bilo koji dio drugog šesterokuta iz središta originalnog? Možda bilo koji dio drugog šesterokuta iz bilo koje točke početnog? Prepreke koje vam ometaju pogled su manje od punog šesterokuta? Opseg je lukaviji i raznolikiji koncept nego što se čini na prvi pogled. Počnimo s najjednostavnijim algoritmom, ali očekujte da će sigurno točno izračunati odgovor u vašem projektu. Postoje čak i slučajevi kada jednostavan algoritam daje nelogične rezultate.

Želim proširiti ovaj vodič u budućnosti. imam