Hvordan man tegner en regulær sekskant i en cirkel. Regelmæssig sekskant og dens egenskaber

Indhold:

En regulær sekskant, også kaldet en perfekt sekskant, har seks lige store sider og seks lige store vinkler. Du kan tegne en sekskant med et målebånd og en vinkelmåler, en ru sekskant med en rund genstand og en lineal, eller en endnu grovere sekskant med blot en blyant og lidt intuition. Hvis du vil vide, hvordan man tegner en sekskant på forskellige måder, skal du bare læse videre.

Trin

1 Tegn en perfekt sekskant ved hjælp af et kompas

  1. 1 Brug et kompas til at tegne en cirkel. Indsæt blyanten i kompasset. Forlæng kompasset til den ønskede radiusbredde af din cirkel. Radius kan være fra et par til ti centimeter bred. Placer derefter et kompas og blyant på papir og tegn en cirkel.
    • Nogle gange er det nemmere først at tegne en halv cirkel og derefter den anden halvdel.
  2. 2 Flyt kompasnålen til kanten af ​​cirklen. Placer den oven på cirklen. Ændr ikke kompassets vinkel eller position.
  3. 3 Lav et lille blyantmærke på kanten af ​​cirklen. Gør det tydeligt, men ikke for mørkt, da du vil slette det senere. Husk at fastholde den vinkel, du indstiller for kompasset.
  4. 4 Flyt kompasnålen til det mærke, du lige har lavet. Placer nålen direkte på mærket.
  5. 5 Lav endnu et blyantmærke på kanten af ​​cirklen. På denne måde vil du lave et andet mærke i en vis afstand fra det første mærke. Fortsæt med at bevæge dig i én retning.
  6. 6 Brug samme metode til at lave fire flere mærker. Du skal vende tilbage til det oprindelige mærke. Hvis ikke, så er det højst sandsynligt, at den vinkel, hvor du holdt kompasset og lavede dine mærker, har ændret sig. Det kan være sket, fordi du har klemt det for stramt eller tværtimod løsnet det lidt.
  7. 7 Forbind mærkerne med en lineal. De seks steder, hvor dine mærker skærer kanten af ​​cirklen, er sekskantens seks hjørner. Brug en lineal og blyant til at tegne lige linjer, der forbinder tilstødende mærker.
  8. 8 Slet cirklen, mærkerne på kanterne af cirklen og alle andre mærker, du har lavet. Når du har slettet alle dine byggelinjer, burde din perfekte sekskant være klar.

2 Tegn en ru sekskant ved hjælp af en rund genstand og en lineal

  1. 1 Spor kanten af ​​glasset med en blyant. På denne måde vil du tegne en cirkel. Det er meget vigtigt at tegne med en blyant, da du senere bliver nødt til at slette alle hjælpelinjerne. Du kan også spore et glas på hovedet, en krukke eller noget andet, der har en rund bund.
  2. 2 Tegn vandrette linjer gennem midten af ​​din cirkel. Du kan bruge en lineal, en bog - alt med en lige kant. Hvis du har en lineal, kan du markere midten ved at beregne den lodrette længde af cirklen og dele den i to.
  3. 3 Tegn et "X" over halvdelen af ​​cirklen, del det i seks lige store sektioner. Da du allerede har tegnet en streg gennem midten af ​​cirklen, skal X'et være bredere, end det er højt, så delene er lige store. Forestil dig at dele en pizza i seks stykker.
  4. 4 Lav trekanter ud af hver sektion. For at gøre dette skal du bruge en lineal til at tegne en lige linje under den buede del af hver sektion og forbinde den med de to andre linjer for at danne en trekant. Gør dette med de resterende fem sektioner. Tænk på det som at lave en skorpe omkring dine pizzaskiver.
  5. 5 Slet alle hjælpelinjer. Retningslinjerne inkluderer din cirkel, de tre linjer, der inddelte din cirkel i sektioner, og andre markeringer, du har lavet undervejs.

3 Tegn en ru sekskant med en blyant

  1. 1 Tegn en vandret linje. For at tegne en lige linje uden lineal skal du blot tegne start- og slutpunktet for din vandrette linje. Placer derefter blyanten ved startpunktet og tegn linjen til enden. Længden af ​​denne linje kan kun være et par centimeter.
  2. 2 Tegn to diagonale linjer fra enderne af den vandrette. Den diagonale linje i venstre side skal pege udad på samme måde som den diagonale linje til højre. Du kan forestille dig, at disse linjer danner en vinkel på 120 grader i forhold til den vandrette linje.
  3. 3 Tegn yderligere to vandrette linjer, der kommer fra de første vandrette linjer tegnet indad. Dette vil skabe et spejlbillede af de første to diagonale linjer. Den nederste venstre linje skal være en afspejling af den øverste venstre linje, og den nederste højre linje skal være en afspejling af den øverste højre linje. Mens de øverste vandrette linjer skal se udad, skal de nederste se indad til bunden.
  4. 4 Tegn en anden vandret linje, der forbinder de to nederste diagonale linjer. På denne måde vil du tegne basen til din sekskant. Ideelt set bør denne linje være parallel med den øverste vandrette linje. Nu har du fuldført din sekskant.
  • Blyanten og kompasset skal være skarpe for at minimere fejl fra mærker, der er for brede.
  • Når du bruger kompasmetoden, vil du få en ligesidet trekant, hvis du forbinder hvert mærke i stedet for alle seks.

Advarsler

  • Kompasset er et ret skarpt objekt, vær meget forsigtig med det.

Funktionsprincip

  • Hver metode vil hjælpe dig med at tegne en sekskant dannet af seks ligesidede trekanter med en radius lig med længden af ​​alle sider. De seks tegnede radier har samme længde, og alle linjerne til at skabe sekskanten har også samme længde, da kompassets bredde ikke ændrede sig. På grund af det faktum, at de seks trekanter er ligesidede, er vinklerne mellem deres hjørner 60 grader.

Hvad du skal bruge

  • Papir
  • Blyant
  • Lineal
  • Et par kompas
  • Noget der kan lægges under papiret for at forhindre kompasnålen i at glide.
  • Viskelæder

Geometriske konstruktioner er en af ​​hoveddelene af træning. De danner rumlig og logisk tænkning og giver os også mulighed for at forstå primitiv og naturlig geometrisk gyldighed. Konstruktioner er lavet på et fly ved hjælp af et kompas og lineal. Disse værktøjer kan bruges til at konstruere et stort antal geometriske former. Samtidig er mange figurer, der virker ret svære, konstrueret efter de enkleste regler. For eksempel kan hvordan man bygger en regulær sekskant beskrives med få ord.

Du får brug for

  • Kompasser, lineal, blyant, ark papir.

Instruktioner

1. Tegn en cirkel. Indstil en vis afstand mellem kompassets ben. Denne afstand vil være radius af cirklen. Vælg radius på en sådan måde, at det er ret behageligt at tegne en cirkel. Cirklen skal passe helt på arket papir. For stor eller for lille afstand mellem kompassets ben kan føre til, at det ændrer sig under tegningen. Den optimale afstand vil være, hvor vinklen mellem kompassets ben er 15-30 grader.

