Hvordan konstruere en vanlig sekskant uten kompass. Hvordan bygge en vanlig sekskant

Sekskantgitter (sekskantede rutenett) brukes i noen spill, men de er ikke så enkle eller vanlige som rektangelnett. Jeg har samlet ressurser på hex-masker i nesten 20 år, og jeg skrev denne guiden til de mest elegante tilnærmingene, implementert i den enkleste koden. Denne artikkelen bruker mye guidene til Charles Fu og Clark Verbrugge. Jeg vil beskrive de forskjellige måtene å lage sekskantmasker på, deres relasjoner og de vanligste algoritmene. Mange deler av denne artikkelen er interaktive: ved å velge en rutenetttype endres de tilsvarende diagrammene, koden og tekstene. (Merk pr.: dette gjelder kun originalen, jeg råder deg til å studere den. I oversettelsen er all informasjon om originalen bevart, men uten interaktivitet.).

Kodeeksemplene i artikkelen er skrevet i pseudokode, slik at de er lettere å lese og forstå for å kunne skrive din egen implementering.

Geometri

Sekskanter er sekssidige polygoner. Vanlige sekskanter har alle sider (kanter) av samme lengde. Vi vil kun jobbe med vanlige sekskanter. Vanligvis bruker sekskantmasker horisontal (spiss topp) og vertikal (flat topp) orientering.


Sekskanter med flate (venstre) og skarpe (høyre) topper

Sekskanter har 6 ansikter. Hvert ansikt er felles for to sekskanter. Sekskanter har 6 hjørnepunkter. Hvert hjørnepunkt er felles for tre sekskanter. Du kan lese mer om sentre, kanter og hjørnepunkter i artikkelen min om maskedeler (firkanter, sekskanter og trekanter).

Vinkler

I en vanlig sekskant er de indre vinklene 120°. Det er seks "kiler", som hver er en likesidet trekant med indre vinkler på 60°. Hjørnepunkt jeg er plassert i en avstand på (60° * i) + 30°, størrelsesenheter fra sentrum. I koden:

Funksjon hex_corner(center, size, i): var angle_deg = 60 * i + 30 var angle_rad = PI / 180 * angle_deg returpunkt(center.x + size * cos(angle_rad), center.y + size * sin(angle_rad) )
For å fylle en sekskant, må du få toppunktene til polygonen fra hex_corner(…, 0) til hex_corner(…, 5) . For å tegne omrisset av sekskanten, må du bruke disse toppunktene og deretter tegne linjen igjen i hex_corner(..., 0) .

Forskjellen mellom de to orienteringene er at x og y byttes, noe som resulterer i en endring i vinkler: flattoppsekskanter har vinkler på 0°, 60°, 120°, 180°, 240°, 300° og spiss-topp sekskanter har vinkler på 30°, 90°, 150°, 210°, 270°, 330°.


Hjørner av sekskanter med flate og skarpe topper

Størrelse og plassering

Nå ønsker vi å plassere flere sekskanter sammen. I horisontal orientering er høyden på sekskanten høyde = størrelse * 2 . Den vertikale avstanden mellom tilstøtende sekskanter er vert = høyde * 3/4

Heksagon bredde bredde = sqrt(3)/2 * høyde . Den horisontale avstanden mellom tilstøtende sekskanter er horiz = bredde.

Noen spill bruker pikselkunst for sekskanter, som ikke akkurat matcher de vanlige sekskantene. Vinkel- og plasseringsformlene beskrevet i denne delen vil ikke samsvare med dimensjonene til slike sekskanter. Resten av artikkelen som beskriver hexagon mesh-algoritmene gjelder selv om hexagonene er litt strukket eller klemt.



Koordinatsystemer

La oss begynne å sette sammen sekskantene til et rutenett. Når det gjelder rutenett, er det bare én åpenbar måte å montere på. For sekskanter er det mange tilnærminger. Jeg anbefaler å bruke kubiske koordinater som din primære representasjon. Aksiale koordinater eller offsetkoordinater bør brukes til å lagre kart og vise koordinater til brukeren.

Offset koordinater

Den vanligste tilnærmingen er å forskyve hver påfølgende kolonne eller rad. Kolonner er betegnet med col eller q. Rader er angitt med rad eller r . Du kan forskyve odde eller partall kolonner/rader, så horisontale og vertikale sekskanter har to alternativer.


Horisontalt arrangement "odd-r"


Horisontalt arrangement "jevn-r"


Vertikal "odd-q"-arrangement


Vertikalt arrangement "even-q"

Kubiske koordinater

En annen måte å se på sekskantede rutenett er å se dem som tre hovedakser, ikke to, som i rutenett av firkanter. De viser elegant symmetri.

La oss ta et rutenett av kuber og la oss kutte det ut diagonalplan ved x + y + z = 0. Dette er en merkelig idé, men det vil hjelpe oss med å forenkle hexagon mesh-algoritmene. Spesielt vil vi kunne bruke standardoperasjoner fra kartesiske koordinater: summere og subtrahere koordinater, multiplisere og dividere med en skalar mengde, samt avstander.

Legg merke til de tre hovedaksene på rutenettet av kuber og deres forhold til de seks diagonal retningene til det sekskantede rutenettet. De diagonale aksene til rutenettet tilsvarer hovedretningen til det sekskantede rutenettet.


Sekskanter


kuber

Siden vi allerede har algoritmer for kvadrat- og kubemasker, lar bruk av kubiske koordinater oss tilpasse disse algoritmene til sekskantmasker. Jeg vil bruke dette systemet for de fleste av artikkelens algoritmer. For å bruke algoritmene med et annet koordinatsystem, konverterer jeg de kubiske koordinatene, kjører algoritmen og konverterer dem deretter tilbake.

Lær hvordan kubiske koordinater fungerer for et sekskantnett. Når du velger sekskanter, utheves kubiske koordinater som tilsvarer de tre aksene.

  1. Hver retning av kubenettet tilsvarer linjer på et rutenett av sekskanter. Prøv å velge en sekskant med z lik 0, 1, 2, 3 for å se sammenhengen. Linjen er markert med blått. Prøv det samme for x (grønn) og y (lilla).
  2. Hver retning av sekskantnettet er en kombinasjon av to retninger av kubenettet. For eksempel ligger "nord" av et sekskantnett mellom +y og -z, så hvert trinn med "nord" øker y med 1 og reduserer z med 1.
Kubiske koordinater er et rimelig valg for et sekskantet rutenett koordinatsystem. Betingelsen er x + y + z = 0, så den må bevares i algoritmene. Betingelsen sikrer også at det alltid vil være en kanonisk koordinat for hver sekskant.

Det finnes mange forskjellige koordinatsystemer for kuber og sekskanter. I noen av dem er tilstanden forskjellig fra x + y + z = 0. Jeg viste bare ett av mange systemer. Du kan også lage kubiske koordinater med x-y , y-z , z-x , som har sitt eget sett med interessante egenskaper, men jeg skal ikke gå inn på dem her.

