Կանոնավոր վեցանկյուն կառուցում - ինչպես նկարել վեցանկյուն: Ինչպես կառուցել սովորական վեցանկյուն Ինչպես մատիտով նկարել վեցանկյուն

Ձեր մոտ մատիտ կա՞: Նայեք նրա խաչմերուկին՝ դա կանոնավոր վեցանկյուն է կամ, ինչպես նաև կոչվում է, վեցանկյուն։ Այս ձևն ունեն նաև ընկույզի, վեցանկյուն շախմատի դաշտի, ածխածնի որոշ բարդ մոլեկուլների (օրինակ՝ գրաֆիտի), ձյան փաթիլի, մեղրախիսկի և այլ առարկաների խաչմերուկը։ Վերջերս հայտնաբերվել է հսկա կանոնավոր վեցանկյուն: Տարօրինակ չէ՞, որ բնությունն այդքան հաճախ օգտագործում է այս ձևի կառուցվածքները իր ստեղծագործությունների համար: Եկեք ավելի սերտ նայենք:

Կանոնավոր վեցանկյունը վեց հավասար կողմերով և հավասար անկյուններով բազմանկյուն է: Դպրոցական դասընթացից մենք գիտենք, որ այն ունի հետևյալ հատկությունները.

  • Նրա կողմերի երկարությունը համապատասխանում է շրջագծված շրջանագծի շառավղին։ Բոլորից միայն կանոնավոր վեցանկյունն ունի այս հատկությունը:
  • Անկյունները հավասար են միմյանց, և յուրաքանչյուր չափը 120° է։
  • Վեցանկյունի պարագիծը կարելի է գտնել P=6*R բանաձևով, եթե հայտնի է նրա շուրջ նկարագրված շրջանագծի շառավիղը, կամ P=4*√(3)*r, եթե շրջանագիծը մակագրված է դրան։ R-ը և r-ը շրջագծված և ներգծված շրջանագծի շառավիղներն են:
  • Կանոնավոր վեցանկյունի զբաղեցրած տարածքը որոշվում է հետևյալ կերպ՝ S=(3*√(3)*R 2)/2։ Եթե ​​շառավիղը անհայտ է, փոխարինեք կողմերից մեկի երկարությունը, ինչպես հայտնի է, այն համապատասխանում է շրջագծված շրջանագծի շառավղի երկարությանը:

Կանոնավոր վեցանկյունն ունի մեկ հետաքրքիր հատկություն, որի շնորհիվ այն այդքան տարածված է դարձել բնության մեջ՝ այն ունակ է լցնել ինքնաթիռի ցանկացած մակերես առանց համընկնումների կամ բացերի։ Գոյություն ունի նույնիսկ այսպես կոչված Պալ լեմմա, ըստ որի կանոնավոր վեցանկյունը, որի կողմը հավասար է 1/√(3), ունիվերսալ կազմ է, այսինքն՝ կարող է ծածկել մեկ միավորի տրամագծով ցանկացած հավաքածու։ .

Հիմա եկեք նայենք կանոնավոր վեցանկյունի կառուցմանը: Կան մի քանի մեթոդներ, որոնցից ամենապարզը ներառում է կողմնացույցի, մատիտի և քանոնի օգտագործումը: Նախ կողմնացույցով կամայական շրջան ենք գծում, այնուհետև այս շրջանագծի վրա կամայական տեղում կետ ենք դնում։ Առանց կողմնացույցի անկյունը փոխելու, ծայրը տեղադրում ենք այս կետում, շրջանագծի վրա նշում ենք հաջորդ խազը և շարունակում ենք այդպես մինչև ստանանք բոլոր 6 միավորները։ Այժմ մնում է դրանք միացնել ուղիղ հատվածներով, և դուք կստանաք ցանկալի ցուցանիշը։

Գործնականում կան դեպքեր, երբ անհրաժեշտ է մեծ վեցանկյուն նկարել: Օրինակ, երկաստիճան գիպսաստվարաթղթե առաստաղի վրա, կենտրոնական ջահի մոնտաժման վայրի շուրջ, դուք պետք է ստորին մակարդակի վրա տեղադրեք վեց փոքր լամպեր: Այս չափսի կողմնացույցները գտնելը շատ ու շատ դժվար կլինի: Ի՞նչ անել այս դեպքում: Ինչպե՞ս եք նույնիսկ մեծ շրջան նկարում: Շատ պարզ. Պետք է վերցնել անհրաժեշտ երկարության ամուր թելն ու դրա ծայրերից մեկը կապել մատիտին հակառակ։ Այժմ մնում է միայն գտնել օգնական, ով կսեղմի թելի երկրորդ ծայրը դեպի առաստաղը ցանկալի կետում։ Իհարկե, այս դեպքում հնարավոր են աննշան սխալներ, բայց դժվար թե դրանք բոլորովին նկատելի լինեն կողմնակի անձի համար։

Բովանդակություն:

Կանոնավոր վեցանկյունը, որը նաև կոչվում է կատարյալ վեցանկյուն, ունի վեց հավասար կողմեր ​​և վեց հավասար անկյուններ։ Դուք կարող եք վեցանկյուն նկարել չափիչով և անկյունաչափով, կոպիտ վեցանկյուն կլոր առարկայով և քանոնով, կամ էլ ավելի կոպիտ վեցանկյուն՝ ընդամենը մատիտով և մի փոքր ինտուիցիայով։ Եթե ​​ցանկանում եք իմանալ, թե ինչպես նկարել վեցանկյուն տարբեր ձևերով, պարզապես կարդացեք:

Քայլեր

1 Կատարյալ վեցանկյուն գծե՛ք կողմնացույցի օգնությամբ

  1. 1 Օգտագործելով կողմնացույց, նկարեք շրջան:Տեղադրեք մատիտը կողմնացույցի մեջ: Ընդարձակեք կողմնացույցը ձեր շրջանակի ցանկալի շառավիղով: Շառավիղը կարող է լինել մի քանի տասը սանտիմետր լայնությամբ: Հաջորդը, դրեք կողմնացույց և մատիտ թղթի վրա և գծեք շրջան:
    • Երբեմն ավելի հեշտ է սկզբում կես շրջան նկարել, իսկ հետո մյուս կեսը:
  2. 2 Տեղափոխեք կողմնացույցի ասեղը շրջանագծի եզրին:Տեղադրեք այն շրջանագծի վերևում: Մի փոխեք կողմնացույցի անկյունը կամ դիրքը:
  3. 3 Շրջանակի եզրին մատիտով փոքր նշան արեք։Դարձրե՛ք այն հստակ, բայց ոչ շատ մութ, ինչպես հետագայում կջնջեք: Հիշեք, որ պահպանեք այն անկյունը, որը դուք սահմանել եք կողմնացույցի համար:
  4. 4 Տեղափոխեք կողմնացույցի ասեղը ձեր նշած նշագծին:Տեղադրեք ասեղը անմիջապես նշանի վրա:
  5. 5 Շրջանակի եզրին մատիտով մեկ այլ նշան դրեք։Այս կերպ դուք կկատարեք երկրորդ նշան առաջին նշանից որոշակի հեռավորության վրա։ Շարունակեք շարժվել մեկ ուղղությամբ:
  6. 6 Օգտագործեք նույն մեթոդը ևս չորս նշան դնելու համար:Դուք պետք է վերադառնաք սկզբնական նշանին: Եթե ​​ոչ, ապա, ամենայն հավանականությամբ, փոխվել է այն անկյունը, որով դուք պահել եք կողմնացույցը և կատարել ձեր նշանները: Հնարավոր է՝ դա տեղի է ունեցել այն պատճառով, որ դուք այն շատ ամուր սեղմել եք կամ, ընդհակառակը, մի փոքր թուլացրել եք։
  7. 7 Միացրեք նշանները, օգտագործելով քանոն:Վեց վայրերը, որտեղ ձեր նշանները հատվում են շրջանագծի եզրին, վեցանկյան վեց գագաթներն են: Օգտագործելով քանոն և մատիտ, գծեք ուղիղ գծեր, որոնք կապում են հարակից նշանները:
  8. 8 Ջնջեք շրջանակը, շրջանագծի եզրերի նշանները և ձեր նշած ցանկացած այլ նշաններ: Երբ ջնջեք ձեր բոլոր շինարարական գծերը, ձեր կատարյալ վեցանկյունը պետք է պատրաստ լինի:

2 Կլոր առարկայի և քանոնի միջոցով գծե՛ք կոպիտ վեցանկյուն

  1. 1 Մատիտով գծեք ապակու եզրագիծը։Այս կերպ դուք շրջան կգծեք։ Շատ կարևոր է մատիտով նկարելը, քանի որ հետագայում անհրաժեշտ կլինի ջնջել բոլոր օժանդակ գծերը։ Դուք կարող եք նաև հետևել գլխիվայր ապակի, բանկա կամ որևէ այլ բան, որն ունի կլոր հիմք:
  2. 2 Հորիզոնական գծեր գծեք ձեր շրջանագծի կենտրոնում:Դուք կարող եք օգտագործել քանոն, գիրք՝ ուղիղ եզրով ցանկացած բան: Եթե ​​դուք ունեք քանոն, կարող եք նշել միջինը՝ հաշվարկելով շրջանագծի ուղղահայաց երկարությունը և բաժանելով այն կիսով չափ:
  3. 3 Շրջանակի կեսի վրա նկարիր «X»՝ բաժանելով այն վեց հավասար հատվածների:Քանի որ դուք արդեն գծել եք շրջանագծի միջով, X-ը պետք է ավելի լայն լինի, քան բարձրությունը, որպեսզի մասերը հավասար լինեն: Պատկերացրեք, որ պիցցան բաժանում եք վեց մասի:
  4. 4 Յուրաքանչյուր հատվածից եռանկյուններ պատրաստեք:Դա անելու համար օգտագործեք քանոն՝ յուրաքանչյուր հատվածի կոր հատվածի տակ ուղիղ գիծ գծելու համար՝ այն միացնելով մյուս երկու գծերին՝ ձևավորելով եռանկյուն: Դա արեք մնացած հինգ բաժիններով: Մտածեք դրա մասին, ինչպես ձեր պիցցայի կտորների շուրջ ընդերք պատրաստելը:
  5. 5 Ջնջել բոլոր օժանդակ տողերը:Ուղղորդող տողերը ներառում են ձեր շրջանակը, երեք տողերը, որոնք բաժանեցին ձեր շրջանակը հատվածների և այլ նշաններ, որոնք դուք կատարել եք ճանապարհին:

3 Մեկ մատիտով գծեք կոպիտ վեցանկյուն

  1. 1 Հորիզոնական գիծ գծեք։Առանց քանոնի ուղիղ գիծ գծելու համար պարզապես գծեք ձեր հորիզոնական գծի մեկնարկային և ավարտական ​​կետը: Այնուհետև մատիտը դրեք մեկնարկային կետում և գծեք մինչև վերջ: Այս գծի երկարությունը կարող է լինել ընդամենը մի քանի սանտիմետր:
  2. 2 Հորիզոնականի ծայրերից գծե՛ք երկու անկյունագիծ։Ձախ կողմի անկյունագծային գիծը պետք է ուղղված լինի դեպի դուրս այնպես, ինչպես աջ կողմում գտնվող անկյունագծը: Կարող եք պատկերացնել, որ այս գծերը հորիզոնական գծի նկատմամբ կազմում են 120 աստիճանի անկյուն։
  3. 3 Նկարեք ևս երկու հորիզոնական գծեր, որոնք գալիս են դեպի ներս գծված առաջին հորիզոնական գծերից:Սա կստեղծի առաջին երկու անկյունագծային գծերի հայելային պատկերը: Ներքևի ձախ գիծը պետք է լինի վերևի ձախ գծի արտացոլումը, իսկ ներքևի աջ գիծը պետք է լինի վերևի աջ գծի արտացոլումը: Մինչդեռ վերին հորիզոնական գծերը պետք է նայեն դեպի դուրս, իսկ ստորինները պետք է նայեն դեպի ներս՝ դեպի հիմքը:
  4. 4 Գծեք ևս մեկ հորիզոնական գիծ, ​​որը կապում է ներքևի երկու անկյունագծերը:Այս կերպ դուք կգծեք ձեր վեցանկյունի հիմքը: Իդեալում, այս գիծը պետք է զուգահեռ լինի վերին հորիզոնական գծին: Այժմ դուք ավարտել եք ձեր վեցանկյունը:
  • Մատիտը և կողմնացույցը պետք է սուր լինեն, որպեսզի նվազագույնի հասցվեն չափազանց լայն նշանների սխալները:
  • Կողմնացույցի մեթոդն օգտագործելիս, եթե բոլոր վեցի փոխարեն միացնեք յուրաքանչյուր նշանը, կստանաք հավասարակողմ եռանկյուն:

Զգուշացումներ

  • Կողմնացույցը բավականին սուր առարկա է, դրա հետ շատ զգույշ եղեք։

Գործողության սկզբունքը

  • Յուրաքանչյուր մեթոդ կօգնի ձեզ նկարել վեցանկյուն, որը ձևավորվում է վեց հավասարակողմ եռանկյուններով, որոնց շառավիղը հավասար է բոլոր կողմերի երկարությանը: Նկարված վեց շառավիղները նույն երկարությունն են, և վեցանկյուն ստեղծելու բոլոր գծերը նույնպես նույն երկարությունն են, քանի որ կողմնացույցի լայնությունը չի փոխվել: Վեց եռանկյունների հավասարակողմ լինելու պատճառով նրանց գագաթների միջև անկյունները 60 աստիճան են։

Այն, ինչ ձեզ հարկավոր կլինի

  • Թուղթ
  • Մատիտ
  • Քանոն
  • Զույգ կողմնացույց
  • Մի բան, որը կարելի է տեղադրել թղթի տակ՝ կողմնացույցի ասեղը չսահելու համար:
  • Ռետին

Կանոնավոր շրջագծված եռանկյունը կառուցված է հետևյալ կերպ(Նկար 38): Տրված շառավղով շրջանագծի կենտրոնից Ռ 1 գծեք շառավղով շրջան R2 = 2R1 և բաժանիր երեք հավասար մասերի։ Բաժանման կետեր A, B, C կանոնավոր եռանկյան գագաթներն են, որոնք շրջագծված են շառավղով շրջանով Ռ 1 .

Նկար 38

Կանոնավոր շրջագծված քառանկյուն (քառակուսի)կարող է կառուցվել՝ օգտագործելով կողմնացույց և քանոն (Նկար 39): Տրված շրջանագծի մեջ գծված են երկու փոխադարձ ուղղահայաց տրամագծեր։ Որպես կենտրոններ վերցնելով տրամագծերի շրջանագծի հետ հատման կետերը՝ շրջանագծի շառավիղը Ռ նկարագրել կամարները, մինչև դրանք հատվեն միմյանց կետերում Ա Բ Գ Դ . Միավորներ Ա , Բ , Գ , Դ և տրված շրջանով շրջագծված քառակուսու գագաթներն են:

Նկար 39

Կառուցել կանոնավոր շրջագծված վեցանկյունանհրաժեշտ է նախ նկարագրված քառակուսու գագաթները կառուցել վերը նշված եղանակով (Նկար 40, ա): Քառակուսու գագաթները որոշելիս շառավիղի տրված շրջանագիծը միաժամանակ Ռ կետերում բաժանված են վեց հավասար մասերի 1, 2, 3, 4, 5, 6 և նկարիր քառակուսու ուղղահայաց կողմերը։ Շրջանագիծ գծելով բաժանարար կետերի միջով 2–5 Եվ 3–6 ուղիղ գծեր, մինչև դրանք հատվեն քառակուսու ուղղահայաց կողմերի հետ (Նկար 40, բ), մենք ստանում ենք գագաթները. A, B, D, E նկարագրված է կանոնավոր վեցանկյուն:

Նկար 40

Այլ գագաթներ ԳԵվ Ֆորոշվում է շառավղով շրջանագծի աղեղի միջոցով Օ.Ա., որն իրականացվում է այնքան ժամանակ, քանի դեռ այն հատվում է տվյալ շրջանագծի ուղղահայաց տրամագծի շարունակության հետ։
3 ԶՈՒՅԳ

Եկեք սովորենք, թե ինչպես նկարել վեցանկյուն պրիզմա տարբեր դիրքերում:

Ուսումնասիրել կանոնավոր վեցանկյուն կառուցելու տարբեր եղանակներ, կատարել վեցանկյունների գծագրեր, ստուգել դրանց կառուցման ճիշտությունը։ Վեցանկյունների հիման վրա կառուցեք վեցանկյուն պրիզմաներ:

Դիտարկենք վեցանկյուն պրիզմա Նկ. 3.52 և նրա ուղղանկյուն ելքերը Նկ. 3.53. Վեցանկյուն պրիզմայի (վեցանկյուն) հիմքում կան կանոնավոր վեցանկյուններ, կողային երեսները՝ միանման ուղղանկյուններ։ Վեցանկյունը հեռանկարում ճիշտ պատկերելու համար նախ պետք է սովորել, թե ինչպես ճիշտ պատկերել դրա հիմքը հեռանկարում (նկ. 3.54): Վեցանկյունում Նկ. 3,55 գագաթները նշանակված են մեկից վեց թվերով: Եթե ​​1-ին և 3-րդ, 4-րդ և 6-րդ կետերը միացնեք ուղղահայաց ուղիղ գծերով, ապա կնկատեք, որ այս ուղիղները շրջանագծի կենտրոնական կետի հետ միասին 5-2 տրամագիծը բաժանում են չորս հավասար հատվածների (այս հատվածները նշվում են աղեղներով. ) Վեցանկյունի հակառակ կողմերը զուգահեռ են միմյանց և նրա կենտրոնով անցնող և երկու գագաթները միացնող գծի (օրինակ, 6 - 1 և 4 - 3 կողմերը զուգահեռ են 5 - 2 տողին): Այս դիտարկումները կօգնեն ձեզ կառուցել վեցանկյուն հեռանկարում, ինչպես նաև ստուգել այս կառուցվածքի ճիշտությունը: Ներկայացումից կանոնավոր վեցանկյուն կառուցելու երկու եղանակ կա՝ շրջանագծի հիման վրա և քառակուսու վրա:

Սահմանված շրջանագծի հիման վրա: Նայեք Նկ. 3.56. Կանոնավոր վեցանկյան բոլոր գագաթները պատկանում են շրջանագծին, որի շառավիղը հավասար է վեցանկյան կողմին:


Հորիզոնական վեցանկյուն: Գծե՛ք կամայական բացվածքի հորիզոնական էլիպս, այսինքն՝ շրջագծված շրջանագիծ հեռանկարում: Այժմ դրա վրա պետք է գտնել վեց կետ, որոնք վեցանկյան գագաթներն են։ Տրված շրջանագծի ցանկացած տրամագիծ գծի՛ր նրա կենտրոնով (նկ. 3.57): Էլիպսի վրա ընկած տրամագծի ծայրահեղ կետերը՝ 5 և 2, վեցանկյան գագաթներն են։ Մնացած գագաթները գտնելու համար անհրաժեշտ է այս տրամագիծը բաժանել չորս հավասար հատվածների։ Տրամագիծն արդեն շրջանագծի կենտրոնական կետով բաժանվել է երկու շառավղով, մնում է յուրաքանչյուր շառավիղը կիսով չափ բաժանել: Հեռանկարային գծագրում բոլոր չորս հատվածները հավասարաչափ կծկվում են, երբ հեռանում են դիտողից (նկ. 3.58): Այժմ գծեք շառավիղների միջնակետերի միջով՝ A և B կետերը, ուղիղ գծեր, որոնք ուղղահայաց են ուղիղ 5-2-ին: Դուք կարող եք գտնել դրանց ուղղությունը՝ օգտագործելով 5-րդ և 2-րդ կետերում էլիպսի շոշափողները (նկ. 3.59): Այս շոշափողներն ուղղահայաց կլինեն 5 - 2 տրամագծին, իսկ A և B կետերով գծված գծերը, որոնք զուգահեռ են այս շոշափողներին, նույնպես ուղղահայաց կլինեն 5 - 2 գծին: Նշեք այս գծերի հատման կետը էլիպսի հետ. 1, 3, 4, 6 (նկ. 3.60): Բոլոր վեց գագաթները միացրեք ուղիղ գծերով (նկ. 3.61):

Ստուգեք ձեր շինարարության ճիշտությունը տարբեր ձևերով: Եթե ​​կոնստրուկցիան ճիշտ է, ապա վեցանկյան հակառակ գագաթները միացնող գծերը հատվում են շրջանագծի կենտրոնում (նկ. 3.62), իսկ վեցանկյան հակառակ կողմերը զուգահեռ են համապատասխան տրամագծերին (նկ. 3.63): Ստուգման մեկ այլ մեթոդ ներկայացված է Նկ. 3.64.

Ուղղահայաց վեցանկյուն: Նման վեցանկյունում 7 և 3, b և 4 կետերը միացնող ուղիղ գծերը, ինչպես նաև 5 և 2 կետերում շրջագծված շրջանագծի շոշափողներն ունեն ուղղահայաց ուղղություն և պահպանում են այն հեռանկարային գծագրում։ Այսպիսով, էլիպսի վրա երկու ուղղահայաց շոշափողներ գծելով՝ մենք գտնում ենք 5-րդ և 2-րդ կետերը (շոշափման կետեր): Միացրեք դրանք ուղիղ գծով, իսկ հետո ստացված 5 - 2 տրամագիծը բաժանեք 4 հավասար հատվածների՝ հաշվի առնելով դրանց հեռանկարային կրճատումները (նկ. 3.65): Ուղղահայաց գծեր գծի՛ր A և B կետերով, և դրանց հատման կետում էլիպսի հետ գտի՛ր 1,3,6l4 կետերը: Այնուհետև 1 - 6 կետերը հաջորդաբար միացրեք ուղիղ գծերով (նկ. 3.66): Ստուգեք վեցանկյուն կառուցվածքի ճիշտությունը նույն կերպ, ինչպես նախորդ օրինակը:

Վեցանկյուն կառուցելու նկարագրված մեթոդը թույլ է տալիս ստանալ այս ցուցանիշը շրջանագծի հիման վրա, որն ավելի հեշտ է պատկերել հեռանկարում, քան տրված համամասնությունների քառակուսին: Հետևաբար, վեցանկյուն կառուցելու այս մեթոդը թվում է ամենաճիշտ և ունիվերսալը: Քառակուսի վրա հիմնված կառուցման մեթոդը հեշտացնում է վեցանկյունը այն դեպքում, երբ գծագրում արդեն կա խորանարդ, այլ կերպ ասած, երբ որոշվում են քառակուսու համամասնությունները և նրա կողմերի ուղղությունը:

Հիմնվելով քառակուսու վրա: Նայեք Նկ. 3.67. Քառակուսու մեջ գրված վեցանկյունը հավասար է քառակուսու կողքին հորիզոնական ուղղությամբ 5 - 2, իսկ նրա երկարությունից փոքր է ուղղահայաց ուղղությամբ:

Ուղղահայաց վեցանկյուն: Հեռանկարում ուղղահայաց քառակուսի նկարեք: Ուղիղ գիծ գծե՛ք դրա հորիզոնական կողմերին զուգահեռ անկյունագծերի հատման միջով: Ստացված հատվածը 5 - 2 բաժանեք չորս հավասար մասերի և ուղղահայաց գծեր գծեք A և B կետերի միջով (նկ. 3.68): Վերևում և ներքևում վեցանկյունը սահմանազատող գծերը չեն համընկնում քառակուսու կողմերի հետ: Գծի՛ր դրանք քառակուսու հորիզոնական կողմերից որոշակի հեռավորության վրա (1114 ա) և դրանց զուգահեռ։ Այս կերպ հայտնաբերված 1-ին և 3-րդ կետերը միացնելով 2-րդ կետին, իսկ 6-րդ և 4-րդ կետերը 5-րդ կետին, ստանում ենք վեցանկյուն (նկ. 3.69):

Նույն հաջորդականությամբ կառուցված է հորիզոնական վեցանկյուն (նկ. 3.70 և 3.71):

Կառուցման այս մեթոդը հարմար է միայն բավարար բացվածքով վեցանկյունների համար: Եթե ​​վեցանկյունի բացվածքը աննշան է, ապա ավելի լավ է օգտագործել սահմանափակ շրջանակի վրա հիմնված մեթոդը: Քառակուսու միջով կառուցված վեցանկյունը ստուգելու համար կարող եք օգտագործել ձեզ արդեն հայտնի մեթոդներ:

Բացի այդ, կա ևս մեկ միջոց՝ նկարագրել ստացված վեցանկյունի շուրջ շրջան (ձեր գծագրում՝ էլիպս): Վեցանկյան բոլոր գագաթները պետք է պատկանեն այս էլիպսին:

Երբ դուք տիրապետում եք վեցանկյուն նկարելու հմտություններին, ազատ կլինեք անցնել վեցանկյուն պրիզմայի գծագրմանը: Ուշադիր նայեք Նկ. 3.72, ինչպես նաև շրջագծված շրջանագծի (նկ. 3.73; 3.74 և 3.75) և քառակուսու վրա հիմնված վեցանկյուն պրիզմաների կառուցման դիագրամներ (նկ. 3.76; 3.77 և 3.78): Գծե՛ք ուղղահայաց և հորիզոնական վեցանկյունները տարբեր ձևերով: Ուղղահայաց վեցանկյունի գծագրում կողային երեսների երկար կողմերը կլինեն միմյանց զուգահեռ ուղղահայաց ուղիղ գծեր, իսկ հիմքի վեցանկյունն ավելի բաց կլինի, որքան հեռու լինի հորիզոնի գծից: Հորիզոնական վեցանկյունի գծագրում կողային երեսների երկար կողմերը կմիավորվեն հորիզոնի անհետացման կետում, և հիմքի վեցանկյունի բացվածքն ավելի մեծ կլինի, որքան հեռու լինի այն դիտողից: Վեցանկյուն պատկերելիս նաև համոզվեք, որ երկու հիմքերի զուգահեռ եզրերը համընկնում են հեռանկարում (նկ. 3.79; 3.80):