2. Konstruer toppunkterne for hjørnerne af en regulær sekskant. Placer kompassets ben, hvori nålen er fastgjort, på ethvert punkt på cirklen. Nålen skal gennembore den tegnede linje. Jo mere nøjagtigt kompasset er installeret, jo mere nøjagtigt vil konstruktionen være. Tegn en cirkelbue, så den skærer den tidligere tegnede cirkel. Flyt kompasnålen til skæringspunktet for den netop tegnede bue med cirklen. Tegn en anden bue, der skærer cirklen. Flyt kompasnålen igen til skæringspunktet mellem buen og cirklen, og tegn buen igen. Gentag denne handling tre gange mere, og bevæg dig i én retning rundt om cirklen. Hver skal have seks buer og seks skæringspunkter.

3. Konstruer en positiv sekskant. Kombiner trinvist alle seks skæringspunkter i buerne med den oprindeligt tegnede cirkel. Forbind punkterne med lige linjer tegnet med en lineal og blyant. Efter at have udført disse handlinger, opnås en korrekt sekskant indskrevet i en cirkel.

Sekskant En polygon anses for at have seks vinkler og seks sider. Polygoner kan være enten konvekse eller konkave. En konveks sekskant har alle indre vinkler stumpe, mens en konkav sekskant har en eller flere spidse vinkler. Sekskanten er ret nem at konstruere. Dette gøres i et par trin.

Du får brug for

  • Blyant, ark papir, lineal

Instruktioner

1. Tag et ark papir og marker 6 punkter på det omtrent som vist i fig. 1.

2. Efter at punkterne er blevet markeret, tag en lineal og en blyant og med deres hjælp, trin for trin, en efter en, forbinder du punkterne, som det ser ud i fig. 2.

Video om emnet

Bemærk!
Summen af ​​alle indvendige vinkler af en sekskant er 720 grader.

Sekskant er en polygon, en der har seks vinkler. For at tegne en vilkårlig sekskant skal du udføre 2 trin hver.

Du får brug for

  • Blyant, lineal, ark papir.

Instruktioner

1. Du skal tage en blyant i hånden og markere 6 tilfældige prikker på arket. I fremtiden vil disse punkter spille rollen som hjørner i sekskanten. (Fig.1)

2. Tag en lineal og tegn 6 segmenter baseret på disse punkter, der ville forbindes med hinanden langs de tidligere tegnede punkter (fig. 2)

Video om emnet

Bemærk!
En særlig type sekskant er den positive sekskant. Det kaldes sådan, fordi alle dets sider og vinkler er ens med hinanden. Du kan beskrive eller indskrive en cirkel omkring sådan en sekskant. Det er værd at bemærke, at på de punkter, der blev opnået ved at røre ved den indskrevne cirkel og siderne af sekskanten, er siderne af den positive sekskant delt i to.

Nyttige råd
I naturen er positive sekskanter meget populære. For eksempel har hele honningkagen en positiv sekskantet form. Eller krystalgitteret af grafen (kulstofmodifikation) har også form som en positiv sekskant.

Hvordan man bygger det ene eller det andet hjørne- stort spørgsmål. Men for nogle vinkler er opgaven usynligt forenklet. En af disse vinkler er hjørne ved 30 grader. Det er lig med?/6, det vil sige, at tallet 30 er en divisor på 180. Desuden er dens sinus kendt. Dette hjælper i dens konstruktion.

Du får brug for

  • vinkelmåler, firkant, kompas, lineal

Instruktioner

1. Lad os først se på en særlig primitiv situation, når du har en vinkelmåler i hænderne. Så kan en lige linje i en vinkel på 30 grader hertil let sættes til side med støtte til den.

2. Ud over vinkelmåleren er der også hjørne buer, hvor en af ​​vinklerne er lig med 30 grader. Så en anden hjørne hjørne vinklen vil være lig med 60 grader, det vil sige, du har brug for en visuelt mindre hjørne at konstruere den nødvendige rette linje.

3. Lad os nu gå videre til ikke-trivielle måder at konstruere en 30-graders vinkel på. Som du ved, er sinus af en vinkel på 30 grader lig med 1/2. For at konstruere det skal vi konstruere direkte hjørne tionær hjørne nik. Det er muligt, at vi kan konstruere to vinkelrette linjer. Men tangenten på 30 grader er et irrationelt tal, derfor kan vi kun tilnærmelsesvis beregne forholdet mellem benene (eksklusivt hvis der ikke er nogen lommeregner), og derfor konstruere hjørne cirka 30 grader.

4. I dette tilfælde er det muligt at lave en nøjagtig konstruktion. Lad os igen konstruere to vinkelrette lige linjer, hvorpå benene vil være placeret lige hjørne Nej hjørne nika. Lad os lægge et lige ben BC af nogen længde med støtte fra et kompas (B – lige hjørne). Efter dette vil vi øge længden mellem kompassets ben med 2 gange, hvilket er elementært. Tegner vi en cirkel med et centrum i punktet C med en radius af denne længde, finder vi skæringspunktet for cirklen med en anden lige linje. Dette punkt vil være punkt A direkte hjørne Nej hjørne ABC, og hjørne A vil være lig med 30 grader.

5. Opføre hjørne ved 30 grader er tilladt og med støtte fra cirklen, anvende hvad det er lig med?/6. Lad os konstruere en cirkel med radius OB. Lad os se på teorien hjørne nik, hvor OA = OB = R – radius af cirklen, hvor hjørne OAB = 30 grader. Lad OE være højden af ​​denne ligebenede trekant hjørne nik, og følgelig dens bisector og median. Derefter hjørne AOE = 15 grader, og ifølge halvvinkelformlen sin(15o) = (sqrt(3)-1)/(2*sqrt(2)). Følgelig er AE = R*sin(15o). Derfor er AB = 2AE = 2R*sin(15o). Ved at konstruere en cirkel med radius BA med et centrum i punkt B, finder vi skæringspunktet A for denne cirkel med den oprindelige. Vinkel AOB vil være 30 grader.

6. Hvis vi kan bestemme længden af ​​buer på en eller anden måde, så får vi, når vi sætter en bue af længden til side?*R/6, også hjørne ved 30 grader.

Bemærk!
Vi skal huske, at vi i afsnit 5 kun kan konstruere vinklen tilnærmelsesvist, fordi irrationelle tal vil optræde i beregningerne.

Sekskant kaldet et specialtilfælde af en polygon - en figur dannet af de fleste punkter i planet, afgrænset af en lukket polylinje. En positiv sekskant (sekskant) er til gengæld også et specialtilfælde - det er en polygon med seks lige store sider og lige store vinkler. Denne figur er signifikant ved, at længden af ​​alle dens sider er lig med radius af cirklen beskrevet omkring figuren.

Du får brug for

  • – kompas;
  • - lineal;
  • - blyant;
  • - papir.

Instruktioner

1. Vælg sidelængden af ​​sekskanten. Tag et kompas og indstil afstanden mellem enden af ​​nålen, der er placeret på et af dens ben, og enden af ​​ledningen, placeret på det andet ben, svarende til længden af ​​den side af figuren, der tegnes. For at gøre dette kan du bruge en lineal eller vælge en tilfældig afstand, hvis dette øjeblik ikke er signifikant. Fastgør kompassets ben med en skrue, hvis det er muligt.