Men du kan argumentere for at du ikke vil lagre 3 tall for koordinatene fordi du ikke vet hvordan du skal lagre kartet på den måten.

Aksiale koordinater

Et aksialt koordinatsystem, noen ganger kalt et "trapesformet" koordinatsystem, er konstruert fra to eller tre koordinater fra et kubisk koordinatsystem. Siden vi har betingelsen x + y + z = 0, er den tredje koordinaten ikke nødvendig. Aksiale koordinater er nyttige for å lagre kart og vise koordinater for brukeren. Som med kubiske koordinater, kan du bruke standardoperasjonene for å addere, subtrahere, multiplisere og dele kartesiske koordinater.

Det er mange kubiske koordinatsystemer og mange aksiale. Jeg vil ikke dekke hver kombinasjon i denne veiledningen. Jeg velger to variabler, q (kolonne) og r (rad). I diagrammene i denne artikkelen tilsvarer q x og r tilsvarer z, men denne korrespondansen er vilkårlig fordi du kan rotere og rotere diagrammene for å få forskjellige samsvar.

Fordelen med dette systemet fremfor forskyvningsnett er at algoritmene er mer forståelige. Ulempen med systemet er at det er litt rart å lagre et rektangulært kort; se avsnittet om lagring av kart. Noen algoritmer er enda tydeligere i kubiske koordinater, men siden vi har betingelsen x + y + z = 0, kan vi beregne den tredje implisitte koordinaten og bruke den i disse algoritmene. I mine prosjekter kaller jeg aksene q, r, s, så betingelsen ser ut som q + r + s = 0, og jeg kan beregne s = -q - r når det trengs.

Aksler

Offsetkoordinater er det første folk flest tenker på fordi de er de samme som standard kartesiske koordinater som brukes for rutenett av kvadrater. Dessverre må en av de to aksene løpe mot kornet, og dette ender opp med å komplisere ting. Kube- og aksesystemer strekker seg langt og har enklere algoritmer, men kortlagring er litt mer kompleks. Det er et annet system kalt "alternerende" eller "dobbelt", men vi vil ikke vurdere det her; noen synes det er lettere å jobbe med enn kubikk eller aksialt.


Offset koordinater, kubikk og aksial

Akser er retningen som den tilsvarende koordinaten øker i. Vinkelrett på en akse er linjen der koordinaten forblir konstant. Rutenettdiagrammene ovenfor viser vinkelrette linjer.

Koordinere transformasjon

Det er sannsynlig at du vil bruke aksiale eller offsetkoordinater i designet, men mange algoritmer uttrykkes lettere i kubiske koordinater. Derfor må vi kunne konvertere koordinater mellom systemer.

Aksiale koordinater er nært knyttet til 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 funksjonene skrives som følger:

Funksjon cube_to_hex(h): # aksial var q = h.x var r = h.z return Hex(q, r) funksjon hex_to_cube(h): # cubic var x = h.q var z = h.r var y = -x-z return Cube(x, y , z)
Offsetkoordinater er litt mer kompliserte:

Tilstøtende sekskanter

Gitt én sekskant, hvilke seks sekskanter er den ved siden av? Som du kanskje forventer, er svaret enklest i kubiske koordinater, ganske enkelt i aksiale koordinater, og litt vanskeligere i forskyvningskoordinater. Du må kanskje også beregne seks "diagonale" sekskanter.

Kubiske koordinater

Flytting av ett mellomrom i heksadesimale koordinater fører til at en av de tre kubiske koordinatene endres til +1 og den andre til -1 (summen må forbli 0). Ved +1 kan tre mulige koordinater endres, og ved -1 kan de resterende to. Dette gir oss seks mulige endringer. Hver tilsvarer en av retningene til sekskanten. Den enkleste og raskeste måten er å forhåndsberegne endringene og sette dem inn i en kubisk koordinattabell Cube(dx, dy, dz) ved kompilering:

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) ] funksjon kube_retning(retning): returretningsfunksjon kube_neighbor(hex, retning): return cube_add(hex, cube_direction(retning))

Aksiale koordinater

Som før bruker vi kubikksystemet til å begynne med. La oss ta 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) ] funksjon hex_direction(retning): returretningsfunksjon hex_neighbor(hex, retning): var dir = hex_direction(retning) return Hex(hex.q + dir.q, hex.r + dir.r)

Offset koordinater

I aksiale koordinater gjør vi endringer avhengig av hvor vi er på rutenettet. Hvis vi er i en forskyvningskolonne/rad, er regelen forskjellig fra tilfellet med en kolonne/rad uten forskyvning.

Som før lager vi en tabell med tall som må legges til col og rad . Denne gangen vil vi imidlertid ha to matriser, en for de odde kolonnene/radene og den andre for partallene. Se på (1,1) i rutenettkartbildet ovenfor og legg merke til hvordan farge og rad endres når du beveger deg i hver av de seks retningene. La oss nå gjenta prosessen for (2,2) . Tabellene og koden vil være forskjellig for hver av de fire typene forskyvningsgitter her er den tilsvarende koden for hver rutenetttype.

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


Rutenett for partall (ELN) og oddetall (ODD) rader

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


Rutenett for partall (ELN) og oddetall (ODD) kolonner

Diagonaler

Å bevege seg i "diagonalt" rom i heksadesimale koordinater endrer en av de tre kubiske koordinatene med ±2 og de to andre med ∓1 (summen må forbli 0).

Var diagonaler = [ Cube(+2, -1, -1), Cube(+1, +1, -2), Cube(-1, +2, -1), Cube(-2, +1, +1) ), Cube(-1, -1, +2), Cube(+1, -2, +1) ] funksjon cube_diagonal_neighbor(hex, direction): return cube_add(hex, diagonals)
Som før kan vi konvertere disse koordinatene til aksiale koordinater ved å slippe en av de tre koordinatene, eller konvertere dem til offsetkoordinater ved først å beregne resultatene.


Avstander

Kubiske koordinater

I det kubiske koordinatsystemet er hver sekskant en kube i tredimensjonalt rom. Tilstøtende sekskanter er plassert med 1 avstand fra hverandre i sekskantgitteret, men med to avstander fra hverandre i kubenettet. Dette gjør det enkelt å beregne avstander. I et rutenett av firkanter er Manhattan-avstandene abs(dx) + abs(dy) . I et rutenett av kuber er Manhattan-avstandene abs(dx) + abs(dy) + abs(dz) . Avstanden i det sekskantede rutenettet er lik halvparten av dem:

Funksjon cube_distance(a, b): retur (abs(a.x - b.x) + abs(a.y - b.y) + abs(a.z - b.z)) / 2
Ekvivalenten til denne notasjonen vil være å si at en av de tre koordinatene må være summen av de to andre, og så ta det som avstanden. Du kan velge halveringsskjemaet eller maksimumsverdiskjemaet nedenfor, men de gir samme resultat:

Funksjon cube_distance(a, b): return max(abs(a.x - b.x), abs(a.y - b.y), abs(a.z - b.z))
På figuren er maksimalverdiene uthevet i farger. Merk også at hver farge representerer en av de seks "diagonale" retningene.

GIF


Aksiale koordinater

I det aksiale systemet uttrykkes den tredje koordinaten implisitt. La oss konvertere fra aksial til kubikk for å beregne avstand:

Funksjon hex_distance(a, b): var ac = hex_to_cube(a) var bc = hex_to_cube(b) return cube_distance(ac, bc)
Hvis kompilatoren inline (inline) hex_to_cube og cube_distance i ditt tilfelle, vil den generere kode som dette:

Funksjon hex_distance(a, b): retur (abs(a.q - b.q) + abs(a.q + a.r - b.q - b.r) + abs(a.r - b.r)) / 2
Det er mange forskjellige måter å skrive avstandene mellom sekskanter i aksiale koordinater, men uansett hvordan du skriver avstanden mellom sekskanter i det aksiale systemet trekkes ut fra Manhattan-avstanden i det kubiske systemet. For eksempel oppnås den beskrevne "forskjellen av forskjeller" ved å skrive a.q + a.r - b.q - b.r som a.q - b.q + a.r - b.r og bruke maksimalverdiformen i stedet for halveringsformen cube_distance . De er alle like hvis du ser sammenhengen med kubiske koordinater.

Offset koordinater

Som med aksiale koordinater, konverterer vi offsetkoordinatene til kubiske koordinater og bruker deretter kubikkavstanden.

Funksjon offset_distance(a, b): var ac = offset_to_cube(a) var bc = offset_to_cube(b) return cube_distance(ac, bc)
Vi vil bruke det samme mønsteret for mange av algoritmene: konverter fra sekskanter til kuber, kjør den kubiske versjonen av algoritmen og konverter de kubiske resultatene til sekskantkoordinater (aksiale eller forskyvne koordinater).

Å tegne linjer

Hvordan tegne en linje fra en sekskant til en annen? Jeg bruker lineær interpolasjon for å tegne linjer. Linjen er jevnt samplet ved N+1 punkter og det beregnes hvilke sekskanter disse prøvene er i.

GIF


  1. Først beregner vi N, som vil være avstanden i sekskanter mellom endepunktene.
  2. Deretter prøver vi jevnt N+1 punkter mellom punktene A og B. Ved hjelp av lineær interpolasjon bestemmer vi at for verdier av i fra 0 til N, inkludert dem, vil hvert punkt være A + (B - A) * 1.0/N * jeg. På figuren er disse kontrollpunktene vist i blått. Resultatet er flyttallkoordinater.
  3. La oss konvertere hvert kontrollpunkt (float) tilbake til sekskanter (int). Algoritmen kalles cube_round (se nedenfor).
Sett alt sammen for å tegne en linje fra A til B:

Funksjon lerp(a, b, t): // for float return a + (b - a) * t funksjon cube_lerp(a, b, t): // for hexagons return Cube(lerp(a.x, b.x, t), lerp(a.y, b.y, t), lerp(a.z, b.z, t)) funksjon 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
Merknader:

  • Det er tilfeller der cube_lerp returnerer et punkt som er nøyaktig på kanten mellom to sekskanter. Deretter flytter cube_round den i en eller annen retning. Linjer ser bedre ut hvis de flyttes i én retning. Dette kan gjøres ved å legge til en "epsilon"-sekskantet kube(1e-6, 1e-6, -2e-6) til ett eller begge endepunktene før du starter loopen. Dette vil "dytte" linjen i én retning slik at den ikke treffer kantene.
  • DDA-linjealgoritmen i firkantede rutenett tilsvarer N til maksimal avstand langs hver av aksene. Vi gjør det samme i kubikkrom, som ligner på avstand i et sekskantnett.
  • cube_lerp-funksjonen skal returnere en kube med flytekoordinater. Hvis du programmerer i et statisk skrevet språk, vil du ikke kunne bruke kubetypen. Du kan definere en FloatCube-type i stedet, eller sette inn en funksjon i linjetegningskoden hvis du ikke vil definere en annen type.
  • Du kan optimalisere koden ved å inline cube_lerp og deretter beregne B.x-A.x , B.x-A.y og 1.0/N utenfor loopen. Multiplikasjon kan konverteres til gjentatt summering. Resultatet vil være noe som en DDA-linjealgoritme.
  • Jeg bruker aksiale eller kubekoordinater for å tegne linjer, men hvis du vil jobbe med offsetkoordinater, sjekk ut .
  • Det er mange alternativer for å tegne linjer. Noen ganger er "overmaling" nødvendig. Jeg fikk tilsendt kode for å tegne superdekkede linjer i sekskanter, men jeg har ikke sett nærmere på det ennå.

Bevegelig rekkevidde

Koordinatområde

Gitt et sekskantsenter og et område N, hvilke sekskanter er innenfor N trinn fra det?

Vi kan gjøre det inverse fra formelen for avstanden mellom sekskanter avstand = max(abs(dx), abs(dy), abs(dz)) . For å finne alle sekskanter innenfor N trenger vi max(abs(dx), abs(dy), abs(dz)) ≤ N . Dette betyr at alle tre verdiene er nødvendige: abs(dx) ≤ N og abs(dy) ≤ N og abs(dz) ≤ N . Fjerner vi den absolutte verdien, får vi -N ≤ dx ≤ N og -N ≤ dy ≤ N og -N ≤ dz ≤ N . I kode vil dette være en nestet løkke:

Var resultater = for hver -N ≤ dx ≤ N: for hver -N ≤ dy ≤ N: for hver -N ≤ dz ≤ N: hvis dx + dy + dz = 0: resultater.append(cube_add(center, Cube(dx) , dy, dz)))
Denne syklusen vil fungere, men den vil være ganske ineffektiv. Av alle dz-verdiene som vi går gjennom, er det bare én som faktisk tilfredsstiller kubebetingelsen dx + dy + dz = 0. I stedet vil vi direkte beregne verdien av dz som tilfredsstiller betingelsen:

Var resultater = for hver -N ≤ dx ≤ N: for hver maks(-N, -dx-N) ≤ dy ≤ min(N, -dx+N): var dz = -dx-dy results.append(cube_add( center, Cube(dx, dy, dz)))
Denne syklusen går bare langs de nødvendige koordinatene. På figuren er hvert område et par linjer. Hver linje er en ulikhet. Vi tar alle sekskanter som tilfredsstiller de seks ulikhetene.

GIF


Overlappende områder

Hvis du trenger å finne sekskanter som er i flere områder, kan du krysse områdene før du genererer en liste over sekskanter.