Վեցանկյուն ցանցերը (վեցանկյուն ցանցեր) օգտագործվում են որոշ խաղերում, բայց դրանք այնքան պարզ կամ սովորական չեն, որքան ուղղանկյուն ցանցերը: Ես հավաքում եմ ռեսուրսներ վեցանկյուն ցանցերի վրա գրեթե 20 տարի, և ես գրել եմ այս ուղեցույցը ամենաէլեգանտ մոտեցումների համար, որոնք իրականացվել են ամենապարզ կոդով: Այս հոդվածը լայնորեն օգտագործում է Չարլզ Ֆուի և Քլարկ Վերբրյուջի ուղեցույցները: Ես նկարագրելու եմ վեցանկյուն ցանցերի ստեղծման տարբեր եղանակները, դրանց հարաբերությունները և ամենատարածված ալգորիթմները: Այս հոդվածի շատ մասեր ինտերակտիվ են. ցանցի տեսակ ընտրելը փոխում է համապատասխան դիագրամները, կոդը և տեքստերը: (Ծանոթագրություն՝ սա վերաբերում է միայն բնօրինակին, խորհուրդ եմ տալիս ուսումնասիրել այն։ Թարգմանության մեջ բնագրի ողջ տեղեկատվությունը պահպանված է, բայց առանց ինտերակտիվության։).

Հոդվածում կոդերի օրինակները գրված են կեղծ կոդով, ուստի դրանք ավելի հեշտ է կարդալ և հասկանալ, որպեսզի գրեք ձեր սեփական կատարումը:

Երկրաչափություն

Վեցանկյունները վեցակողմ բազմանկյուններ են։ Կանոնավոր վեցանկյունները ունեն նույն երկարության բոլոր կողմերը (եզրերը): Մենք աշխատելու ենք միայն սովորական վեցանկյուններով։ Որպես կանոն, վեցանկյուն ցանցերն օգտագործում են հորիզոնական (սուր վերև) և ուղղահայաց (հարթ վերև) կողմնորոշումներ:


Վեցանկյուններ՝ հարթ (ձախ) և սուր (աջ) գագաթներով

Վեցանկյուններն ունեն 6 դեմք: Յուրաքանչյուր դեմք ընդհանուր է երկու վեցանկյունների համար: Վեցանկյուններն ունեն 6 անկյունային կետ: Յուրաքանչյուր անկյունային կետ ընդհանուր է երեք վեցանկյունների համար: Դուք կարող եք ավելին կարդալ կենտրոնների, եզրերի և անկյունային կետերի մասին իմ հոդվածում ցանցային մասերի մասին (քառակուսիներ, վեցանկյուններ և եռանկյուններ):

Անկյուններ

Կանոնավոր վեցանկյունում ներքին անկյունները 120° են։ Կան վեց «սեպ», որոնցից յուրաքանչյուրը հավասարակողմ եռանկյունի է՝ 60° ներքին անկյուններով։ Անկյունային կետ եսգտնվում է (60° * i) + 30° հեռավորության վրա, չափի միավորները կենտրոնից: Կոդում.

Hex_corner ֆունկցիան (կենտրոն, չափ, 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) )
Վեցանկյունը լրացնելու համար անհրաժեշտ է ստանալ բազմանկյան գագաթները hex_corner(…, 0)-ից hex_corner(…, 5): Վեցանկյունի ուրվագիծը գծելու համար անհրաժեշտ է օգտագործել այս գագաթները, այնուհետև նորից գծել գիծը hex_corner (..., 0) .

Երկու կողմնորոշումների միջև տարբերությունն այն է, որ x-ը և y-ը փոխվում են, ինչը հանգեցնում է անկյունների փոփոխության. հարթ վերևի վեցանկյուններն ունեն 0°, 60°, 120°, 180°, 240°, 300° և սրածայր անկյուններ: վեցանկյուններն ունեն 30°, 90°, 150°, 210°, 270°, 330° անկյուններ:


Վեցանկյունների անկյունները հարթ և սուր գագաթներով

Չափը և գտնվելու վայրը

Այժմ մենք ցանկանում ենք մի քանի վեցանկյուններ միասին տեղադրել: Հորիզոնական կողմնորոշման դեպքում վեցանկյան բարձրությունը բարձրություն = չափ * 2 է: Հարակից վեցանկյունների միջև ուղղահայաց հեռավորությունը վերտ = բարձրություն * 3/4 ​​է:

Վեցանկյուն լայնությունը = sqrt(3)/2 * բարձրություն . Հարակից վեցանկյունների միջև հորիզոնական հեռավորությունը հորիզ = լայնություն է:

Որոշ խաղեր օգտագործում են պիքսելային արվեստ վեցանկյունների համար, որը ճիշտ չի համընկնում սովորական վեցանկյունների հետ: Այս բաժնում նկարագրված անկյունների և տեղադրման բանաձևերը չեն համապատասխանի նման վեցանկյունների չափերին: Հոդվածի մնացած մասը, որը նկարագրում է վեցանկյուն ցանցի ալգորիթմները, կիրառվում է նույնիսկ եթե վեցանկյունները մի փոքր ձգված են կամ ճզմված:



Կոորդինատների համակարգեր

Սկսենք վեցանկյունները ցանցի մեջ հավաքել։ Քառակուսիների ցանցերի դեպքում հավաքման միայն մեկ ակնհայտ միջոց կա. Վեցանկյունների համար կան բազմաթիվ մոտեցումներ: Ես խորհուրդ եմ տալիս օգտագործել խորանարդ կոորդինատները որպես հիմնական ներկայացում: Քարտեզները պահելու և օգտագործողին կոորդինատները ցուցադրելու համար պետք է օգտագործվեն առանցքային կոորդինատները կամ օֆսեթ կոորդինատները:

Օֆսեթ կոորդինատներ

Ամենատարածված մոտեցումը յուրաքանչյուր հաջորդ սյունակի կամ տողի փոխհատուցումն է: Սյունակները նշանակված են col կամ q: Տողերը նշվում են տողով կամ r . Դուք կարող եք փոխհատուցել կենտ կամ զույգ սյունակները/տողերը, այնպես որ հորիզոնական և ուղղահայաց վեցանկյուններից յուրաքանչյուրն ունի երկու տարբերակ:


Հորիզոնական դասավորություն «կենտ-r»


Հորիզոնական դասավորություն «զույգ-r»


Ուղղահայաց «կենտ-ք» դասավորություն


Ուղղահայաց դասավորություն «զույգ-q»

Խորանարդ կոորդինատներ

Վեցանկյուն ցանցերին նայելու մեկ այլ միջոց է դրանք տեսնել որպես երեքհիմնական առանցքները, ոչ երկու, ինչպես քառակուսիների ցանցերում։ Նրանք ցուցադրում են էլեգանտ սիմետրիա:

Վերցնենք խորանարդի ցանց և եկեք կտրենք այնանկյունագծային հարթություն x + y + z = 0-ում: Սա տարօրինակ գաղափար է, բայց այն կօգնի մեզ պարզեցնել վեցանկյուն ցանցի ալգորիթմները: Մասնավորապես, մենք կկարողանանք օգտագործել ստանդարտ գործողություններ դեկարտյան կոորդինատներից՝ կոորդինատների գումարում և հանում, բազմապատկում և բաժանում սկալյար մեծությամբ, ինչպես նաև հեռավորություններ:

Ուշադրություն դարձրեք խորանարդների ցանցի երեք հիմնական առանցքներին և դրանց փոխհարաբերությանը վեցի հետ անկյունագծայինվեցանկյուն ցանցի ուղղությունները: Ցանցի անկյունագծային առանցքները համապատասխանում են վեցանկյուն ցանցի հիմնական ուղղությանը:


Վեցանկյուններ


խորանարդներ

Քանի որ մենք արդեն ունենք քառակուսի և խորանարդ ցանցերի ալգորիթմներ, խորանարդ կոորդինատների օգտագործումը թույլ է տալիս մեզ հարմարեցնել այս ալգորիթմները վեցանկյուն ցանցերին: Ես կօգտագործեմ այս համակարգը հոդվածի ալգորիթմների մեծ մասի համար: Այլ կոորդինատային համակարգով ալգորիթմներն օգտագործելու համար ես փոխակերպում եմ խորանարդ կոորդինատները, գործարկում եմ ալգորիթմը և այնուհետև դրանք նորից փոխակերպում:

Իմացեք, թե ինչպես են աշխատում խորանարդ կոորդինատները վեցանկյուն ցանցի համար: Երբ ընտրում եք վեցանկյուններ, երեք առանցքներին համապատասխանող խորանարդ կոորդինատները ընդգծվում են:

  1. Խորանարդային ցանցի յուրաքանչյուր ուղղությունը համապատասխանում է տողերվեցանկյունների ցանցի վրա: Փորձեք ընտրել վեցանկյուն z-ով, որը հավասար է 0, 1, 2, 3-ի՝ կապը տեսնելու համար: Գիծը նշված է կապույտով: Փորձեք նույնը x (կանաչ) և y (մանուշակագույն):
  2. Վեցանկյուն ցանցի յուրաքանչյուր ուղղություն խորանարդային ցանցի երկու ուղղությունների համակցություն է: Օրինակ, վեցանկյուն ցանցի «հյուսիսը» գտնվում է +y-ի և -z-ի միջև, այնպես որ յուրաքանչյուր քայլ «հյուսիս»-ով մեծացնում է y-ը 1-ով և փոքրացնում z-ը 1-ով:
Խորանարդ կոորդինատները ողջամիտ ընտրություն են վեցանկյուն ցանցի կոորդինատային համակարգի համար: Պայմանը x + y + z = 0 է, ուստի այն պետք է պահպանվի ալգորիթմներում: Պայմանն ապահովում է նաև, որ յուրաքանչյուր վեցանկյունի համար միշտ կլինի կանոնական կոորդինատ:

Կան բազմաթիվ տարբեր կոորդինատային համակարգեր խորանարդների և վեցանկյունների համար: Նրանցից մի քանիսում պայմանը տարբերվում է x + y + z = 0-ից: Ես ցույց տվեցի բազմաթիվ համակարգերից միայն մեկը: Դուք կարող եք նաև ստեղծել խորանարդ կոորդինատներ x-y, y-z, z-x-ով, որոնք ունեն իրենց հետաքրքիր հատկությունների հավաքածուն, բայց ես այստեղ չեմ անդրադառնա դրանց:

Բայց դուք կարող եք պնդել, որ դուք չեք ցանկանում 3 թվեր պահել կոորդինատների համար, քանի որ չգիտեք, թե ինչպես պահել քարտեզն այդ կերպ:

Առանցքային կոորդինատներ

Առանցքային կոորդինատային համակարգը, որը երբեմն կոչվում է «տրապեզոիդ» կոորդինատային համակարգ, կառուցված է խորանարդ կոորդինատային համակարգից երկու կամ երեք կոորդինատներից։ Քանի որ մենք ունենք x + y + z = 0 պայմանը, երրորդ կոորդինատը պետք չէ։ Առանցքային կոորդինատները օգտակար են քարտեզները պահելու և օգտագործողին կոորդինատները ցուցադրելու համար: Ինչպես խորանարդ կոորդինատների դեպքում, դուք կարող եք օգտագործել դեկարտյան կոորդինատների գումարման, հանելու, բազմապատկելու և բաժանելու ստանդարտ գործողությունները:

Կան բազմաթիվ խորանարդ կոորդինատային համակարգեր և բազմաթիվ առանցքային համակարգեր: Ես չեմ լուսաբանի այս ուղեցույցի բոլոր համակցությունները: Ես կընտրեմ երկու փոփոխական՝ q (սյունակ) և r (տող): Այս հոդվածի գծապատկերներում q-ը համապատասխանում է x-ին, իսկ r-ը համապատասխանում է z-ին, սակայն այս համապատասխանությունը կամայական է, քանի որ դուք կարող եք պտտել և պտտել դիագրամները՝ տարբեր համապատասխանություններ ստանալու համար:

Այս համակարգի առավելությունը տեղաշարժման ցանցերի նկատմամբ այն է, որ ալգորիթմներն ավելի հասկանալի են: Համակարգի բացասական կողմն այն է, որ ուղղանկյուն քարտ պահելը մի փոքր տարօրինակ է. տես քարտեզների պահպանման բաժինը: Որոշ ալգորիթմներ նույնիսկ ավելի պարզ են խորանարդ կոորդինատներում, բայց քանի որ մենք ունենք x + y + z = 0 պայմանը, մենք կարող ենք հաշվարկել երրորդ ենթադրյալ կոորդինատը և օգտագործել այն այս ալգորիթմներում: Իմ նախագծերում ես անվանում եմ առանցքները q, r, s, այնպես որ պայմանը կարծես q + r + s = 0 է, և անհրաժեշտության դեպքում կարող եմ հաշվարկել s = -q - r:

Առանցքներ

Օֆսեթ կոորդինատները առաջին բանն են, ինչի մասին շատերը մտածում են, քանի որ դրանք նույնն են, ինչ ստանդարտ դեկարտյան կոորդինատները, որոնք օգտագործվում են քառակուսիների ցանցերի համար: Ցավոք սրտի, երկու առանցքներից մեկը պետք է վազի հացահատիկի դեմ, և դա ավարտվում է ամեն ինչ բարդացնելով: Խորանարդի և առանցքի համակարգերը անցնում են հեռավորության վրա և ունեն ավելի պարզ ալգորիթմներ, բայց քարտի պահպանումը մի փոքր ավելի բարդ է: Կա մեկ այլ համակարգ, որը կոչվում է «փոխարինվող» կամ «երկակի», բայց մենք այն այստեղ չենք դիտարկի. ոմանց համար ավելի հեշտ է աշխատել, քան խորանարդ կամ առանցքային:


Օֆսեթ կոորդինատներ, խորանարդ և առանցքային

Առանցքայն ուղղությունն է, որով մեծանում է համապատասխան կոորդինատը: Առանցքին ուղղահայաց է այն ուղիղը, որի վրա կոորդինատը մնում է հաստատուն: Վերևում գտնվող ցանցային դիագրամները ցույց են տալիս ուղղահայաց գծեր:

Համակարգել վերափոխումը

Հավանական է, որ դուք կօգտագործեք առանցքային կամ օֆսեթ կոորդինատներ ձեր դիզայնում, սակայն շատ ալգորիթմներ ավելի հեշտ են արտահայտվում խորանարդ կոորդինատներով: Հետևաբար, մենք պետք է կարողանանք փոխակերպել կոորդինատները համակարգերի միջև:

Առանցքային կոորդինատները սերտորեն կապված են խորանարդ կոորդինատների հետ, ուստի փոխակերպումը պարզ է.

# փոխարկել խորանարդը առանցքային կոորդինատների q = x r = z # փոխարկել առանցքային կոորդինատների խորանարդի x = q z = r y = -x-z
Կոդում այս երկու գործառույթները կարող են գրվել հետևյալ կերպ.

Function cube_to_hex(h): # առանցքային var q = h.x var r = h.z վերադարձ Hex(q, r) ֆունկցիա hex_to_cube(h): # խորանարդ var x = h.q var z = h.r var y = -x-z վերադարձ Cube(x, y): , զ)
Օֆսեթ կոորդինատները մի փոքր ավելի բարդ են.

Հարակից վեցանկյուններ

Հաշվի առնելով մեկ վեցանկյունը, ո՞ր վեց վեցանկյունի կողքին է այն: Ինչպես կարող եք ակնկալել, պատասխանն ամենահեշտն է խորանարդ կոորդինատներում, բավականին հեշտ է առանցքային կոորդինատներում և մի փոքր ավելի դժվար է տեղաշարժման կոորդինատներում: Հնարավոր է, որ ձեզ անհրաժեշտ լինի հաշվարկել վեց «անկյունագծ» վեցանկյուն:

Խորանարդ կոորդինատներ

Վեցանկյուն կոորդինատներում մեկ տարածություն տեղափոխելը հանգեցնում է նրան, որ երեք խորանարդ կոորդինատներից մեկը փոխվում է +1-ի, իսկ մյուսը՝ -1-ի (գումարը պետք է մնա 0): +1-ի դեպքում երեք հնարավոր կոորդինատները կարող են փոխվել, իսկ -1-ում՝ մնացած երկուսը: Սա մեզ տալիս է վեց հնարավոր փոփոխություն: Յուրաքանչյուրը համապատասխանում է վեցանկյան ուղղություններից մեկին: Ամենապարզ և ամենաարագ ճանապարհը փոփոխությունները նախապես հաշվարկելն է և դրանք կոմպիլյացիայի ժամանակ տեղադրել Cube (dx, dy, dz) խորանարդ կոորդինատների աղյուսակում.