2. Tegn en cirkel ved hjælp af et kompas. Den valgte afstand mellem benene vil være radius af cirklen.

3. Del cirklen i seks lige store dele med prikker. Disse punkter vil være hjørnerne af sekskanten og følgelig enderne af segmenterne, der repræsenterer dens sider.

4. Placer kompassets ben med nålen på et vilkårligt punkt placeret på linjen af ​​den skitserede cirkel. Nålen skal gennembore linjen korrekt. Konstruktionernes nøjagtighed afhænger direkte af nøjagtigheden af ​​kompassets installation. Tegn en bue med et kompas, så den skærer den først tegnede cirkel i 2 punkter.

5. Flyt kompassets ben med nålen til et af skæringspunkterne for den tegnede bue med den oprindelige cirkel. Tegn en anden bue, der også skærer cirklen i 2 punkter (en af ​​dem vil falde sammen med punktet for den tidligere placering af kompasnålen).

6. På samme måde skal du omarrangere kompasnålen og tegne buer fire gange mere. Flyt kompassets ben med nålen i én retning rundt om cirklen (uvægerligt med eller mod uret). Som et resultat skal seks skæringspunkter for buer med den oprindeligt konstruerede cirkel identificeres.

7. Tegn en positiv sekskant. Trinvis, i par, foren de seks punkter opnået i det foregående trin med segmenter. Tegn segmenterne ved hjælp af en blyant og lineal. Resultatet bliver en korrekt sekskant. Efter at have afsluttet konstruktionen kan du slette hjælpeelementerne (buer og cirkler).

Bemærk!
Det giver mening at vælge en afstand mellem kompassets ben, så vinklen mellem dem er 15-30 grader tværtimod, når man laver konstruktioner, kan denne afstand let gå tabt.

Når man bygger eller udvikler boligdesignplaner, er det ofte nødvendigt at bygge hjørne, lig med den eksisterende. Prøver og skolegeometriske færdigheder kommer til at understøtte.

Instruktioner

1. En vinkel er dannet af to rette linjer, der udgår fra et punkt. Dette punkt kaldes vinklens toppunkt, og linjerne vil være vinklens sider.

2. Brug tre bogstaver til at repræsentere hjørner: en øverst, to i siderne. Hedder hjørne, begyndende med bogstavet, der står på den ene side, så kaldes bogstavet, der står øverst, og derefter bogstavet på den anden side. Brug andre metoder til at markere hjørner, hvis du er mere komfortabel overfor. Af og til nævnes kun ét bogstav, som er placeret øverst. Og det er tilladt at betegne vinkler med græske bogstaver, f.eks. α, β, γ.

3. Der er situationer, hvor du skal tegne hjørne, så den er lig med den givne vinkel. Hvis der ikke er mulighed for at bruge en vinkelmåler, når du konstruerer en tegning, kan du kun klare dig med lineal og kompas. Det er muligt, på den lige linje, der er angivet på tegningen med bogstaverne MN, er det nødvendigt at bygge hjørne ved punkt K, så den er lig med vinkel B. Det vil sige, at du fra punkt K skal tegne en ret linje, der danner med linjen MN hjørne, den der vil være lig med vinkel B.

4. Først skal du markere et punkt på hele siden af ​​en given vinkel, f.eks. punkterne A og C, og derefter forbinde punkterne C og A med en lige linje. Få tre hjørne nik ABC.

5. Konstruer nu det samme tre på den lige linje MN hjørne så dets toppunkt B er på linjen i punktet K. Brug reglen til at konstruere en trekant hjørne på tre sider. Afbryd segmentet KL fra punkt K. Det skal være lig med segmentet BC. Få L-punktet.

6. Fra punkt K tegnes en cirkel med en radius lig med segment BA. Fra L tegnes en cirkel med radius CA. Kombiner det resulterende punkt (P) i skæringspunktet mellem 2 cirkler med K. Få tre hjørne nik KPL, den der vil være lig med tre hjørne ABC bog. Så du får hjørne K. Det vil være lig med vinkel B. For at gøre denne konstruktion mere komfortabel og hurtigere, skal du afsætte lige store segmenter fra toppunktet B ved hjælp af en kompasløsning, uden at flytte benene, beskriv en cirkel med samme radius fra punktet K.

Video om emnet

Bemærk!
Undgå ved et uheld at ændre afstanden mellem kompassets ben. I dette tilfælde kan sekskanten vise sig at være forkert.

Nyttige råd
Han har en evne til at lave konstruktioner ved hjælp af et kompas med en perfekt slebet ledning. På denne måde bliver konstruktionerne særligt nøjagtige.

Er der en blyant i nærheden af ​​dig? Tag et kig på dens tværsnit - det er en regulær sekskant eller, som den også kaldes, en sekskant. Tværsnittet af en møtrik, et felt af sekskantet skak, nogle komplekse kulstofmolekyler (for eksempel grafit), et snefnug, en honeycomb og andre genstande har også denne form. En gigantisk regulær sekskant blev for nylig opdaget i Synes det ikke mærkeligt, at naturen så ofte bruger strukturer af denne særlige form til sine kreationer? Lad os se nærmere.

En regulær sekskant er en polygon med seks lige store sider og lige store vinkler. Fra skoleforløbet ved vi, at det har følgende egenskaber:

  • Længden af ​​dens sider svarer til radius af den omskrevne cirkel. Af alt er det kun den regulære sekskant, der har denne egenskab.
  • Vinklerne er ens med hinanden, og størrelsen af ​​hver er 120°.
  • Omkredsen af ​​en sekskant kan findes ved hjælp af formlen P=6*R, hvis radius af cirklen beskrevet omkring den er kendt, eller P=4*√(3)*r, hvis cirklen er indskrevet i den. R og r er radierne af den omskrevne og indskrevne cirkel.
  • Arealet optaget af en regulær sekskant bestemmes som følger: S=(3*√(3)*R 2)/2. Hvis radius er ukendt, erstattes længden af ​​en af ​​siderne - som bekendt svarer den til længden af ​​radius af den omskrevne cirkel.

En almindelig sekskant har en interessant funktion, takket være hvilken den er blevet så udbredt i naturen - den er i stand til at fylde enhver overflade af et fly uden overlapninger eller huller. Der er endda det såkaldte Pal-lemma, ifølge hvilket en regulær sekskant, hvis side er lig med 1/√(3), er et universaldæksel, det vil sige, det kan dække ethvert sæt med en diameter på en enhed .

Lad os nu se på at konstruere en regulær sekskant. Der er flere metoder, hvoraf den enkleste involverer brug af kompas, blyant og lineal. Først tegner vi en vilkårlig cirkel med et kompas, så laver vi et punkt på et vilkårligt sted på denne cirkel. Uden at ændre kompassets vinkel placerer vi spidsen på dette punkt, markerer det næste hak på cirklen og fortsætter med dette, indtil vi får alle 6 punkter. Nu er der kun tilbage at forbinde dem med lige segmenter, og du får den ønskede figur.