Du kan nærme deg dette problemet fra et synspunkt av algebra eller geometri. Algebraisk uttrykkes hver region som ulikhetsbetingelser av formen -N ≤ dx ≤ N, og vi må finne skjæringspunktet mellom disse forholdene. Geometrisk er hver region en kube i 3D-rom, og vi vil skjære to kuber i 3D-rom for å få en kuboid i 3D-rom. Vi projiserer det så tilbake på x + y + z = 0-planet for å få sekskanter. Jeg vil løse dette problemet algebraisk.

Først omskriver vi betingelsen -N ≤ dx ≤ N i den mer generelle formen x min ≤ x ≤ x max , og tar x min = center.x - N og x max = center.x + N . La oss gjøre det samme for y og z, noe som resulterer i den generelle formen for koden fra forrige seksjon:

Var-resultater = for hver xmin ≤ x ≤ xmaks: for hver maks(ymin, -x-zmaks) ≤ y ≤ min(ymaks, -x-zmin): var z = -x-y resultater.append(Cube(x, y, z))
Skjæringspunktet mellom to områder a ≤ x ≤ b og c ≤ x ≤ d er max(a, c) ≤ x ≤ min(b, d) . Siden arealet av sekskanter er uttrykt som områder over x, y, z, kan vi skjære hvert av områdene x, y, z separat og deretter bruke en nestet sløyfe for å generere en liste over sekskanter i skjæringspunktet. For ett område med sekskanter tar vi x min = H.x - N og x max = H.x + N , på samme måte for y og z . For skjæringspunktet mellom to sekskantede områder tar vi x min = maks(H1.x - N, H2.x - N) og x max = min(H1.x + N, H2.x + N), på samme måte for y og z . Det samme mønsteret fungerer for skjæringspunktet mellom tre eller flere områder.

GIF


Hindringer

Hvis det er hindringer, er den enkleste måten å fylle med en avstandsbegrensning (bredde-først søk). I figuren nedenfor begrenser vi oss til fire trekk. I koden er fringes[k] en rekke av alle sekskanter som kan nås i k trinn. Hver gang vi passerer gjennom hovedsløyfen, utvider vi nivå k-1 med nivå k.

Funksjon cube_reachable(start, movement): var visited = set() legg til start til besøkt 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

Svinger

Gitt en sekskantvektor (forskjellen mellom to sekskanter), må vi kanskje rotere den slik at den peker mot en annen sekskant. Dette er enkelt å gjøre med kubiske koordinater hvis du holder deg til en 1/6 sirkelrotasjon.

En 60° rotasjon til høyre flytter hver koordinat én posisjon til høyre:

[ x, y, z] til [-z, -x, -y]
En 60° rotasjon til venstre flytter hver koordinat én posisjon til venstre:

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



"Etter å ha spilt" [i den originale artikkelen] med diagrammet, vil du legge merke til at hver rotasjon er 60° endringer tegner og fysisk "roterer" koordinatene. Etter en 120° rotasjon blir skiltene de samme igjen. En 180° rotasjon endrer tegn, men koordinatene går tilbake til sin opprinnelige posisjon.

Her er den komplette sekvensen av rotasjon av posisjon P rundt den sentrale posisjonen C, noe som resulterer i en ny posisjon R:

  1. Konverter P- og C-posisjoner til kubiske koordinater.
  2. Beregne en vektor ved å trekke fra sentrum: P_from_C = P - C = Cube(P.x - C.x, P.y - C.y, P.z - C.z) .
  3. Roter vektoren P_from_C som beskrevet ovenfor og tilordne den endelige vektoren betegnelsen R_from_C .
  4. Konverter vektoren tilbake til posisjon ved å legge til midten: 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 kubikkposisjonen R tilbake til ønsket koordinatsystem.
Det er flere stadier av transformasjon, men hver av dem er ganske enkel. Det er mulig å forkorte noen av disse trinnene ved å definere rotasjonen direkte i aksiale koordinater, men hex-vektorer fungerer ikke med offset-koordinater, og jeg vet ikke hvordan jeg skal forkorte trinnene for offset-koordinater. Se også diskusjonen om stackexchange for andre måter å beregne rotasjon på.

Ringer

Enkel ring

For å finne ut om en gitt sekskant tilhører en ring med en gitt radiusradius, må du beregne avstanden fra denne sekskanten til sentrum, og finne ut om den er lik radius. For å få en liste over alle slike sekskanter, må du ta radiustrinn fra midten, og deretter følge de roterte vektorene langs banen langs ringen.

Funksjon cube_ring(center, radius): var results = # denne koden fungerer ikke for radius == 0; forstår du hvorfor?< 6: for each 0 ≤ j < radius: results.append(cube) cube = cube_neighbor(cube, i) return results
var cube = cube_add(center, cube_scale(cube_direction(4), radius)) for hver 0 ≤ i


I denne koden starter kuben på en ring, vist med en stor pil fra midten til hjørnet av diagrammet. Jeg valgte vinkel 4 til å begynne med fordi den samsvarer med banen mine retningsnummer beveger seg. Du trenger kanskje en annen startvinkel. På hvert trinn i den indre løkken beveger kuben en sekskant rundt ringen. Etter 6 * radiussteg ender han opp der han startet.

Spiralringer

Ved å gå gjennom ringene i et spiralmønster kan vi fylle ut de indre delene av ringene:



Funksjon kube_spiral(senter, radius): var resultater = for hver 1 ≤ k ≤ radius: resultater = resultater + kube_ring(senter, k) gir resultater

Arealet til en stor sekskant er summen av alle sirklene pluss 1 for sentrum. Bruk denne formelen til å beregne arealet.

Å krysse sekskanter på denne måten kan også brukes til å beregne bevegelsesområdet (se ovenfor).

Omfang

Hva er synlig fra en gitt posisjon i en gitt avstand, og er ikke blokkert av hindringer? Den enkleste måten å bestemme dette på er å tegne en linje til hver sekskant i et gitt område. Hvis linjen ikke møter veggene, ser du en sekskant. Beveg musen over sekskantene [på diagrammet i den originale artikkelen] for å se hvordan linjene er tegnet til disse sekskantene og veggene som linjene møter.

GIF



Denne algoritmen kan være treg over store områder, men den er enkel å implementere, så jeg anbefaler å begynne med den.

Det er mange forskjellige definisjoner av synlighet. Vil du se midten av en annen sekskant fra midten av den originale? Vil du se en del av en annen sekskant fra midten av den originale? Kanskje en del av en annen sekskant fra et hvilket som helst punkt av den første? Hindringer som hindrer sikten din er mindre enn en hel sekskant? Scope er et vanskeligere og mer variert konsept enn det ser ut ved første øyekast. La oss starte med den enkleste algoritmen, men forvent at den definitivt vil beregne svaret riktig i prosjektet ditt. Det er til og med tilfeller når en enkel algoritme gir ulogiske resultater.