Var ուղղություններ = [ Cube(+1, -1, 0), Cube(+1, 0, -1), Cube(0, +1, -1), Cube(-1, +1, 0), Cube( -1, 0, +1), Cube(0, -1, +1) ] ֆունկցիա խորանարդ_ուղղություն(ուղղություն). վերադարձի ուղղություններ ֆունկցիա cube_neighbor(վեցանկյուն, ուղղություն). վերադարձ խորանարդ_ավելացում(վեցանկյուն, խորանարդ_ուղղություն(ուղղություն))

Առանցքային կոորդինատներ

Ինչպես նախկինում, սկզբից մենք օգտագործում ենք խորանարդային համակարգը: Վերցնենք Cube(dx, dy, dz) աղյուսակը և այն վերածենք Hex(dq, dr) աղյուսակի.

Var ուղղություններ = [ Hex(+1, 0), Hex(+1, -1), Hex(0, -1), Hex(-1, 0), Hex(-1, +1), Hex(0, +1) ] ֆունկցիա hex_direction(ուղղություն). վերադարձի ուղղություններ ֆունկցիա hex_neighbor(hex, ուղղություն): var dir = hex_direction(direction) return Hex(hex.q + dir.q, hex.r + dir.r)

Օֆսեթ կոորդինատներ

Առանցքային կոորդինատներում մենք փոփոխություններ ենք կատարում՝ կախված ցանցի վրա գտնվելու վայրից: Եթե ​​մենք գտնվում ենք օֆսեթ սյունակում/տողում, ապա կանոնը տարբերվում է առանց օֆսեթի սյունակի/տողի դեպքից։

Ինչպես նախկինում, մենք ստեղծում ենք թվերի աղյուսակ, որոնք պետք է ավելացվեն սյունակին և տողին: Այնուամենայնիվ, այս անգամ մենք կունենանք երկու զանգված՝ մեկը կենտ սյունակների/տողերի, իսկ մյուսը՝ զույգերի համար: Նայեք (1,1) ցանցի քարտեզի վերևի պատկերում և նկատեք, թե ինչպես են փոխվում սյունակը և տողը վեց ուղղություններով շարժվելիս: Հիմա եկեք կրկնենք գործընթացը (2,2): Աղյուսակները և ծածկագիրը տարբեր կլինեն չորս տեսակի տեղաշարժման ցանցերից յուրաքանչյուրի համար, ահա յուրաքանչյուր ցանցի համապատասխան ծածկագիրը:

Կենտ-ռ
var ուղղություններ = [ [ 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) ] ] ֆունկցիա offset_neighbor (վեցանկյուն, ուղղություն). var parity = hex.row & 1 var dir = ուղղությունները վերադարձնում Hex(hex.col + dir.col, hex.row + dir.row)


Նույնիսկ-ր
var ուղղություններ = [ [ 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) ] ] ֆունկցիա offset_neighbor (վեցանկյուն, ուղղություն). var parity = hex.row & 1 var dir = ուղղությունները վերադարձնում Hex(hex.col + dir.col, hex.row + dir.row)


Ցանց զույգ (ԶՈՒԳ) և կենտ (ԿՕԴ) տողերի համար

Կենտ-ք
var ուղղություններ = [ [ 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) ] ] ֆունկցիա offset_neighbor (վեցանկյուն, ուղղություն). var parity = hex.col & 1 var dir = ուղղությունները վերադարձնում են Hex(hex.col + dir.col, hex.row + dir.row)


Զույգ-ք
var ուղղություններ = [ [ 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) ] ] ֆունկցիա offset_neighbor (վեցանկյուն, ուղղություն). var parity = hex.col & 1 var dir = ուղղությունները վերադարձնում են Hex(hex.col + dir.col, hex.row + dir.row)


Զույգ (ԶՈՒԳ) և կենտ (ԿՕԴ) սյունակների ցանց

Անկյունագծեր

Վեց կոորդինատներում «անկյունագծային» տարածության մեջ շարժվելով երեք խորանարդ կոորդինատներից մեկը փոխվում է ±2-ով, իսկ մյուս երկուսը ∓1-ով (գումարը պետք է մնա 0):

Var անկյունագծեր = [ Cube(+2, -1, -1), Cube(+1, +1, -2), Cube(-1, +2, -1), Cube(-2, +1, +1 ), Cube(-1, -1, +2), Cube(+1, -2, +1) ] ֆունկցիա cube_diagonal_neighbor(վեցանկյուն, ուղղություն). վերադարձ խորանարդ_ավելացնել(վեցանկյուն, անկյունագծեր)
Ինչպես նախկինում, մենք կարող ենք այս կոորդինատները վերածել առանցքային կոորդինատների՝ բաց թողնելով երեք կոորդինատներից մեկը, կամ փոխարկել դրանք օֆսեթ կոորդինատների՝ նախ հաշվարկելով արդյունքները:


Հեռավորություններ

Խորանարդ կոորդինատներ

Խորանարդ կոորդինատային համակարգում յուրաքանչյուր վեցանկյուն խորանարդ է եռաչափ տարածության մեջ: Հարակից վեցանկյունները վեցանկյուն ցանցում գտնվում են 1 հեռավորության վրա, իսկ խորանարդի ցանցում՝ 2 հեռավորության վրա: Սա հեշտացնում է հեռավորությունների հաշվարկը: Քառակուսիների ցանցում Մանհեթենի հեռավորությունները abs(dx) + abs(dy) են: Խորանարդների ցանցում Մանհեթենի հեռավորությունները abs(dx) + abs(dy) + abs(dz) են: Վեցանկյուն ցանցում հեռավորությունը հավասար է դրանց կեսին.

Function cube_distance(a, b): վերադարձ (abs(a.x - b.x) + abs(a.y - b.y) + abs(a.z - b.z)) / 2
Այս նշման համարժեքը կլինի, եթե ասենք, որ երեք կոորդինատներից մեկը պետք է լինի մյուս երկուսի գումարը, և այն ընդունենք որպես հեռավորություն: Ստորև կարող եք ընտրել կիսով չափ կամ առավելագույն արժեքի ձևը, բայց դրանք տալիս են նույն արդյունքը.

cube_distance(a, b) ֆունկցիան. վերադարձ առավելագույնը (abs(a.x - b.x), abs(a.y - b.y), abs(a.z - b.z))
Նկարում առավելագույն արժեքները ընդգծված են գույնով: Նշենք նաև, որ յուրաքանչյուր գույն ներկայացնում է վեց «անկյունագծ» ուղղություններից մեկը:

GIF


Առանցքային կոորդինատներ

Առանցքային համակարգում երրորդ կոորդինատը արտահայտվում է անուղղակիորեն: Հեռավորությունը հաշվարկելու համար առանցքայինից փոխարկենք խորանարդի.

Ֆունկցիա hex_distance(a, b). var ac = hex_to_cube(a) var bc = hex_to_cube(b) վերադարձ խորանարդի_հեռավորություն(ac, bc)
Եթե ​​ձեր դեպքում կոմպիլյատորը inline (inline) hex_to_cube և cube_distance, ապա այն կստեղծի հետևյալ կոդ.

Hex_distance(a, b) ֆունկցիա՝ վերադարձ (abs(a.q - b.q) + abs(a.q + a.r - b.q - b.r) + abs(a.r - b.r)) / 2
Վեցանկյունների միջև հեռավորությունները առանցքային կոորդինատներով գրելու տարբեր եղանակներ կան, բայց անկախ գրելու եղանակից. առանցքային համակարգում վեցանկյունների միջև հեռավորությունը վերցված է Մանհեթենի հեռավորությունից խորանարդ համակարգում. Օրինակ, նկարագրված «տարբերությունների տարբերությունը» ստացվում է a.q + a.r - b.q - b.r գրելով a.q - b.q + a.r - b.r և օգտագործելով առավելագույն արժեքի ձևը կիսատման ձևի փոխարեն cube_distance: Նրանք բոլորը նման են, եթե տեսնում եք կապը խորանարդ կոորդինատների հետ:

Օֆսեթ կոորդինատներ

Ինչպես առանցքային կոորդինատների դեպքում, մենք փոխակերպում ենք օֆսեթ կոորդինատները խորանարդ կոորդինատների և այնուհետև օգտագործում ենք խորանարդ հեռավորությունը:

Offset_distance(a, b) ֆունկցիան. var ac = offset_to_cube(a) var bc = offset_to_cube(b) վերադարձ խորանարդի_հեռավորություն(ac, bc)
Մենք կօգտագործենք նույն օրինաչափությունը շատ ալգորիթմների համար. վեցանկյուններից փոխարկեք խորանարդի, գործարկեք ալգորիթմի խորանարդ տարբերակը և խորանարդ արդյունքները փոխարկեք վեցանկյուն կոորդինատների (առանցքային կամ օֆսեթ կոորդինատներ):