I praksis er der tidspunkter, hvor du skal tegne en stor sekskant. For eksempel, på et to-niveau gipspladeloft, omkring det sted, hvor den centrale lysekrone er fastgjort, skal du installere seks små lamper på det nederste niveau. Kompasser af denne størrelse vil være meget, meget svære at finde. Hvad skal man gøre i dette tilfælde? Hvordan tegner man overhovedet en stor cirkel? Meget simpelt. Du skal tage en stærk tråd af den nødvendige længde og binde en af ​​dens ender modsat blyanten. Nu er der kun tilbage at finde en assistent, der vil presse den anden ende af tråden til loftet på det ønskede sted. Selvfølgelig er mindre fejl i dette tilfælde mulige, men det er usandsynligt, at de overhovedet er mærkbare for en udenforstående.

Konstruktion af en regulær sekskant indskrevet i en cirkel. Konstruktionen af ​​en sekskant er baseret på det faktum, at dens side er lig med radius af den omskrevne cirkel. Derfor, for at konstruere det, er det nok at opdele cirklen i seks lige store dele og forbinde de fundne punkter med hinanden (fig. 60, a).

En regulær sekskant kan bygges med en lige kant og en 30X60° firkant. For at udføre denne konstruktion tager vi den vandrette diameter af cirklen som halveringslinje for vinkel 1 og 4 (fig. 60, b), konstruerer siderne 1 -6, 4-3, 4-5 og 7-2, hvorefter vi tegner side 5-6 og 3-2.

Konstruktion af en ligesidet trekant indskrevet i en cirkel. En sådan trekants hjørner kan konstrueres ved hjælp af et kompas og en firkant med vinkler på 30 og 60° eller kun et kompas.

Lad os overveje to måder at konstruere en ligesidet trekant indskrevet i en cirkel.

Første vej(Fig. 61,a) er baseret på, at alle tre vinkler i trekanten 7, 2, 3 indeholder 60°, og den lodrette linje trukket gennem punkt 7 er både højden og halveringslinjen af ​​vinkel 1. Da vinklen er 0-1- 2 er lig med 30°, så for at finde siden

1-2, er det nok at konstruere en vinkel på 30° fra punkt 1 og side 0-1. For at gøre dette skal du installere tværstangen og firkanten som vist på figuren, tegne linje 1-2, som vil være en af ​​siderne af den ønskede trekant. For at konstruere side 2-3 skal du sætte tværstangen i positionen vist med de stiplede linjer, og tegne en lige linje gennem punkt 2, som bestemmer trekantens tredje toppunkt.

Anden vej er baseret på, at hvis du bygger en regulær sekskant indskrevet i en cirkel og derefter forbinder dens hjørner gennem en, får du en ligesidet trekant.

For at konstruere en trekant (fig. 61, b), marker toppunktet 1 på diameteren og tegn en diametral linje 1-4. Dernæst beskriver vi fra punkt 4 med en radius lig med D/2 en bue, indtil den skærer cirklen i punkterne 3 og 2. De resulterende punkter vil være de to andre hjørner af den ønskede trekant.

Konstruktion af et kvadrat indskrevet i en cirkel. Denne konstruktion kan udføres ved hjælp af en firkant og et kompas.

Den første metode er baseret på det faktum, at kvadratets diagonaler skærer i midten af ​​den omskrevne cirkel og hælder til dens akser i en vinkel på 45°. Baseret på dette installerer vi tværstangen og firkanten med vinkler på 45° som vist i fig. 62, a, og marker punkterne 1 og 3. Dernæst gennem disse punkter tegner vi de vandrette sider af kvadratet 4-1 og 3-2 ved hjælp af en tværstang. Derefter, ved hjælp af en lige kant, tegner vi de lodrette sider af firkanten 1-2 og 4-3 langs firkantens ben.

Den anden metode er baseret på det faktum, at firkantens hjørner halverer buerne af cirklen, der er indesluttet mellem enderne af diameteren (fig. 62, b). Vi markerer punkterne A, B og C for enderne af to indbyrdes vinkelrette diametre og fra dem med en radius y beskriver vi buer, indtil de skærer hinanden.

Dernæst gennem skæringspunkterne for buerne tegner vi hjælpelige linjer, markeret i figuren med faste linjer. Punkterne i deres skæringspunkt med cirklen vil bestemme toppunkterne 1 og 3; 4 og 2. Vi forbinder hjørnerne af det ønskede kvadrat opnået på denne måde i serie med hinanden.

Konstruktion af en regulær femkant indskrevet i en cirkel.

For at passe en regulær femkant ind i en cirkel (fig. 63) laver vi følgende konstruktioner.

Vi markerer punkt 1 på cirklen og tager det som et af toppunkterne i femkanten. Vi deler segmentet AO i halve. For at gøre dette beskriver vi en bue fra punkt A med radius AO indtil den skærer cirklen i punkterne M og B. Ved at forbinde disse punkter med en ret linje får vi punkt K, som vi så forbinder til punkt 1. Med en radius, der er lig med segmentet A7, beskriver vi en bue fra punktet K, indtil den skærer den diametrale linje AO i punkt H. Ved at forbinde punkt 1 med punkt H, får vi siden af ​​femkanten. Ved hjælp af en kompasløsning svarende til segmentet 1H, der beskriver en bue fra toppunkt 1 til skæringspunktet med cirklen, finder vi toppunkter 2 og 5. Efter at have lavet indhak fra toppunkter 2 og 5 med samme kompasløsning får vi de resterende toppunkter 3 og 4. Vi forbinder de fundne punkter sekventielt med hinanden.

Konstruktion af en regulær femkant langs en given side.

For at konstruere en regulær femkant langs en given side (fig. 64) deler vi segmentet AB i seks lige store dele. Fra punkt A og B med radius AB beskriver vi buer, hvis skæringspunkt vil give punktet K. Gennem dette punkt og division 3 på linje AB tegner vi en lodret linje.

Vi får punkt 1-vertex af femkanten. Derefter beskriver vi med en radius lig med AB fra punkt 1 en bue, indtil den skærer de buer, der tidligere er tegnet fra punkterne A og B. Buernes skæringspunkter bestemmer femkantens toppunkter 2 og 5. Vi forbinder de fundne toppunkter i serier med hinanden.

Konstruktion af en regulær syvkant indskrevet i en cirkel.

Lad en cirkel med diameter D gives; du skal passe en almindelig sekskant ind i den (fig. 65). Del den lodrette diameter af cirklen i syv lige store dele. Fra punkt 7 med en radius lig med diameteren af ​​cirklen D, beskriver vi en bue, indtil den skærer med fortsættelsen af ​​den vandrette diameter i punktet F. Vi kalder punktet F polygonens pol. Ved at tage punkt VII som et af spidserne af sekskanten, trækker vi stråler fra polen F gennem lige opdelinger af den lodrette diameter, hvis skæring med cirklen vil bestemme hjørnerne VI, V og IV af sekskanten. For at få toppunkter / - // - /// fra punkterne IV, V og VI tegnes vandrette linjer, indtil de skærer cirklen. Vi forbinder de fundne hjørner sekventielt med hinanden. En syvkant kan konstrueres ved at tegne stråler fra F-polen og gennem ulige opdelinger af den lodrette diameter.

Ovenstående metode er velegnet til at konstruere regulære polygoner med et vilkårligt antal sider.