Jeg ønsker å utvide denne veiledningen i fremtiden. jeg har Konstruksjonen av en sekskant er basert på det faktum at siden er lik radiusen til den omskrevne sirkelen. Derfor, for å konstruere den, er det nok å dele sirkelen i seks like deler og koble de funnet punktene til hverandre (fig. 60, a).

En vanlig sekskant kan bygges med en rett kant og en 30X60° firkant. For å utføre denne konstruksjonen tar vi den horisontale diameteren til sirkelen som halveringslinjen for vinkel 1 og 4 (fig. 60, b), konstruerer sidene 1 -6, 4-3, 4-5 og 7-2, hvoretter vi tegner side 5-6 og 3-2.

Konstruere en likesidet trekant innskrevet i en sirkel. Toppene til en slik trekant kan konstrueres ved hjelp av et kompass og en firkant med vinkler på 30 og 60° eller bare ett kompass.

La oss vurdere to måter å konstruere en likesidet trekant innskrevet i en sirkel.

Første vei(Fig. 61,a) er basert på det faktum at alle tre vinklene i trekanten 7, 2, 3 inneholder 60°, og den vertikale linjen trukket gjennom punkt 7 er både høyden og halveringslinjen til vinkel 1. Siden vinkelen er 0-1- 2 er lik 30°, så for å finne siden

1-2, er det nok å konstruere en vinkel på 30° fra punkt 1 og side 0-1. For å gjøre dette, installer tverrstangen og firkanten som vist på figuren, tegn linje 1-2, som vil være en av sidene av ønsket trekant. For å konstruere side 2-3, sett tverrstangen i posisjonen vist med de stiplede linjene, og tegn en rett linje gjennom punkt 2, som vil bestemme trekantens tredje toppunkt.

Andre vei er basert på det faktum at hvis du bygger en regulær sekskant innskrevet i en sirkel og deretter kobler dens toppunkter gjennom en, vil du få en likesidet trekant.

For å konstruere en trekant (fig. 61, b), merk toppunktet 1 på diameteren og tegn en diametral linje 1-4. Deretter, fra punkt 4 med en radius lik D/2, beskriver vi en bue til den skjærer sirkelen i punktene 3 og 2. De resulterende punktene vil være de to andre toppunktene i den ønskede trekanten.

Konstruere en firkant innskrevet i en sirkel. Denne konstruksjonen kan gjøres ved hjelp av en firkant og et kompass.

Den første metoden er basert på det faktum at diagonalene til firkanten skjærer i midten av den omskrevne sirkelen og skråner til dens akser i en vinkel på 45°. Basert på dette installerer vi tverrstangen og firkanten med vinkler på 45° som vist i fig. 62, a, og merk punktene 1 og 3. Deretter trekker vi gjennom disse punktene de horisontale sidene av firkanten 4-1 og 3-2 ved hjelp av en tverrstang. Deretter, ved hjelp av en rett kant, tegner vi de vertikale sidene av firkanten 1-2 og 4-3 langs benet på firkanten.

Den andre metoden er basert på det faktum at hjørnene til kvadratet halverer sirkelbuene som er innelukket mellom endene av diameteren (fig. 62, b). Vi markerer punktene A, B og C ved endene av to innbyrdes vinkelrette diametre og fra dem med en radius y beskriver vi buer til de skjærer hverandre.

Deretter tegner vi gjennom skjæringspunktene til buene hjelpelinjer, merket på figuren med heltrukne linjer. Punktene i deres skjæringspunkt med sirkelen vil bestemme hjørnene 1 og 3; 4 og 2. Vi kobler toppunktene til ønsket firkant oppnådd på denne måten i serie med hverandre.

Konstruksjon av en vanlig femkant innskrevet i en sirkel.

For å passe en vanlig femkant inn i en sirkel (fig. 63), lager vi følgende konstruksjoner.

Vi markerer punkt 1 på sirkelen og tar den som en av toppunktene i femkanten. Vi deler segmentet AO i to. For å gjøre dette beskriver vi en bue fra punkt A med radius AO til den skjærer sirkelen i punktene M og B. Ved å koble disse punktene med en rett linje får vi punkt K, som vi så kobler til punkt 1. Med en radius lik segmentet A7, beskriver vi en bue fra punkt K til den skjærer den diametrale linjen AO i punkt H. Ved å koble punkt 1 med punkt H får vi siden av femkanten. Deretter, ved å bruke en kompassløsning lik segmentet 1H, som beskriver en bue fra toppunkt 1 til skjæringspunktet med sirkelen, finner vi toppunkt 2 og 5. Etter å ha laget hakk fra toppunkt 2 og 5 med samme kompassløsning, får vi de resterende toppunkt 3 og 4. Vi kobler de funnet punktene sekvensielt med hverandre.

Konstruere en vanlig femkant langs en gitt side.

For å konstruere en regulær femkant langs en gitt side (fig. 64), deler vi segmentet AB i seks like deler. Fra punktene A og B med radius AB beskriver vi buer, hvis skjæringspunkt vil gi punktet K. Gjennom dette punktet og divisjon 3 på linje AB tegner vi en vertikal linje.

Vi får punkt 1-toppunktet til femkanten. Deretter, med en radius lik AB, fra punkt 1 beskriver vi en bue til den skjærer med buene som tidligere er tegnet fra punktene A og B. Skjæringspunktene til buene bestemmer femkantpunktene 2 og 5. Vi kobler de funnet toppunktene i serier med hverandre.

Konstruksjon av en vanlig sjukant innskrevet i en sirkel.

La en sirkel med diameter D gis; du må passe en vanlig sekskant inn i den (fig. 65). Del den vertikale diameteren til sirkelen i syv like deler. Fra punkt 7 med en radius lik diameteren til sirkel D beskriver vi en bue til den skjærer fortsettelsen av den horisontale diameteren i punktet F. Vi kaller punktet F polygonens pol. Ved å ta punkt VII som en av toppunktene til heptagonen, trekker vi stråler fra polen F gjennom jevne inndelinger av den vertikale diameteren, hvis skjæringspunkt med sirkelen vil bestemme toppunktene VI, V og IV til heptagonen. For å få toppunkter / - // - /// fra punktene IV, V og VI, tegn horisontale linjer til de krysser sirkelen. Vi kobler de funnet toppunktene sekvensielt til hverandre. En heptagon kan konstrueres ved å trekke stråler fra F-polen og gjennom odde inndelinger av den vertikale diameteren.

Metoden ovenfor er egnet for å konstruere vanlige polygoner med et hvilket som helst antall sider.

Delingen av en sirkel i et hvilket som helst antall like deler kan også gjøres ved å bruke dataene i tabellen. 2, som gir koeffisienter som gjør det mulig å bestemme dimensjonene til sidene til vanlige innskrevne polygoner.