Գծեր նկարելը

Ինչպե՞ս գծել մի վեցանկյունից մյուսը: Գծեր գծելու համար ես օգտագործում եմ գծային ինտերպոլացիա: Գծը հավասարաչափ նմուշառվում է N+1 կետերում և հաշվարկվում է, թե որ վեցանկյուններում են գտնվում այդ նմուշները:

GIF


  1. Սկզբում մենք հաշվարկում ենք N, որը կլինի վեցանկյուններով հեռավորությունը ծայրակետերի միջև:
  2. Այնուհետև մենք հավասարաչափ ընտրում ենք N+1 կետեր A և B կետերի միջև: Օգտագործելով գծային ինտերպոլացիա, մենք որոշում ենք, որ i-ի արժեքների համար 0-ից մինչև N, ներառյալ դրանք, յուրաքանչյուր կետ կլինի A + (B - A) * 1.0/N *: ես . Նկարում այս հսկիչ կետերը ներկայացված են կապույտով: Արդյունքը լողացող կետի կոորդինատներն են:
  3. Եկեք յուրաքանչյուր կառավարման կետ (լողացող) դարձնենք վեցանկյունների (int): Ալգորիթմը կոչվում է cube_round (տե՛ս ստորև):
Ամեն ինչ հավաքեք A-ից B գիծ քաշելու համար.

lerp(a, b, t) ֆունկցիան. // float վերադարձի համար a + (b - a) * t ֆունկցիա cube_lerp(a, b, t): lerp(a.y, b.y, t), lerp(a.z, b.z, t)) ֆունկցիա cube_linedraw(a, b): var N = խորանարդ_հեռավորություն(a, b) var արդյունքներ = յուրաքանչյուր 0 ≤ i ≤ N: results.append( cube_round(cube_lerp(a, b, 1.0/N * i))) վերադարձնել արդյունքները
Նշումներ:

  • Կան դեպքեր, երբ cube_lerp-ը վերադարձնում է մի կետ, որը գտնվում է երկու վեցանկյունների միջև ընկած եզրին: Այնուհետև cube_round-ը այն տեղափոխում է այս կամ այն ​​ուղղությամբ: Գծերը ավելի լավ տեսք ունեն, եթե դրանք տեղափոխվեն մեկ ուղղությամբ: Դա կարելի է անել՝ ավելացնելով «epsilon»-վեցանկյուն խորանարդ (1e-6, 1e-6, -2e-6) մեկ կամ երկու վերջնակետերում, նախքան հանգույցը սկսելը: Սա «կշպրտի» գիծը մեկ ուղղությամբ, որպեսզի այն չհարվածի եզրերին:
  • Քառակուսի ցանցերում DDA գծի ալգորիթմը հավասարեցնում է N-ը առանցքներից յուրաքանչյուրի երկայնքով առավելագույն հեռավորությանը: Մենք նույն բանն ենք անում խորանարդ տարածության մեջ, որը նման է վեցանկյուն ցանցի հեռավորությանը:
  • Cube_lerp ֆունկցիան պետք է վերադարձնի float կոորդինատներով խորանարդ: Եթե ​​դուք ծրագրավորում եք ստատիկ տպագրված լեզվով, ապա չեք կարողանա օգտագործել Cube տեսակը: Փոխարենը կարող եք սահմանել FloatCube տեսակը, կամ ձեր գծագրման կոդի մեջ մի ֆունկցիա ներդնել, եթե չեք ցանկանում այլ տեսակ սահմանել:
  • Դուք կարող եք օպտիմիզացնել կոդը inline cube_lerp-ի միջոցով, այնուհետև հաշվարկել B.x-A.x, B.x-A.y և 1.0/N օղակից դուրս: Բազմապատկումը կարող է վերածվել կրկնվող գումարման: Արդյունքը կլինի DDA գծի ալգորիթմի նման մի բան:
  • Ես օգտագործում եմ առանցքային կամ խորանարդ կոորդինատներ գծեր գծելու համար, բայց եթե ցանկանում եք աշխատել օֆսեթ կոորդինատներով, ստուգեք:
  • Գծեր գծելու շատ տարբերակներ կան: Երբեմն պահանջվում է «գերածածկույթ»: Ինձ ուղարկել են վեցանկյուններով գերծածկված գծեր գծելու կոդը, բայց ես դեռ չեմ ուսումնասիրել այն:

Շարժվող միջակայք

Կոորդինատների միջակայք

Հաշվի առնելով վեցանկյուն կենտրոնը և N միջակայքը, ո՞ր վեցանկյուններն են գտնվում դրանից N քայլի սահմաններում:

Մենք կարող ենք հակադարձ անել վեցանկյունների միջև հեռավորության բանաձևից հեռավորություն = max(abs(dx), abs(dy), abs(dz)) . N-ում բոլոր վեցանկյունները գտնելու համար մեզ անհրաժեշտ է max(abs(dx), abs(dy), abs(dz)) ≤ N: Սա նշանակում է, որ անհրաժեշտ են բոլոր երեք արժեքները՝ abs(dx) ≤ N և abs(dy) ≤ N և abs(dz) ≤ N: Բացարձակ արժեքը հանելով՝ ստանում ենք -N ≤ dx ≤ N և -N ≤ dy ≤ N և -N ≤ dz ≤ N: Կոդում սա կլինի ներդիր հանգույց.

Var արդյունքներ = յուրաքանչյուր -N ≤ dx ≤ N: յուրաքանչյուրի համար -N ≤ dy ≤ N: յուրաքանչյուրի համար -N ≤ dz ≤ N: եթե dx + dy + dz = 0: results.append(cube_add(center, Cube(dx) , դի, ձ)))
Այս ցիկլը կաշխատի, բայց բավականին անարդյունավետ կլինի։ Բոլոր dz արժեքներից, որոնք մենք անցնում ենք, միայն մեկն է իրականում բավարարում խորանարդի պայմանը dx + dy + dz = 0: Փոխարենը, մենք ուղղակիորեն կհաշվարկենք dz-ի արժեքը՝ բավարարելով պայմանը.

Var արդյունքներ = յուրաքանչյուր -N ≤ dx ≤ N. յուրաքանչյուր max(-N, -dx-N) ≤ dy ≤ min(N, -dx+N): var dz = -dx-dy results.append(cube_add( կենտրոն, խորանարդ (dx, dy, dz)))
Այս ցիկլը անցնում է միայն անհրաժեշտ կոորդինատների երկայնքով: Նկարում յուրաքանչյուր միջակայք զույգ տող է: Յուրաքանչյուր տող անհավասարություն է: Մենք վերցնում ենք բոլոր վեցանկյունները, որոնք բավարարում են վեց անհավասարությունները:

GIF


Համընկնող միջակայքեր

Եթե ​​Ձեզ անհրաժեշտ է գտնել վեցանկյուններ, որոնք գտնվում են բազմաթիվ տիրույթներում, կարող եք հատել միջակայքերը՝ նախքան վեցանկյունների ցուցակ ստեղծելը:

Այս խնդրին կարելի է մոտենալ հանրահաշվի կամ երկրաչափության տեսանկյունից։ Հանրահաշվորեն, յուրաքանչյուր շրջան արտահայտվում է որպես -N ≤ dx ≤ N ձևի անհավասարության պայմաններ, և մենք պետք է գտնենք այս պայմանների հատումը: Երկրաչափական առումով յուրաքանչյուր շրջան 3D տարածության մեջ խորանարդ է, և մենք կհատենք երկու խորանարդ 3D տարածության մեջ՝ 3D տարածության մեջ խորանարդ ստանալու համար: Այնուհետև մենք այն նորից նախագծում ենք x + y + z = 0 հարթության վրա՝ վեցանկյուններ ստանալու համար: Այս խնդիրը կլուծեմ հանրահաշվով։

Նախ, մենք վերագրում ենք -N ≤ dx ≤ N պայմանը ավելի ընդհանուր x min ≤ x ≤ x max ձևով և վերցնում x min = կենտրոն.x - N և x max = կենտրոն.x + N: Եկեք նույնն անենք y-ի և z-ի համար՝ ստանալով նախորդ բաժնի կոդի ընդհանուր ձևը.