Opdelingen af ​​en cirkel i et vilkårligt antal lige store dele kan også udføres ved hjælp af dataene i tabel. 2, som giver koefficienter, der gør det muligt at bestemme dimensionerne af siderne af regulære indskrevne polygoner.

Sekskantede gitre (sekskantede gitre) bruges i nogle spil, men de er ikke så enkle eller almindelige som rektangulære gitre. Jeg har samlet ressourcer om hex-masker i næsten 20 år, og jeg skrev denne guide til de mest elegante tilgange, implementeret i den enkleste kode. Denne artikel gør udstrakt brug af Charles Fus og Clark Verbrugges guider. Jeg vil beskrive de forskellige måder at skabe sekskantede masker på, deres relationer og de mest almindelige algoritmer. Mange dele af denne artikel er interaktive: Valg af en gittertype ændrer de tilknyttede diagrammer, kode og tekster. (Bemærk pr.: dette gælder kun for originalen, jeg råder dig til at studere den. I oversættelsen er alle oplysningerne fra originalen bevaret, men uden interaktivitet.).

Kodeeksemplerne i artiklen er skrevet i pseudokode, så de er nemmere at læse og forstå for at kunne skrive din egen implementering.

Geometri

Sekskanter er sekssidede polygoner. Regulære sekskanter har alle sider (kanter) af samme længde. Vi vil kun arbejde med almindelige sekskanter. Typisk bruger sekskantede masker vandret (spids top) og lodret (flad top) orientering.


Sekskanter med flade (venstre) og skarpe (højre) toppe

Sekskanter har 6 flader. Hvert ansigt er fælles for to sekskanter. Sekskanter har 6 hjørnepunkter. Hvert hjørnepunkt er fælles for tre sekskanter. Du kan læse mere om centre, kanter og hjørnepunkter i min artikel om maskedele (firkanter, sekskanter og trekanter).

Vinkler

I en regulær sekskant er de indre vinkler 120°. Der er seks "kiler", som hver er en ligesidet trekant med indvendige vinkler på 60°. Hjørnepunkt jeg er placeret i en afstand på (60° * i) + 30°, størrelsesenheder fra midten af ​​midten. I koden:

Funktion 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) )
For at udfylde en sekskant skal du få polygonens toppunkter fra hex_corner(…, 0) til hex_corner(…, 5) . For at tegne omridset af sekskanten skal du bruge disse hjørner og derefter tegne linjen igen i hex_corner(..., 0) .

Forskellen mellem de to orienteringer er, at x og y ombyttes, hvilket resulterer i en ændring i vinkler: flade sekskanter har vinkler på 0°, 60°, 120°, 180°, 240°, 300° og spidstop sekskanter har vinkler på 30°, 90°, 150°, 210°, 270°, 330°.


Hjørner af sekskanter med flade og skarpe toppe

Størrelse og placering

Nu vil vi placere flere sekskanter sammen. I vandret orientering er højden af ​​sekskanten højde = størrelse * 2 . Den lodrette afstand mellem tilstødende sekskanter er vert = højde * 3/4.

Hexagon width width = sqrt(3)/2 * højde . Den vandrette afstand mellem tilstødende sekskanter er horiz = bredde.

Nogle spil bruger pixel art til sekskanter, hvilket ikke helt matcher de almindelige sekskanter. Vinkel- og placeringsformlerne beskrevet i dette afsnit passer ikke til dimensionerne af sådanne sekskanter. Resten af ​​artiklen, der beskriver hex-mesh-algoritmer, gælder, selvom sekskanterne er let strakte eller klemt sammen.



Koordinatsystemer

Lad os begynde at samle sekskanterne til et gitter. Ved gitter af firkanter er der kun én oplagt måde at samle på. For sekskanter er der mange tilgange. Jeg anbefaler at bruge kubiske koordinater som din primære repræsentation. Aksiale koordinater eller offsetkoordinater skal bruges til at gemme kort og vise koordinater for brugeren.

Offset koordinater

Den mest almindelige fremgangsmåde er at udligne hver efterfølgende kolonne eller række. Kolonner er betegnet col eller q. Rækker er angivet med række eller r . Du kan forskyde ulige eller lige kolonner/rækker, så vandrette og lodrette sekskanter har hver to muligheder.


Vandret arrangement "ulige-r"


Vandret arrangement "lige-r"


Lodret "ulige-q"-arrangement


Lodret arrangement "lige-q"

Kubiske koordinater

En anden måde at se på sekskantede gitter er at se dem som tre hovedakser, ikke to, som i gitter af firkanter. De udviser elegant symmetri.

Lad os tage et gitter af terninger og lad os skære det ud diagonalplan ved x + y + z = 0. Dette er en mærkelig idé, men det vil hjælpe os med at forenkle hexagon mesh-algoritmerne. Vi vil især være i stand til at bruge standardoperationer fra kartesiske koordinater: summering og subtrahering af koordinater, gange og dividere med en skalær størrelse og afstande.

Læg mærke til de tre hovedakser på gitteret af terninger og deres forhold til de seks diagonal retninger af det sekskantede gitter. Gitterets diagonale akser svarer til sekskantgitterets hovedretning.


Sekskanter


terninger

Da vi allerede har algoritmer for kvadratiske og terningmasker, giver brug af kubiske koordinater os mulighed for at tilpasse disse algoritmer til sekskantede masker. Jeg vil bruge dette system til de fleste af artiklens algoritmer. For at bruge algoritmerne med et andet koordinatsystem, transformerer jeg de kubiske koordinater, kører algoritmen og konverterer dem derefter tilbage.

Lær, hvordan kubiske koordinater fungerer for et sekskantnet. Når du vælger sekskanter, fremhæves kubiske koordinater svarende til de tre akser.

  1. Hver retning af terninggitteret svarer til linjer på et gitter af sekskanter. Prøv at vælge en sekskant med z lig med 0, 1, 2, 3 for at se forbindelsen. Linjen er markeret med blåt. Prøv det samme for x (grøn) og y (lilla).
  2. Hver retning af sekskantgitteret er en kombination af to retninger af terninggitteret. For eksempel ligger "nord" af et sekskantet gitter mellem +y og -z, så hvert trin med "nord" øger y med 1 og mindsker z med 1.
Kubiske koordinater er et rimeligt valg for et sekskantet gitterkoordinatsystem. Betingelsen er x + y + z = 0, så den skal bevares i algoritmerne. Betingelsen sikrer også, at der altid vil være en kanonisk koordinat for hver sekskant.

Der findes mange forskellige koordinatsystemer til terninger og sekskanter. I nogle af dem er tilstanden forskellig fra x + y + z = 0. Jeg viste kun et af mange systemer. Du kan også lave kubiske koordinater med x-y , y-z , z-x , som har deres eget sæt interessante egenskaber, men dem vil jeg ikke komme ind på her.

Men du kan argumentere for, at du ikke vil gemme 3 tal for koordinaterne, fordi du ikke ved, hvordan du gemmer kortet på den måde.

Aksiale koordinater

Et aksialt koordinatsystem, nogle gange kaldet et "trapezformet" koordinatsystem, er konstrueret ud fra to eller tre koordinater fra et kubisk koordinatsystem. Da vi har betingelsen x + y + z = 0, er den tredje koordinat ikke nødvendig. Aksiale koordinater er nyttige til lagring af kort og visning af koordinater for brugeren. Som med kubiske koordinater kan du bruge standardoperationerne til at addere, subtrahere, gange og dividere kartesiske koordinater.