La oss lære å tegne et sekskantet prisme i forskjellige posisjoner.

Studer forskjellige måter å konstruere en vanlig sekskant på, lag tegninger av sekskanter, kontroller riktigheten av konstruksjonen deres. Konstruer sekskantede prismer basert på sekskantene.

Tenk på det sekskantede prismet i fig. 3.52 og dens ortogonale projeksjoner i fig. 3,53. Ved bunnen av et sekskantet prisme (sekskant) er vanlige sekskanter, sideflatene er identiske rektangler. For å kunne avbilde en sekskant korrekt i perspektiv, må du først lære hvordan du kan avbilde basen riktig i perspektiv (fig. 3.54). I sekskanten i fig. 3,55 hjørner er angitt med tall fra én til seks. Hvis du kobler punktene 1 og 3, 4 og 6 med vertikale rette linjer, vil du legge merke til at disse rette linjene, sammen med midtpunktet i sirkelen, deler diameteren 5 - 2 i fire like segmenter (disse segmentene er indikert med buer ). De motsatte sidene av en sekskant er parallelle med hverandre og til en linje som går gjennom midten og forbinder to toppunkter (for eksempel er sidene 6 - 1 og 4 - 3 parallelle med linje 5 - 2). Disse observasjonene vil hjelpe deg med å konstruere en sekskant i perspektiv, samt kontrollere riktigheten av denne konstruksjonen. Det er to måter å konstruere en regulær sekskant fra en representasjon: basert på en omkrets og basert på en firkant.

Basert på en omskrevet sirkel. Se på fig. 3,56. Alle toppunktene til en regulær sekskant tilhører en omskreven sirkel hvis radius er lik siden av sekskanten.


Horisontal sekskant. Tegn en horisontal ellipse med vilkårlig åpning, dvs. en omskrevet sirkel i perspektiv. Nå må du finne seks punkter på den, som er hjørnene til sekskanten. Tegn en hvilken som helst diameter av en gitt sirkel gjennom midten (fig. 3.57). Ytterpunktene til diameteren - 5 og 2, som ligger på ellipsen, er hjørnene til sekskanten. For å finne de gjenværende toppunktene, er det nødvendig å dele denne diameteren i fire like segmenter. Diameteren er allerede delt av sirkelens midtpunkt i to radier, det gjenstår bare å dele hver radius i to. I en perspektivtegning trekker alle fire segmentene seg jevnt sammen når de beveger seg bort fra betrakteren (fig. 3.58). Tegn nå gjennom midtpunktene til radiene - punktene A og B - rette linjer vinkelrett på rett linje 5 - 2. Du kan finne retningen deres ved å bruke tangenter til ellipsen i punktene 5 og 2 (fig. 3.59). Disse tangentene vil være vinkelrett på diameteren 5 - 2, og linjene trukket gjennom punktene A og B parallelt med disse tangentene vil også være vinkelrett på linjen 5 - 2. Beregn punktene oppnådd ved skjæringspunktet mellom disse linjene og ellipsen som 1, 3, 4, 6 (fig. 3.60). Koble alle seks toppunktene med rette linjer (fig. 3.61).

Sjekk riktigheten av konstruksjonen din på forskjellige måter. Hvis konstruksjonen er riktig, så krysser linjene som forbinder de motsatte toppunktene til sekskanten i midten av sirkelen (fig. 3.62), og de motsatte sidene av sekskanten er parallelle med de tilsvarende diametrene (fig. 3.63). En annen kontrollmetode er vist i fig. 3,64.

Vertikal sekskant. I en slik sekskant har de rette linjene som forbinder punktene 7 og 3, b og 4, samt tangenter til den omskrevne sirkelen ved punktene 5 og 2, en vertikal retning og beholder den i perspektivtegningen. Ved å tegne to vertikale tangenter til ellipsen finner vi altså punktene 5 og 2 (tangenspunkter). Koble dem med en rett linje, og del deretter den resulterende diameteren 5 - 2 i 4 like segmenter, ta hensyn til deres perspektivreduksjoner (fig. 3.65). Tegn vertikale linjer gjennom punktene A og B, og finn punktene 1,3,6l4 i deres skjæringspunkt med ellipsen. Koble deretter punktene 1 - 6 sekvensielt med rette linjer (fig. 3.66). Kontroller riktigheten av sekskantkonstruksjonen på samme måte som i forrige eksempel.

Den beskrevne metoden for å konstruere en sekskant lar oss få denne figuren basert på en sirkel, som er lettere å skildre i perspektiv enn en firkant med gitte proporsjoner. Derfor ser denne metoden for å konstruere en sekskant ut til å være den mest nøyaktige og universelle. Den firkantbaserte konstruksjonsmetoden gjør det enkelt å avbilde en sekskant i tilfellet når det allerede er en kube på tegningen, med andre ord når proporsjonene til kvadratet og retningen på sidene bestemmes.

Basert på en firkant. Se på fig. 3,67. En sekskant innskrevet i en firkant er lik siden av firkanten i horisontal retning 5 - 2, og mindre enn lengden i vertikal retning.

Vertikal sekskant. Tegn en vertikal firkant i perspektiv. Tegn en rett linje gjennom skjæringspunktet mellom diagonalene parallelt med de horisontale sidene. Del det resulterende segmentet 5 - 2 i fire like deler og tegn vertikale linjer gjennom punktene A og B (fig. 3.68). Linjene som avgrenser sekskanten øverst og nederst, faller ikke sammen med sidene av firkanten. Tegn dem i en viss avstand (1114 a) fra de horisontale sidene av firkanten og parallelt med dem. Ved å koble punkt 1 og 3 funnet på denne måten med punkt 2, og punkt 6 og 4 med punkt 5, får vi en sekskant (fig. 3.69).

En horisontal sekskant bygges i samme rekkefølge (fig. 3.70 og 3.71).

Denne konstruksjonsmetoden er kun egnet for sekskanter med tilstrekkelig åpning. Hvis åpningen av sekskanten er ubetydelig, er det bedre å bruke metoden basert på den omskrevne sirkelen. For å sjekke en sekskant konstruert gjennom en firkant, kan du bruke metoder som allerede er kjent for deg.

I tillegg er det en annen måte - å beskrive en sirkel rundt den resulterende sekskanten (i tegningen din - en ellipse). Alle hjørner av sekskanten må tilhøre denne ellipsen.