Var արդյունքներ = յուրաքանչյուր xmin-ի համար ≤ x ≤ xmax. յուրաքանչյուր max(ymin, -x-zmax) ≤ y ≤ min(ymax, -x-zmin): var z = -x-y results.append(Cube(x, y, զ))
a ≤ x ≤ b և c ≤ x ≤ d երկու միջակայքերի հատումը max(a, c) ≤ x ≤ min(b, d) է: Քանի որ վեցանկյունների տարածքը արտահայտվում է որպես x, y, z միջակայքեր, մենք կարող ենք առանձին հատել x, y, z միջակայքներից յուրաքանչյուրը և այնուհետև օգտագործել ներդիր հանգույց՝ խաչմերուկում վեցանկյունների ցուցակ ստեղծելու համար: Վեցանկյունների մեկ տարածքի համար մենք վերցնում ենք x min = H.x - N և x max = H.x + N, նմանապես y-ի և z-ի համար: Երկու վեցանկյուն շրջանների հատման համար մենք վերցնում ենք x min = max (H1.x - N, H2.x - N) և x max = min (H1.x + N, H2.x + N) նմանապես y և զ . Նույն օրինակը գործում է երեք կամ ավելի տարածքների հատման համար:

GIF


Խոչընդոտներ

Եթե ​​կան խոչընդոտներ, ապա ամենահեշտ ճանապարհը հեռավորության սահմանափակմամբ լրացնելն է (լայնություն-առաջին որոնում): Ստորև բերված նկարում մենք սահմանափակվում ենք չորս քայլով: Կոդում եզրերը[k]-ը բոլոր վեցանկյունների զանգվածն է, որին կարելի է հասնել k քայլերով։ Ամեն անգամ, երբ մենք անցնում ենք հիմնական օղակով, մենք ընդլայնում ենք k-1 մակարդակը ըստ k մակարդակի:

cube_reachable ֆունկցիան (սկիզբ, շարժում). var visited = set() ավելացնել սկիզբը այցելած var fringes = fringes.append() յուրաքանչյուր 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

Շրջադարձներ

Հաշվի առնելով վեցանկյուն վեկտորը (երկու վեցանկյունների տարբերությունը), մենք կարող ենք այն պտտել այնպես, որ այն ցույց տա մյուս վեցանկյունը: Դա հեշտ է անել խորանարդ կոորդինատներով, եթե դուք հավատարիմ մնաք 1/6 շրջանագծի պտույտին:

60° պտույտը դեպի աջ տեղափոխում է յուրաքանչյուր կոորդինատ մեկ դիրք դեպի աջ.

[x, y, z]-ից [-z, -x, -y]
60° պտույտը դեպի ձախ յուրաքանչյուր կոորդինատը մեկ դիրքով տեղափոխում է ձախ.

[x, y, z]-ից [-y, -z, -x]



«Խաղալով» [բնօրինակ հոդվածում] գծապատկերով, կարող եք տեսնել, որ յուրաքանչյուր պտույտ 60° է փոփոխություններընշանավորում և ֆիզիկապես «պտտեցնում» կոորդինատները։ 120° պտույտից հետո նշանները նորից դառնում են նույնը։ 180° պտույտը փոխում է նշանները, բայց կոորդինատները վերադառնում են իրենց սկզբնական դիրքին:

Ահա P դիրքի պտտման ամբողջական հաջորդականությունը C կենտրոնական դիրքի շուրջ, որի արդյունքում ստացվում է նոր դիրք R.

  1. Փոխարկել P և C դիրքերը խորանարդ կոորդինատների:
  2. Վեկտորի հաշվարկը՝ հանելով կենտրոնը՝ P_from_C = P - C = Cube(P.x - C.x, P.y - C.y, P.z - C.z):
  3. Պտտեցնել P_from_C վեկտորը, ինչպես նկարագրված է վերևում, և վերջնական վեկտորին նշանակել R_from_C:
  4. Վեկտորի վերափոխումը դեպի դիրք՝ ավելացնելով կենտրոնը՝ 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. Վերափոխում է R խորանարդ դիրքը ցանկալի կոորդինատային համակարգին:
Փոխակերպման մի քանի փուլ կա, բայց դրանցից յուրաքանչյուրը բավականին պարզ է: Հնարավոր է կրճատել այս քայլերից մի քանիսը` սահմանելով ռոտացիան ուղղակիորեն առանցքային կոորդինատներով, բայց վեցանկյուն վեկտորները չեն աշխատում օֆսեթ կոորդինատների հետ, և ես չգիտեմ, թե ինչպես կրճատել օֆսեթ կոորդինատների քայլերը: Տե՛ս նաև stackexchange-ի քննարկումը ռոտացիան հաշվարկելու այլ եղանակների համար:

Մատանիներ

Պարզ մատանի

Պարզելու համար, թե արդյոք տրված վեցանկյունը պատկանում է տվյալ շառավղով օղակին, պետք է հաշվարկել այս վեցանկյունից մինչև կենտրոն հեռավորությունը և պարզել, թե արդյոք այն հավասար է շառավղին։ Բոլոր նման վեցանկյունների ցանկը ստանալու համար հարկավոր է կենտրոնից շառավղով քայլեր կատարել, այնուհետև հետևել պտտվող վեկտորներին օղակի երկայնքով ճանապարհին:

Function cube_ring (կենտրոն, շառավիղ). var results = # այս կոդը չի աշխատում շառավղով == 0; հասկանում ես ինչու var cube = cube_add(կենտրոն, խորանարդի_սանդղակ(cube_direction(4), շառավիղ)) յուրաքանչյուր 0 ≤ i< 6: for each 0 ≤ j < radius: results.append(cube) cube = cube_neighbor(cube, i) return results
Այս ծածկագրում խորանարդը սկսվում է օղակի վրա, որը ցույց է տրված մեծ սլաքով կենտրոնից մինչև գծապատկերի անկյունը: Սկսելու համար ես ընտրեցի 4-րդ անկյունը, քանի որ այն համապատասխանում է իմ ուղղության համարների շարժվող ուղուն: Ձեզ կարող է անհրաժեշտ լինել այլ մեկնարկային անկյուն: Ներքին օղակի յուրաքանչյուր փուլում խորանարդը մեկ վեցանկյունով շարժվում է օղակի շուրջ: 6 * շառավղով քայլերից հետո նա հայտնվում է այնտեղ, որտեղ սկսել է:


Պարույր օղակներ

Օղակների միջով պարույր ձևով անցնելով՝ կարող ենք լրացնել օղակների ներքին հատվածները.

cube_spiral ֆունկցիան (կենտրոն, շառավիղ). var արդյունքներ = յուրաքանչյուր 1 ≤ k ≤ շառավղով. արդյունքներ = արդյունքներ + խորանարդ օղակ (կենտրոն, k) վերադարձի արդյունքներ



Մեծ վեցանկյունի մակերեսը բոլոր շրջանագծերի գումարն է, գումարած 1 կենտրոնի համար: Տարածքը հաշվարկելու համար օգտագործեք այս բանաձևը.

Այս եղանակով վեցանկյունների անցումը կարող է օգտագործվել նաև շարժման միջակայքը հաշվարկելու համար (տե՛ս վերևում):

Տեսանելիության տարածք

Ի՞նչն է տեսանելի տվյալ դիրքից տվյալ հեռավորության վրա, և խոչընդոտները չեն արգելափակում: Սա որոշելու ամենապարզ ձևը յուրաքանչյուր վեցանկյունի վրա գիծ քաշելն է տվյալ տիրույթում: Եթե ​​գիծը չի համապատասխանում պատերին, ապա տեսնում եք վեցանկյուն: Տեղափոխեք ձեր մկնիկը վեցանկյունների վրա [բնօրինակ հոդվածի գծապատկերում]՝ տեսնելու, թե ինչպես են գծերը գծվում այս վեցանկյունների և գծերի հանդիպող պատերի վրա:

Այս ալգորիթմը կարող է դանդաղ լինել մեծ տարածքներում, բայց այն հեշտ է իրականացնել, ուստի խորհուրդ եմ տալիս սկսել դրանից:

GIF



Տեսանելիության շատ տարբեր սահմանումներ կան: Ցանկանու՞մ եք տեսնել մեկ այլ վեցանկյան կենտրոնը սկզբնականի կենտրոնից: Ցանկանու՞մ եք տեսնել մեկ այլ վեցանկյան որևէ հատված բնօրինակի կենտրոնից: Միգուցե մեկ այլ վեցանկյան որևէ մաս սկզբնականի որևէ կետից: Ձեր տեսադաշտը խոչընդոտող խոչընդոտները ավելի փոքր են, քան ամբողջական վեցանկյունը: Շրջանակն ավելի բարդ և բազմազան հասկացություն է, քան թվում է առաջին հայացքից: Սկսենք ամենապարզ ալգորիթմից, բայց ակնկալեք, որ այն անպայման ճիշտ կհաշվարկի պատասխանը ձեր նախագծում։ Նույնիսկ կան դեպքեր, երբ պարզ ալգորիթմը անտրամաբանական արդյունքներ է տալիս։

Ես ուզում եմ ընդլայնել այս ուղեցույցը ապագայում: ես ունեմ