Der er mange kubiske koordinatsystemer og mange aksiale. Jeg vil ikke dække alle kombinationer i denne guide. Jeg vælger to variable, q (kolonne) og r (række). I diagrammerne i denne artikel svarer q til x og r svarer til z, men denne overensstemmelse er vilkårlig, fordi du kan rotere og rotere diagrammerne for at opnå forskellige overensstemmelser.

Fordelen ved dette system i forhold til forskydningsgitter er, at algoritmerne er mere forståelige. Ulempen ved systemet er, at det er lidt mærkeligt at opbevare et rektangulært kort; se afsnittet om at gemme kort. Nogle algoritmer er endnu klarere i kubiske koordinater, men da vi har betingelsen x + y + z = 0, kan vi beregne den tredje implicitte koordinat og bruge den i disse algoritmer. I mine projekter kalder jeg akserne q, r, s, så betingelsen ser ud som q + r + s = 0, og jeg kan beregne s = -q - r, når det er nødvendigt.

Aksler

Offsetkoordinater er det første, de fleste mennesker tænker på, fordi de er de samme som de standard kartesiske koordinater, der bruges til gitter af kvadrater. Desværre skal den ene af de to akser køre mod kornet, og det ender med at komplicere tingene. Kube- og aksesystemer går langt og har enklere algoritmer, men kortlagring er lidt mere kompleks. Der er et andet system kaldet "alternerende" eller "dobbelt", men vi vil ikke overveje det her; nogle finder det nemmere at arbejde med end kubisk eller aksialt.


Offset koordinater, kubiske og aksiale

Akse er den retning, som den tilsvarende koordinat stiger i. Vinkelret på en akse er den linje, hvor koordinaten forbliver konstant. Gitterdiagrammerne ovenfor viser vinkelrette linjer.

Koordinere transformation

Det er sandsynligt, at du vil bruge aksiale eller forskudte koordinater i dit design, men mange algoritmer udtrykkes lettere i kubiske koordinater. Derfor skal vi være i stand til at konvertere koordinater mellem systemer.

Aksiale koordinater er tæt forbundet med kubiske koordinater, så konverteringen er enkel:

# konverter kubiske til aksiale koordinater q = x r = z # konverter aksiale til kubiske koordinater x = q z = r y = -x-z
I kode kan disse to funktioner skrives som følger:

Funktion cube_to_hex(h): # aksial var q = h.x var r = h.z return Hex(q, r) funktion hex_to_cube(h): # cubic var x = h.q var z = h.r var y = -x-z return Cube(x, y , z)
Offsetkoordinater er en del mere komplicerede:

Tilstødende sekskanter

Givet én sekskant, hvilke seks sekskanter er den ved siden af? Som du måske forventer, er svaret nemmest i kubiske koordinater, ret nemt i aksiale koordinater og lidt sværere i forskydningskoordinater. Du skal muligvis også beregne seks "diagonale" sekskanter.

Kubiske koordinater

Flytning af et mellemrum i hex-koordinater får en af ​​de tre kubiske koordinater til at ændre sig til +1 og den anden til -1 (summen skal forblive 0). Ved +1 kan tre mulige koordinater ændre sig, og ved -1 de resterende to. Dette giver os seks mulige ændringer. Hver svarer til en af ​​sekskantens retninger. Den enkleste og hurtigste måde er at forudberegne ændringerne og sætte dem ind i en kubisk koordinattabel Cube(dx, dy, dz) på kompileringstidspunktet:

Var retninger = [ Cube(+1, -1, 0), Cube(+1, 0, -1), Cube(0, +1, -1), Cube(-1, +1, 0), Cube( -1, 0, +1), Cube(0, -1, +1) ] funktion cube_direction(direction): returretningsfunktion cube_neighbor(hex, retning): return cube_add(hex, cube_direction(direction))

Aksiale koordinater

Som tidligere bruger vi det kubiske system til at begynde med. Lad os tage Cube(dx, dy, dz) tabellen og transformere den til Hex(dq, dr) tabellen:

Var retninger = [ Hex(+1, 0), Hex(+1, -1), Hex(0, -1), Hex(-1, 0), Hex(-1, +1), Hex(0, +1) ] funktion hex_direction(retning): returretningsfunktion funktion hex_neighbor(hex, retning): var dir = hex_direction(retning) return Hex(hex.q + dir.q, hex.r + dir.r)

Offset koordinater

I aksiale koordinater foretager vi ændringer afhængigt af, hvor vi er på nettet. Hvis vi er i en forskudt kolonne/række, så er reglen anderledes end tilfældet med en kolonne/række uden forskydning.

Som før opretter vi en tabel med tal, der skal tilføjes til col og row . Denne gang vil vi dog have to arrays, en til de ulige kolonner/rækker og den anden til de lige. Se på (1,1) i gitterkortets billede ovenfor og bemærk, hvordan farve og række ændres, når du bevæger dig i hver af de seks retninger. Lad os nu gentage processen for (2,2) . Tabellerne og koden vil være forskellige for hver af de fire typer forskydningsgitter her er den tilsvarende kode for hver gittertype.

Ulige-r
var retninger = [ [ 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) ] ] funktion offset_neighbor(hex, retning): var parity = hex.row & 1 var dir = directions return Hex(hex.col + dir.col, hex.row + dir.row)


Even-r
var retninger = [ [ 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) ] ] funktion offset_neighbor(hex, retning): var paritet = hex.række & 1 var dir = retninger retur Hex(hex.col + dir.col, hex.row + dir.row)


Gitter for lige (LIGE) og ulige (ulige) rækker

Ulige-q
var retninger = [ [ 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) ] ] funktion offset_neighbor(hex, retning): var paritet = hex.col & 1 var dir = retninger retur Hex(hex.col + dir.col, hex.row + dir.row)


Even-q
var retninger = [ [ 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) ] ] funktion offset_neighbor(hex, retning): var paritet = hex.col & 1 var dir = retninger retur Hex(hex.col + dir.col, hex.row + dir.row)


Gitter for lige (LIGE) og ulige (ulige) kolonner

Diagonaler

Bevægelse i "diagonalt" rum i hex-koordinater ændrer en af ​​de tre kubiske koordinater med ±2 og de to andre med ∓1 (summen skal forblive 0).

Var diagonaler = [ Terning(+2, -1, -1), Terning(+1, +1, -2), Terning(-1, +2, -1), Terning(-2, +1, +1 ), Terning(-1, -1, +2), Terning(+1, -2, +1) ] funktion cube_diagonal_neighbor(hex, retning): return cube_add(hex, diagonaler)
Som før kan vi konvertere disse koordinater til aksiale koordinater ved at droppe en af ​​de tre koordinater, eller konvertere dem til offsetkoordinater ved først at beregne resultaterne.


Afstande

Kubiske koordinater