Når du har mestret ferdighetene til å tegne en sekskant, vil du være fri til å gå videre til å tegne et sekskantet prisme. Se nøye på diagrammet i fig. 3.72, samt diagrammer for å konstruere sekskantede prismer basert på en omskreven sirkel (Fig. 3.73; 3.74 og 3.75) og basert på en firkant (Fig. 3.76; 3.77 og 3.78). Tegn vertikale og horisontale sekskanter på forskjellige måter. I tegningen av en vertikal sekskant vil langsidene av sideflatene være vertikale rette linjer parallelle med hverandre, og sekskanten til basen vil være mer åpen jo lenger den er fra horisontlinjen. I en tegning av en horisontal sekskant vil langsidene av sideflatene konvergere ved forsvinningspunktet i horisonten, og åpningen til basissekskanten vil være større jo lenger den er fra betrakteren. Når du avbilder en sekskant, sørg også for at de parallelle kantene på begge basene konvergerer i perspektiv (fig. 3.79; 3.80).

Innhold:

En vanlig sekskant, også kalt en perfekt sekskant, har seks like sider og seks like vinkler. Du kan tegne en sekskant med et målebånd og en gradskive, en grov sekskant med en rund gjenstand og en linjal, eller en enda grovere sekskant med bare en blyant og litt intuisjon. Hvis du vil vite hvordan du tegner en sekskant på forskjellige måter, er det bare å lese videre.

Trinn

1 Tegn en perfekt sekskant med et kompass

  1. 1 Bruk et kompass til å tegne en sirkel. Sett blyanten inn i kompasset. Forleng kompasset til ønsket radiusbredde på sirkelen din. Radien kan være fra et par til ti centimeter bred. Deretter legger du et kompass og blyant på papir og tegner en sirkel.
    • Noen ganger er det lettere å tegne en halv sirkel først og deretter den andre halvdelen.
  2. 2 Flytt kompassnålen til kanten av sirkelen. Plasser den på toppen av sirkelen. Ikke endre vinkelen eller posisjonen til kompasset.
  3. 3 Lag et lite blyantmerke på kanten av sirkelen. Gjør det tydelig, men ikke for mørkt, da du vil slette det senere. Husk å opprettholde vinkelen du angir for kompasset.
  4. 4 Flytt kompassnålen til merket du nettopp har laget. Plasser nålen direkte på merket.
  5. 5 Lag et nytt blyantmerke på kanten av sirkelen. På denne måten vil du lage et andre merke i en viss avstand fra det første merket. Fortsett å bevege deg i én retning.
  6. 6 Bruk samme metode for å lage fire flere merker. Du må gå tilbake til det opprinnelige merket. Hvis ikke, så har mest sannsynlig vinkelen som du holdt kompasset og laget merkene dine i, endret seg. Dette kan ha skjedd fordi du klemte den for hardt eller tvert imot løsnet den litt.
  7. 7 Koble til merkene med en linjal. De seks stedene der merkene dine skjærer kanten av sirkelen er de seks toppunktene til sekskanten. Bruk en linjal og blyant til å tegne rette linjer som forbinder tilstøtende merker.
  8. 8 Slett sirkelen, merkene på kantene av sirkelen og eventuelle andre merker du har laget. Når du har slettet alle byggelinjene dine, bør den perfekte sekskanten være klar.

2 Tegn en grov sekskant med en rund gjenstand og en linjal

  1. 1 Spor kanten av glasset med en blyant. På denne måten vil du tegne en sirkel. Det er veldig viktig å tegne med en blyant, siden du senere må slette alle hjelpelinjene. Du kan også spore et opp ned glass, krukke eller noe annet som har en rund base.
  2. 2 Tegn horisontale linjer gjennom midten av sirkelen din. Du kan bruke en linjal, en bok - alt med en rett kant. Hvis du har en linjal, kan du markere midten ved å beregne den vertikale lengden på sirkelen og dele den i to.
  3. 3 Tegn en "X" over halve sirkelen, del den i seks like store deler. Siden du allerede har tegnet en linje gjennom midten av sirkelen, må X-en være bredere enn den er høy slik at delene er like. Tenk deg å dele en pizza i seks stykker.
  4. 4 Lag trekanter av hver seksjon. For å gjøre dette, bruk en linjal til å tegne en rett linje under den buede delen av hver seksjon, og koble den til de to andre linjene for å danne en trekant. Gjør dette med de resterende fem seksjonene. Tenk på det som å lage en skorpe rundt pizzaskivene dine.
  5. 5 Slett alle hjelpelinjer. Retningslinjene inkluderer sirkelen din, de tre linjene som delte sirkelen inn i seksjoner og andre merker du har laget underveis.

3 Tegn en grov sekskant med én blyant

  1. 1 Tegn en horisontal linje. For å tegne en rett linje uten linjal, tegn ganske enkelt start- og sluttpunktet til den horisontale linjen. Plasser deretter blyanten ved startpunktet og tegn linjen til slutten. Lengden på denne linjen kan bare være et par centimeter.
  2. 2 Tegn to diagonale linjer fra endene av den horisontale. Den diagonale linjen på venstre side skal peke utover på samme måte som den diagonale linjen til høyre. Du kan tenke deg at disse linjene danner en vinkel på 120 grader i forhold til den horisontale linjen.
  3. 3 Tegn ytterligere to horisontale linjer som kommer fra de første horisontale linjene tegnet innover. Dette vil lage et speilbilde av de to første diagonale linjene. Den nederste venstre linjen skal være en refleksjon av den øverste venstre linjen, og den nederste høyre linjen skal være en refleksjon av den øverste høyre linjen. Mens de øverste horisontale linjene skal vende utover, skal de nederste vende innover til basen.
  4. 4 Tegn en annen horisontal linje som forbinder de to nederste diagonale linjene. På denne måten vil du tegne basen for sekskanten din. Ideelt sett bør denne linjen være parallell med den øverste horisontale linjen. Nå har du fullført sekskanten din.
  • Blyanten og kompasset bør være skarpe for å minimere feil fra merker som er for brede.
  • Når du bruker kompassmetoden, hvis du kobler hvert merke i stedet for alle seks, vil du få en likesidet trekant.

Advarsler

  • Kompasset er en ganske skarp gjenstand, vær veldig forsiktig med det.

Driftsprinsipp

  • Hver metode vil hjelpe deg med å tegne en sekskant dannet av seks likesidede trekanter med en radius lik lengden på alle sider. De seks radiene som er tegnet har samme lengde og alle linjene for å lage sekskanten er også like lange, siden bredden på kompasset ikke endret seg. På grunn av det faktum at de seks trekantene er likesidede, er vinklene mellom hjørnene deres 60 grader.

Det du trenger

  • Papir
  • Blyant
  • Hersker
  • Et par kompasser
  • Noe som kan legges under papiret for å hindre at kompassnålen glir.
  • Viskelær

Temaet polygoner er dekket i skolens læreplan, men det blir ikke viet nok oppmerksomhet til det. I mellomtiden er det interessant, og dette gjelder spesielt for en vanlig sekskant eller sekskant - tross alt har mange naturlige gjenstander denne formen. Disse inkluderer honningkaker og mye mer. Denne formen fungerer veldig bra i praksis.

Definisjon og konstruksjon