I det kubiske koordinatsystem er hver sekskant en terning i tredimensionelt rum. Tilstødende sekskanter er anbragt 1 fra hinanden i hex-gitteret, men med 2 afstande fra hinanden i terninggitteret. Dette gør det nemt at beregne afstande. I et gitter af kvadrater er Manhattan-afstandene abs(dx) + abs(dy) . I et gitter af terninger er Manhattan-afstandene abs(dx) + abs(dy) + abs(dz) . Afstanden i det sekskantede gitter er lig med halvdelen af ​​dem:

Funktion cube_distance(a, b): return (abs(a.x - b.x) + abs(a.y - b.y) + abs(a.z - b.z)) / 2
Svaret til denne notation ville være at sige, at en af ​​de tre koordinater skal være summen af ​​de to andre, og så tage det som afstanden. Du kan vælge halveringsformen eller maksimumværdiformularen nedenfor, men de giver det samme resultat:

Funktion cube_distance(a, b): return max(abs(a.x - b.x), abs(a.y - b.y), abs(a.z - b.z))
På figuren er de maksimale værdier fremhævet i farver. Bemærk også, at hver farve repræsenterer en af ​​de seks "diagonale" retninger.

GIF


Aksiale koordinater

I det aksiale system udtrykkes den tredje koordinat implicit. Lad os konvertere fra aksial til kubisk for at beregne afstand:

Funktion hex_distance(a, b): var ac = hex_to_cube(a) var bc = hex_to_cube(b) return cube_distance(ac, bc)
Hvis compileren inline (inline) hex_to_cube og cube_distance i dit tilfælde, vil den generere kode som denne:

Funktion 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
Der er mange forskellige måder at skrive afstandene mellem sekskanter i aksiale koordinater, men uanset skrivemetoden afstanden mellem sekskanter i det aksiale system er udtrukket fra Manhattan-afstanden i det kubiske system. For eksempel opnås den beskrevne "forskellige forskel" ved at skrive a.q + a.r - b.q - b.r som a.q - b.q + a.r - b.r og bruge den maksimale værdiform i stedet for halveringsformen cube_distance . De er alle ens, hvis du ser sammenhængen med kubiske koordinater.

Offset koordinater

Som med aksiale koordinater konverterer vi offset-koordinaterne til kubiske koordinater og bruger derefter den kubiske afstand.

Funktion offset_distance(a, b): var ac = offset_to_cube(a) var bc = offset_to_cube(b) return cube_distance(ac, bc)
Vi vil bruge det samme mønster for mange af algoritmerne: konverter fra sekskanter til terninger, kør den kubiske version af algoritmen og konverter de kubiske resultater til sekskantkoordinater (aksiale eller forskudte koordinater).

Tegning af linjer

Hvordan tegner man en linje fra en sekskant til en anden? Jeg bruger lineær interpolation til at tegne linjer. Linjen er ensartet samplet ved N+1 punkter, og det beregnes, hvilke sekskanter disse prøver er i.

GIF


  1. Først beregner vi N, som vil være afstanden i sekskanter mellem endepunkterne.
  2. Vi prøver derefter jævnt N+1 punkter mellem punkt A og B. Ved hjælp af lineær interpolation bestemmer vi, at for værdier af i fra 0 til N inklusive dem, vil hvert punkt være A + (B - A) * 1,0/N * jeg . På figuren er disse kontrolpunkter vist med blåt. Resultatet er flydende kommakoordinater.
  3. Lad os konvertere hvert kontrolpunkt (float) tilbage til sekskanter (int). Algoritmen kaldes cube_round (se nedenfor).
Vi forbinder alt sammen for at tegne en linje fra A til B:

Funktion lerp(a, b, t): // for float return a + (b - a) * t funktion cube_lerp(a, b, t): // for hexagoner returner Cube(lerp(a.x, b.x, t), lerp(a.y, b.y, t), lerp(a.z, b.z, t)) funktion cube_linedraw(a, b): var N = cube_distance(a, b) var results = for hver 0 ≤ i ≤ N: results.append( cube_round(cube_lerp(a, b, 1.0/N * i))) returnerer resultater
Bemærkninger:

  • Der er tilfælde, hvor cube_lerp returnerer et punkt, der er nøjagtigt på kanten mellem to sekskanter. Derefter flytter cube_round den i en eller anden retning. Linjer ser bedre ud, hvis de flyttes i én retning. Dette kan gøres ved at tilføje en "epsilon"-sekskantet terning(1e-6, 1e-6, -2e-6) til et eller begge endepunkter, før loopet startes. Dette vil "skubbe" linjen i én retning, så den ikke rammer kanterne.
  • DDA-linjealgoritmen i kvadratiske gitter svarer til N til den maksimale afstand langs hver af akserne. Vi gør det samme i kubisk rum, hvilket svarer til afstand i et sekskantet gitter.
  • Cube_lerp-funktionen skal returnere en terning med flydekoordinater. Hvis du programmerer i et statisk skrevet sprog, vil du ikke være i stand til at bruge Cube-typen. Du kan definere en FloatCube-type i stedet, eller inline en funktion i din linjetegningskode, hvis du ikke ønsker at definere en anden type.
  • Du kan optimere koden ved inline cube_lerp og derefter beregne B.x-A.x , B.x-A.y og 1.0/N uden for løkken. Multiplikation kan konverteres til gentagen summering. Resultatet vil være noget som en DDA-linjealgoritme.
  • Jeg bruger aksiale eller kubiske koordinater til at tegne linjer, men hvis du vil arbejde med forskudte koordinater, så tjek .
  • Der er mange muligheder for at tegne linjer. Nogle gange er "overmaling" påkrævet. Jeg fik tilsendt kode til at tegne superdækkede linjer i sekskanter, men jeg har ikke undersøgt det endnu.

Bevægelig rækkevidde

Koordinatrækkevidde

Givet et sekskantcentrum og et område N, hvilke sekskanter er inden for N trin af det?

Vi kan gøre det omvendte fra afstandsformlen mellem sekskanter afstand = max(abs(dx), abs(dy), abs(dz)) . For at finde alle sekskanter inden for N har vi brug for max(abs(dx), abs(dy), abs(dz)) ≤ N . Det betyder, at alle tre værdier er nødvendige: abs(dx) ≤ N og abs(dy) ≤ N og abs(dz) ≤ N . Fjernes den absolutte værdi, får vi -N ≤ dx ≤ N og -N ≤ dy ≤ N og -N ≤ dz ≤ N . I kode vil dette være en indlejret løkke:

Var resultater = for hver -N ≤ dx ≤ N: for hver -N ≤ dy ≤ N: for hver -N ≤ dz ≤ N: hvis dx + dy + dz = 0: results.append(cube_add(center, Cube(dx) , dy, dz)))
Denne cyklus vil fungere, men den vil være ret ineffektiv. Af alle de dz-værdier, som vi går igennem, er der kun én, der rent faktisk opfylder terningbetingelsen dx + dy + dz = 0. I stedet vil vi direkte beregne værdien af ​​dz, der opfylder betingelsen:

Var resultater = for hver -N ≤ dx ≤ N: for hver max(-N, -dx-N) ≤ dy ≤ min(N, -dx+N): var dz = -dx-dy results.append(cube_add( center, terning(dx, dy, dz)))
Denne cyklus passerer kun langs de nødvendige koordinater. På figuren er hvert område et par linjer. Hver linje er en ulighed. Vi tager alle sekskanter, der opfylder de seks uligheder.

GIF


Overlappende områder

Hvis du har brug for at finde sekskanter, der er i flere områder, kan du skære områderne, før du genererer en liste over sekskanter.

Du kan nærme dig dette problem fra et algebra- eller geometrisynspunkt. Algebraisk er hver region udtrykt som ulighedsbetingelser af formen -N ≤ dx ≤ N , og vi skal finde skæringspunktet mellem disse betingelser. Geometrisk er hver region en terning i 3D-rum, og vi vil skære to terninger i 3D-rum for at opnå en terning i 3D-rum. Vi projicerer det derefter tilbage på x + y + z = 0-planet for at få sekskanter. Jeg vil løse dette problem algebraisk.

Først omskriver vi betingelsen -N ≤ dx ≤ N i den mere generelle form x min ≤ x ≤ x max , og tager x min = center.x - N og x max = center.x + N . Lad os gøre det samme for y og z, hvilket resulterer i den generelle form af koden fra det foregående afsnit:

Var resultater = for hver xmin ≤ x ≤ xmax: for hver max(ymin, -x-zmax) ≤ y ≤ min(ymax, -x-zmin): var z = -x-y resultater.append(Cube(x, y, z))
Skæringspunktet mellem to områder a ≤ x ≤ b og c ≤ x ≤ d er max(a, c) ≤ x ≤ min(b, d) . Da arealet af sekskanter er udtrykt som områder over x, y, z, kan vi skære hvert af områderne x, y, z separat og derefter bruge en indlejret sløjfe til at generere en liste over sekskanter i skæringspunktet. For et område af sekskanter tager vi x min = H.x - N og x max = H.x + N , på samme måde for y og z . For skæringspunktet mellem to sekskantede områder tager vi x min = max(H1.x - N, H2.x - N) og x max = min(H1.x + N, H2.x + N), på samme måde for y og z . Det samme mønster fungerer for skæringspunktet mellem tre eller flere områder.

GIF


Forhindringer

Hvis der er forhindringer, er den nemmeste måde at udfylde med en afstandsbegrænsning (bredde-først søgning). I figuren nedenfor begrænser vi os til fire træk. I koden er fringes[k] en række af alle sekskanter, der kan nås i k trin. Hver gang vi passerer gennem hovedsløjfen, udvider vi niveau k-1 med niveau k.

Funktion cube_reachable(start, move): var visited = set() føj start til visited var fringes = fringes.append() for hver 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

Drejninger

Givet en sekskantet vektor (forskellen mellem to sekskanter), skal vi muligvis rotere den, så den peger på den anden sekskant. Dette er nemt at gøre med kubiske koordinater, hvis du holder dig til en 1/6 cirkelrotation.

En 60° rotation til højre flytter hver koordinat en position til højre:

[ x, y, z] til [-z, -x, -y]
En 60° rotation til venstre flytter hver koordinat en position til venstre:

[ x, y, z] til [-y, -z, -x]



"Efter at have spillet" [i den originale artikel] med diagrammet, kan du se, at hver rotation er 60° ændringer tegner og fysisk "roterer" koordinaterne. Efter en 120° rotation bliver skiltene de samme igen. En 180° rotation skifter fortegn, men koordinaterne vender tilbage til deres oprindelige position.

Her er den komplette sekvens af rotation af position P omkring den centrale position C, hvilket resulterer i en ny position R:

  1. Konverter P- og C-positioner til kubiske koordinater.
  2. Beregning af en vektor ved at trække centrum fra: P_from_C = P - C = Cube(P.x - C.x, P.y - C.y, P.z - C.z) .
  3. Drej vektoren P_from_C som beskrevet ovenfor og tildel den endelige vektor betegnelsen R_from_C .
  4. Konvertering af vektoren tilbage til position ved at tilføje centrum: R = R_from_C + C = Cube(R_from_C.x + C.x, R_from_C.y + C.y, R_from_C.z + C.z) .
  5. Konverterer den kubiske position R tilbage til det ønskede koordinatsystem.
Der er flere stadier af transformation, men hver af dem er ret enkel. Det er muligt at forkorte nogle af disse trin ved at definere rotationen direkte i aksiale koordinater, men hex-vektorer fungerer ikke med offset-koordinater, og jeg ved ikke, hvordan man forkorter trinene for offset-koordinater. Se også diskussionen om stackexchange for andre måder at beregne rotation på.

Ringe

Enkel ring

For at finde ud af, om en given sekskant hører til en ring med en given radiusradius, skal du beregne afstanden fra denne sekskant til centrum, og finde ud af, om den er lig med radius. For at få en liste over alle sådanne sekskanter skal du tage radiustrin fra midten og derefter følge de roterede vektorer langs stien langs ringen.

Funktion cube_ring(center, radius): var results = # denne kode virker ikke for radius == 0; forstår du hvorfor? var cube = cube_add(center, cube_scale(cube_direction(4), radius)) for hver 0 ≤ i< 6: for each 0 ≤ j < radius: results.append(cube) cube = cube_neighbor(cube, i) return results
I denne kode starter terningen på en ring, vist med en stor pil fra midten til hjørnet af diagrammet. Jeg valgte vinkel 4 til at starte med, fordi den matcher den vej mine retningsnumre bevæger sig. Du skal muligvis have en anden startvinkel. På hvert trin af den indre løkke flytter terningen en sekskant rundt om ringen. Efter 6 * radiustrin ender han, hvor han startede.


Spiral ringe

Ved at gå gennem ringene i et spiralmønster kan vi udfylde de indre dele af ringene:

Funktion cube_spiral(center, radius): var resultater = for hver 1 ≤ k ≤ radius: resultater = resultater + cube_ring(center, k) returnerer resultater



Arealet af en stor sekskant er summen af ​​alle cirkler plus 1 for midten. Brug denne formel til at beregne areal.

At krydse sekskanter på denne måde kan også bruges til at beregne bevægelsesområdet (se ovenfor).

Synlighedsområde

Hvad er synligt fra en given position i en given afstand, og er ikke blokeret af forhindringer? Den enkleste måde at bestemme dette på er at tegne en linje til hver sekskant i et givet område. Hvis linjen ikke møder væggene, så ser du en sekskant. Flyt musen over sekskanterne [på diagrammet i den originale artikel] for at se, hvordan linjer tegnes til disse sekskanter og væggene, som linjerne møder.

Denne algoritme kan være langsom over store områder, men den er nem at implementere, så jeg anbefaler at starte med den.

GIF



Der er mange forskellige definitioner af synlighed. Vil du se midten af ​​en anden sekskant fra midten af ​​den originale? Vil du se en del af en anden sekskant fra midten af ​​den originale? Måske en del af en anden sekskant fra et hvilket som helst punkt i den oprindelige? Forhindringer, der hindrer dit udsyn, er mindre end en fuld sekskant? Scope er et vanskeligere og mere varieret koncept, end det ser ud ved første øjekast. Lad os starte med den enkleste algoritme, men forvent, at den helt sikkert vil beregne svaret korrekt i dit projekt. Der er endda tilfælde, hvor en simpel algoritme giver ulogiske resultater.

Jeg ønsker at udvide denne guide i fremtiden. jeg har