En vanlig sekskant er en plan figur som har seks like lange sider og like mange like vinkler.

Hvis vi husker formelen for summen av vinklene til en polygon

det viser seg at i denne figuren er det lik 720°. Vel, siden alle vinklene på figuren er like, er det lett å beregne at hver av dem er lik 120°.

Å tegne en sekskant er veldig enkelt; alt du trenger er et kompass og en linjal.

Trinn-for-trinn-instruksjonene vil se slik ut:

Hvis du ønsker, kan du klare deg uten en linje ved å tegne fem sirkler med lik radius.

Figuren som oppnås på denne måten vil være en vanlig sekskant, og dette kan bevises nedenfor.

Egenskapene er enkle og interessante

For å forstå egenskapene til en vanlig sekskant, er det fornuftig å dele den inn i seks trekanter:

Dette vil hjelpe i fremtiden til å tydeligere vise egenskapene, hvorav de viktigste er:

  1. omskrevet sirkeldiameter;
  2. diameteren til den innskrevne sirkelen;
  3. kvadrat;
  4. omkrets.

Omskrevet sirkel og konstruerbarhet

En sirkel kan beskrives rundt en sekskant, og bare en. Siden denne figuren er vanlig, kan du gjøre det ganske enkelt: tegne en halveringslinje fra to tilstøtende hjørner inni. De skjærer hverandre i punkt O, og danner sammen med siden mellom dem en trekant.

Vinklene mellom sekskantsiden og halveringslinjen vil være 60°, så vi kan definitivt si at en trekant, for eksempel AOB, er likebenet. Og siden den tredje vinkelen også vil være lik 60°, er den også likesidet. Det følger at segmentene OA og OB er like, noe som betyr at de kan tjene som radius til en sirkel.

Etter dette kan du flytte til neste side, og også tegne en halveringslinje fra vinkelen ved punkt C. Du vil få en annen likesidet trekant, og siden AB vil være felles for begge, og OS vil være neste radius som den samme sirkelen går gjennom. Det vil være seks slike trekanter totalt, og de vil ha et felles toppunkt i punktet O. Det viser seg at det vil være mulig å beskrive en sirkel, og det er bare én av den, og dens radius er lik siden av sekskanten:

Derfor er det mulig å konstruere denne figuren ved hjelp av et kompass og linjal.

Vel, området til denne sirkelen vil være standard:

Innskrevet sirkel

Sentrum av den omskrevne sirkelen vil falle sammen med midten av den innskrevne sirkelen. For å bekrefte dette kan du tegne perpendikulære fra punkt O til sidene av sekskanten. De vil være høydene til trekantene som utgjør sekskanten. Og i en likebenet trekant er høyden medianen i forhold til siden den hviler på. Dermed er denne høyden ikke mer enn den vinkelrette halveringslinjen, som er radiusen til den innskrevne sirkelen.

Høyden til en likesidet trekant beregnes ganske enkelt:

h²=а²-(а/2)²= а²3/4, h=а(√3)/2

Og siden R=a og r=h, viser det seg at

r=R(√3)/2.

Dermed passerer insirkelen gjennom sentrene på sidene til en vanlig sekskant.

Området vil være:

S=3πa²/4,

altså tre fjerdedeler av det som er beskrevet.

Omkrets og område

Alt er klart med omkretsen, det er summen av lengdene på sidene:

P=6a, eller P=6R

Men arealet vil være lik summen av alle seks trekantene som sekskanten kan deles inn i. Siden arealet av en trekant beregnes som halvparten av produktet av basen og høyden, så:

S=6(а/2)(а(√3)/2)= 6а²(√3)/4=3а²(√3)/2 eller

S=3R²(√3)/2

De som ønsker å beregne dette arealet gjennom radiusen til den innskrevne sirkelen kan gjøre dette:

S=3(2r/√3)²(√3)/2=r²(2√3)

Underholdende konstruksjoner

Du kan passe en trekant inn i en sekskant, sidene som vil forbinde toppunktene gjennom en:

Det vil være to av dem totalt, og deres overlapping vil gi Davidsstjernen. Hver av disse trekantene er likesidede. Dette er ikke vanskelig å verifisere. Hvis du ser på AC-siden, tilhører den to trekanter samtidig - BAC og AEC. Hvis i den første av dem AB = BC, og vinkelen mellom dem er 120°, vil hver av de gjenværende være 30°. Fra dette kan vi trekke logiske konklusjoner:

  1. Høyden ABC fra toppunktet B vil være lik halve siden av sekskanten, siden sin30°=1/2. De som ønsker å verifisere dette kan rådes til å regne på nytt ved å bruke Pythagoras teorem det passer perfekt her.
  2. Side AC vil være lik to radier av den innskrevne sirkelen, som igjen beregnes ved hjelp av samme teorem. Det vil si AC=2(a(√3)/2)=a(√3).
  3. Trekanter ABC, CDE og AEF er like i to sider og vinkelen mellom dem, og av dette følger det at sidene AC, CE og EA er like.

Trekantene krysser hverandre og danner en ny sekskant, og den er også regelmessig. Dette er bevist enkelt:

Dermed oppfyller figuren egenskapene til en vanlig sekskant - den har seks like sider og vinkler. Fra likheten mellom trekantene ved toppunktene er det lett å utlede lengden på siden til den nye sekskanten:

d=a(√3)/3

Det vil også være radiusen til sirkelen som er beskrevet rundt den. Den innskrevne radiusen vil være halvparten av siden til en stor sekskant, noe som ble bevist når man vurderte trekant ABC. Høyden er nøyaktig halvparten av siden, derfor er den andre halvdelen radiusen til sirkelen innskrevet i den lille sekskanten:

r2=a/2

S=(3(√3)/2)(а(√3)/3)²=а(√3)/2

Det viser seg at arealet av sekskanten inne i Davidsstjernen er tre ganger mindre enn området til den store der stjernen er innskrevet.

Fra teori til praksis

Egenskapene til sekskanten brukes veldig aktivt både i naturen og i ulike felt av menneskelig aktivitet. Først og fremst gjelder dette bolter og muttere - hodene til den første og andre er ikke noe mer enn en vanlig sekskant, hvis du ikke tar hensyn til avfasningene. Størrelsen på skiftenøkkelen tilsvarer diameteren til den innskrevne sirkelen - det vil si avstanden mellom motsatte kanter.

Sekskantede fliser har også funnet sin anvendelse. Det er mye mindre vanlig enn den firkantede, men det er mer praktisk å legge den: tre fliser møtes på ett punkt, i stedet for fire. Komposisjonene kan vise seg å være veldig interessante:

Det produseres også betongfliser for asfaltering.

Utbredelsen av sekskanter i naturen er enkelt forklart. Dermed er det lettest å passe sirkler og kuler tett på et plan hvis de har samme diameter. På grunn av dette har honningkaker denne formen.

Hva annet å lese