Willе научиме како да прикажуваме шестоаголна призма во различни позиции.

Научете различни начини за градење редовен шестоаголник, нацртајте шестоаголни цртежи, проверете дали се точни. Нацртајте шестоаголни призми од шестоаголниците.

Размислете за хексадецималната призма на сл. 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). Сега нацртајте низ средните точки на радиусите - точките А и Б - прави линии нормални на права линија 5 - 2. Можете да ја пронајдете нивната насока користејќи ги тангентите кон елипсата на точките 5 и 2 (слика 3.59). Овие тангенти ќе бидат нормални на дијаметарот 5 - 2, а линиите исцртани низ точките А и Б паралелни со овие тангенти, исто така, ќе бидат нормални на линијата 5 - 2. Назначете ги точките добиени на пресекот на овие прави со елипсата како 1, 3, 4, 6 ((Види слика 3.60) Поврзете ги сите шест темиња со прави линии (слика 3.61).

Проверете ја исправноста на вашата конструкција на различни начини. Ако конструкцијата е точна, тогаш линиите што ги поврзуваат спротивните темиња на шестоаголникот се сечат во центарот на кругот (слика 3.62), а спротивните страни на шестоаголникот се паралелни со соодветните дијаметри (слика 3.63). Друг начин за проверка е прикажан на сл. 3,64.

Вертикален шестоаголник. Во таков шестоаголник, правите линии што ги поврзуваат точките 7 и 3, б и 4, како и тангентите со заокружениот круг во точките 5 и 2, имаат вертикална насока и ја задржуваат во перспективниот цртеж. Така, цртајќи две вертикални тангенти кон елипсата, ги наоѓаме точките 5 и 2 (точки на тангенција). Поврзете ги со права линија, а потоа поделете го добиениот дијаметар 5 - 2 на 4 еднакви сегменти, земајќи ги предвид нивните перспективни намалувања (слика 3.65). Нацртајте вертикални линии низ точките А и Б, и на нивниот пресек со елипсата пронајдете точки 1,3,6L4. Потоа поврзете ги точките 1 - 6 во серија со прави линии (слика 3.66). Проверете ја исправноста на конструкцијата на шестоаголникот на ист начин како и во претходниот пример.

Опишаниот метод за изградба на шестоаголник ви овозможува да ја добиете оваа бројка врз основа на круг, што е полесно да се нацрта во перспектива отколку квадрат со дадени пропорции. Затоа, овој метод за конструирање на шестоаголник се чини дека е најточен и разноврсен. Методот на конструкција базиран на квадрат го олеснува прикажувањето на шестоаголник во случај кога веќе има коцка на цртежот, со други зборови, кога се одредуваат пропорциите на квадратот и насоката на неговите страни.

Врз основа на квадрат. Размислете за сл. 3,67. Шестоаголник впишан во квадрат во хоризонтална насока 5 - 2 е еднаков на страната на квадратот, а во вертикална насока е помал од неговата должина.

Вертикален шестоаголник. Нацртајте вертикален квадрат во перспектива. Нацртајте права линија преку пресекот на дијагоналите паралелно со неговите хоризонтални страни. Поделете го добиениот сегмент 5 - 2 на четири еднакви делови и нацртајте вертикални линии низ точките А и Б (слика 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).

Создава правилен шестоаголник впишан во круг. Конструира редовен пентагон долж дадена страна. Поместете ја иглата на компасот до пресекот на лакот што штотуку го скициравте со кругот. Оваа конструкција може да се направи со помош на квадрат и компас. Редовен шестоаголник може да се изгради со помош на шина и квадрат 30X60 °. Нацртајте ги горните точки на аглите на обичен шестоаголник.


Изградба на рамностран триаголник впишан во круг. Темињата на таков триаголник може да се изградат со помош на компас и квадрат со агли од 30 и 60 °, или само еден компас. За да се изгради страната 2-3, поставете ја патеката во положбата прикажана со испрекинати линии и нацртајте права линија преку точката 2, која ќе го дефинира третото теме на триаголникот.

Метод 1 од 3: Нацртајте совршен шестоаголник користејќи компас

Ние ја означуваме точката 1 на кругот и ја земаме како една од темињата на пентагонот. Нека се даде круг со дијаметар D; треба да внесете редовен хептагон во него (слика 65). Ние го делиме вертикалниот дијаметар на кругот на седум еднакви делови. Од точката 7 со радиус еднаков на дијаметарот на кругот D, опишуваме лак до пресекот со продолжување на хоризонталниот дијаметар во точката F. Точката F ќе се нарече пол на многуаголникот.

На способноста да се конструираат симетрали на агли и средни перпендикуларни сегменти, се заснова техниката за конструирање правилни полигони.

Првата колона од оваа табела го покажува бројот на страни на обичен впишан полигон, а втората - коефициентите. Должината на страната на даден полигон се добива со множење на радиусот на даден круг со фактор што одговара на бројот на страни на овој многуаголник.

Темата на ова видео упатство е „Конструирање на редовни многуаголници“. Исто така, уште еднаш ќе дефинираме правилен многуаголник, ќе го прикажеме графички, а потоа уште еднаш ќе се увериме дека центрите на испишаните и ограничени кругови околу таквата фигура ќе се совпаднат. Секогаш можете да впишете круг во овој многуаголник и секогаш можете да опишете круг околу него. Во текот на претходните лекции, откривме дека симетралите на неговите агли и средните нормални делови од неговите страни играат основна улога за опишување на својствата на многуаголниците.

4. Го доби потребниот правилен триаголник ABC. Проблемот е решен. 3. Откако ја ставивте едната нога од компасот во произволна точка А1 на кругот, користејќи ја втората нога, означете ја точката А2 на истиот круг и поврзете ја со точката А1. Ја добиваме првата страна на шестоаголникот. 3. Користејќи ги средните нормални верзии на страните на полигонот, испуштени од точката О, ги делиме сите нејзини страни и сите лакови на кругот, затворени помеѓу неговите соседни темиња, на половина.

Геометриската конструкција е еден од важните делови на обуката. Иглата треба да ја пробие нацртаната линија. Колку попрецизно е поставен компасот, толку попрецизна ќе биде конструкцијата. Нацртајте друг лак што го пресекува кругот. Последователно поврзете ги сите шест точки на пресек на лакови со првично нацртаниот круг. Во овој случај, шестоаголникот може да испадне погрешен.

За да ги добиете темињата / - // - /// од точките IV, V и VI, нацртајте хоризонтални линии до пресекот со кругот

Ги поврзуваме пронајдените темиња во серија едни со други. Ептагон може да се изгради со цртање зраци од F -пол и преку непарни поделби на вертикалниот дијаметар. Центрите на двата круга се совпаѓаат (точка О на слика 1). Сликата исто така ги прикажува радиусите на заокружените (Р) и впишаните (р) кругови.

Конструкцијата на шестоаголник се заснова на фактот дека неговата страна е еднаква на радиусот на заокружениот круг. Во оваа лекција, ќе разгледаме начини да изградиме редовни полигони користејќи компас и линијар. Вториот метод се базира на фактот дека ако изградите правилен шестоаголник впишан во круг, а потоа ги поврзувате неговите темиња преку еден, добивате рамностран триаголник. Дадениот метод е погоден за изградба на правилни многуаголници со кој било број страни.

Шестоаголни решетки (хексагонални решетки) се користат во некои игри, но тие не се толку едноставни и вообичаени како правоаголни решетки. Собирам ресурси за шеснаесетни решетки веќе скоро 20 години и го напишав ова упатство за некои од најелегантните пристапи во наједноставниот код. Оваа статија често ги користи упатствата на Чарлс Фу и Кларк Вербруж. Willе ги опишам различните начини за создавање хексадецимални мрежи, како се однесуваат и најчестите алгоритми. Многу делови од оваа статија се интерактивни: изборот на тип на мрежа ги менува соодветните шеми, код и текстови. (Прибл. Лејн: ова се однесува само на оригиналот, ве советувам да го проучите. Во преводот, сите информации за оригиналот се зачувани, но без интерактивност.).

Примерите за кодови во оваа статија се напишани во псевдокод, така што тие се полесни за читање и разбирање за да напишете сопствена имплементација.

Геометрија

Шестоаголниците се шестоаголни полигони. Редовните шестоаголници ги имаат сите страни (лица) со иста должина. Willе работиме само со редовни шестоаголници. Обично, хексадецималните решетки користат хоризонтални (зашилен врв) и вертикални (рамен врв) ориентации.


Рамни (лево) и шпиц (десно) горните шестоаголници

Шестоаголниците имаат 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 + големина * 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. Вертикалното растојание помеѓу соседните шестоаголници vert = висина * 3/4.

Ширината на шестоаголникот е ширина = sqrt (3) / 2 * висина. Хоризонталното растојание помеѓу соседните шестоаголници хоризонт = ширина.

Некои игри користат пиксел уметност за шестоаголници што точно не се совпаѓаат со обичните шестоаголници. Формулите за агол и позиција опишани во овој дел нема да одговараат на димензиите на овие шестоаголници. Остатокот од статијата што ги опишува алгоритмите за шеснаесетка мрежа се применува дури и ако шестоаголниците се малку испружени или компресирани.



Координативни системи

Да почнеме да ги собираме шестоаголниците во решетка. Во случај на решетки од квадрати, постои само еден очигледен начин да се соберат. За шестоаголници, има многу пристапи. Препорачувам да користите кубни координати како примарна претстава. Координатите на оската или офсет координатите треба да се користат за чување карти и прикажување координати за корисникот.

Офсет координати

Највообичаен пристап е да се надомести секоја наредна колона или ред. Колоните се означени како колона или q. Редовите се означени како ред или р. Непарни или парни колони / редови може да се надоместат, така што хоризонталните и вертикалните шестоаголници имаат две опции.


Хоризонтален распоред непарен-р


Хоризонтално уредување дури и-р


Непарно-q вертикално уредување


Вертикален аранжман дури-q

Кубни координати

Друг начин да се погледне решетки од шестоаголници е да се види во нив триглавните оски, не двекако во решетки од квадрати. Тие покажуваат елегантна симетрија.

Земете мрежа од коцки и отсеченидијагоналната рамнина на x + y + z = 0. Ова е чудна идеја, но ќе ни помогне да ги поедноставиме алгоритмите за хексадецимална мрежа. Особено, ќе можеме да користиме стандардни операции од Декартовите координати: собирање и одземање на координати, множење и делење со скалар, како и растојанија.

Забележете ги трите главни оски на решетката коцки и нивната врска со шесте. дијагоналнанасоки на решетката на шестоаголници. Дијагоналните оски на решетката одговараат на основната насока на шестоаголната мрежа.


Шестоаголници


Куба

Бидејќи веќе имаме алгоритми за решетки од квадрати и коцки, користењето кубни координати ни овозможува да ги прилагодиме овие алгоритми на решетки од шестоаголници. Systemе го користам овој систем за повеќето алгоритми во статијата. За да користам алгоритми со различен координатен систем, ги трансформирам кубните координати, го извршувам алгоритмот и потоа ги трансформирам назад.

Истражете како функционираат кубните координати за мрежа од шестоаголници. Кога избирате шестоаголници, кубните координати што одговараат на трите оски се означени.

  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, третата координата не е потребна. Координатите на оската се корисни за чување карти и прикажување координати на корисникот. Како и со кубните координати, можете да користите стандардни операции за собирање, одземање, множење и делење со нив.

Постојат многу кубни координатни системи и многу аксијални. Нема да ги опфатам сите комбинации во ова упатство. Willе изберам две променливи, 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
Во код, овие две функции може да се запишат на следниов начин:

Функција cube_to_hex (h): # аксијален var q = hx var r = hz враќање Hex (q, r) функција hex_to_cube (h): # кубни var x = hq var z = hr var y = -xz враќање на коцка (x, y , z)
Офсетните координати се доста незгодни:

Соседни шестоаголници

Со оглед на еден шестоаголник, на кои шест шестоаголници е во непосредна близина? Како што може да очекувате, одговорот е најлесен во кубни координати, прилично јасен во аксијални координати и малку посложен во офсет координати. Можеби ќе треба да пресметате и шест „дијагонални“ шестоаголници.

Кубни координати

Поместување на еден простор во координатите на шестоаголниците менува една од трите кубни координати за +1, а другата за -1 (збирот мора да остане еднаков на 0). Три можни координати може да се сменат за +1, а останатите две може да се сменат за -1. Ова ни дава шест можни промени. Секој одговара на една од насоките на шестоаголникот. Наједноставниот и најбрзиот начин е однапред да се пресметаат промените и да се постават во табелата Cube (dx, dy, dz) во времето на составување:

Var насоки = [Коцка (+1, -1, 0), коцка (+1, 0, -1), коцка (0, +1, -1), коцка (-1, +1, 0), коцка ( -1, 0, +1), коцка (0, -1, +1)] функција cube_direction (правец): враќање насоки функција cube_neighbor (шестоаголник, правец): враќање cube_add (шестоаголник, cube_direction (правец))

Аксијални координати

Како и досега, започнуваме со системот за коцки. Земете ја табелата 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 (правец) враќање 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)]] функција офсет_сосед (шестоаголна, насока): вариум паритет = шестоаголник. Ветро & 1 вар дир = насоки враќаат Хексадесетина (шестоаголник


Парен-р
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)]] функција офсет_сосед (шестоаголник, правец): вариум паритет = шестоаголник.тро & 1 вар дир = насоки се враќаат Шестоаголник (шестоаголник


Мрежа за парови (ДАЛИ) и непарни (ОДД) редови

Непарно-q
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)]] функција офсет_сосед (шеснаесетник, насока): вариум паритет = шестоаголник и 1 вар дир


Дури-q
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)]] функција офсет_сосед (шеснаесетник, насока): вариум паритет = шестоаголник и 1 вар дир


Мрежа за парни (дури и) и непарни (ODD) колони

Дијагонали

Движењето во „дијагоналниот“ простор во координатите на шестоаголниците менува една од трите кубни координати за ± 2, а другите две за ∓1 (збирот мора да остане еднаков на 0).

Var дијагонали = [Коцка (+2, -1, -1), коцка (+1, +1, -2), коцка (-1, +2, -1), коцка (-2, +1, +1 ), Коцка (-1, -1, +2), Коцка (+1, -2, +1)] функција коцка_дијагонален_сосед (шестоаголник, правец): враќање на коцка_дополнување (шестоаголник, дијагонали)
Како и досега, можеме да ги претвориме овие координати во аксијални, отфрлајќи една од трите координати, или да се претвориме во поместени координати, по пресметување на резултатите.


Растојанија

Кубни координати

Во кубен координатен систем, секој шестоаголник е коцка во три димензии. Соседните шестоаголници се 1 во хексадецималната решетка, но 2 во решетката коцка. Ова го олеснува пресметувањето на растојанијата. Во мрежа од квадрати, растојанијата на Менхетен се апс (дх) + апс (ди). Во мрежа од коцки, растојанијата на Менхетен се апс (дх) + апс (ди) + апс (џ). Растојанието во мрежата на шестоаголници е еднакво на половина од нив:

Функција cube_distance (a, b): return (abs (a.x - b.x) + abs (a.y - b.y) + abs (a.z - b.z)) / 2
Еквивалент на оваа ознака е да се изрази дека една од трите координати треба да биде збир од другите две, а потоа да се добие како далечина. Можете да ја изберете формата за бисекција или формата за максимална вредност подолу, но тие го даваат истиот резултат:

Функција cube_distance (a, b): max max (abs (a.x - b.x), abs (a.y - b.y), апс (a.z - b.z))
На сликата, максималните вредности се означени со боја. Забележете исто така дека секоја боја претставува една од шесте „дијагонални“ насоки.

GIF


Аксијални координати

Во аксијалниот систем, третата координата е имплицитно изразена. Ајде да се претвориме од аксијално во кубно за да го пресметаме растојанието:

Функција hex_distance (a, b): var ac = hex_to_cube (a) var bc = hex_to_cube (b) return cube_distance (ac, bc)
Ако компајлерот во вашиот случај вметнува hex_to_cube и cube_distance, тогаш ќе го генерира следниот код:

Функција hex_distance (a, b): return (abs (a.q - b.q) + abs (a.q + a.r - b.q - b.r) + апс (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) return cube_distance (ac, bc)
Useе ја користиме истата шема за многу алгоритми: претворете се од шестоаголници во коцки, извршете ја кубната верзија на алгоритмот и претворете ги кубните резултати во хексадецимални координати (аксијални или офсет координати).

Цртање линии

Како да повлечам линија од еден шестоаголник до друг? Користам линеарна интерполација за да нацртам линии. Линијата се зема примерок подеднакво на N + 1 точки и се пресметува во кои шестоаголници се наоѓаат овие примероци.

GIF


  1. Прво пресметуваме N, што ќе биде шестоаголно растојание помеѓу крајните точки.
  2. Потоа униформно земаме примероци од N + 1 помеѓу точките А и Б. Користејќи линеарна интерполација, утврдете дека за вредностите на i од 0 до N, вклучувајќи ги истите, секоја точка ќе биде A + (B - A) * 1.0 / N * јас На сликата, овие контролни точки се прикажани со сина боја. Резултатот е координати на подвижна точка.
  3. Претворете ја секоја контролна точка (плови) назад во шестоаголници (int). Алгоритмот се нарекува cube_round (види подолу).
Сето тоа заедно да се повлече линија од А до Б:

Функција lerp (a, b, t): // за float врати a + (b - a) * t функција cube_lerp (a, b, t): // за шестоаголници врати коцка (lerp (секира, bx, t), lerp (ay, by, t), lerp (az, bz, t)) функција cube_lineraw (a, b): var N = cube_distance (a, b) var резултати = за секој 0 ≤ i ≤ N: резултати. додај ( cube_round (cube_lerp (a, b, 1.0 / N * i))) вратете ги резултатите
Белешки:

  • Има моменти кога cube_lerp враќа точка точно на работ помеѓу два шестоаголници. Потоа cube_round го префрла на еден или на друг начин. Линиите изгледаат подобро кога се поместуваат во иста насока. Ова може да се направи со додавање на епсилон-хексадецимална коцка (1e-6, 1e-6, -2e-6) на една или двете крајни точки пред да се започне јамката. Ова ќе ја „поттикне“ линијата во една насока за да не ги достигне границите на работ.
  • Алгоритмот на линијата DDA во решетки од квадрати го изедначува N со максималното растојание по секоја од оските. Ние го правиме истото во кубен простор, што е аналогно на растојанието во мрежа од шестоаголници.
  • Функцијата cube_lerp треба да врати коцка со координати во float. Ако програмирате на статички напишан јазик, не можете да го користите типот Коцка. Наместо тоа, можете да го дефинирате типот FloatCube, или да внесете функција во кодот за цртање линија ако не сакате да дефинирате друг тип.
  • Можете да го оптимизирате вашиот код со вградена cube_lerp и потоа да пресметате B.x-A.x, B.x-A.y и 1.0 / N надвор од јамката. Множењето може да се претвори во повторено сумирање. Резултатот ќе биде нешто како алгоритам на DDA линија.
  • Јас користам аксијални или кубни координати за да цртам линии, но ако сакате да работите со офсет координати, тогаш научете.
  • Постојат многу опции за цртање линии. Понекогаш е потребно премачкување. Ми го испратија кодот за цртање линии со премачкување во шестоаголници, но с I уште не сум го разгледал.

Опсег на патување

Координатен опсег

За даден центар на шестоаголник и опсег на N, кои шестоаголници се во 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: резултати. Додај (cube_add (центар, коцка (dx , dy, dz)))
Оваа јамка ќе работи, но ќе биде прилично неефикасна. Од сите вредности на dz што ги повторуваме во јамката, само една всушност го исполнува условот за коцки dx + dy + dz = 0. Наместо тоа, ние директно ќе ја пресметаме вредноста dz што го задоволува условот:

Var резултати = за секој -N ≤ dx ≤ N: за секој макс (-N, -dx -N) ≤ dy ≤ мин (N, -dx + N): var dz = -dx -dy резултати. Додај (cube_add ( центар, коцка (dx, dy, dz)))
Овој циклус работи само по потребните координати. На сликата, секој опсег е пар линии. Секоја линија е нееднаквост. Ги земаме сите шестоаголници што задоволуваат шест нееднаквости.

GIF


Опсези на преклопување

Ако треба да пронајдете шестоаголници што се во повеќе опсези, можете да ги поминете опсезите пред да ја генерирате листата на шестоаголници.

Можете да пристапите кон овој проблем во однос на алгебра или геометрија. Алгебарски, секој регион е изразен како услови за нееднаквост во форма -N ≤ dx ≤ N, и треба да го најдеме пресекот на овие услови. Геометриски, секоја област е коцка во тродимензионален простор, и ние ќе пресечеме две коцки во тродимензионален простор за да добиеме правоаголен паралелепипед во тродимензионален простор. Потоа го проектираме назад на рамнината 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 = -xy резултати. Додај (коцка (x, y, z))
Пресекот на двата опсези 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 и z Истата шема работи за пресекот на три или повеќе региони.

GIF


Пречки

Ако има пречки, најлесно е да се пополни со ограничено растојание (Прво пребарување на ширина). На сликата подолу, ние сме ограничени на четири потези. Во кодот, ресите [k] е низа од сите шестоаголници до кои може да се стигне во k чекори. Со секое поминување низ главната јамка, го прошируваме нивото k-1 до нивото k.

Функција cube_reachable (почеток, движење): var visit = set () додадете почеток на посетени var реси = реси. Додајте () за секој 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_од_С = П - Ц = Коцка (P.x - C.x, P.y - C.y, P.z - C.z).
  3. Завртете го векторот P_fr_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 назад во саканиот координатен систем.
Постојат неколку фази на трансформација, но секоја од нив е прилично едноставна. Можно е да се скратат некои од овие чекори со дефинирање на ротацијата директно во аксијални координати, но хексадецималните вектори не работат со офсет координати и не знам како да ги скратам чекорите за офсет координати. Видете исто дискусија за размена на столбови за други начини за пресметување на ротација.

Прстени

Едноставен прстен

За да откриете дали даден шестоаголник припаѓа на прстен од даден радиус, треба да го пресметате растојанието од овој шестоаголник до центарот и да откриете дали е еднакво на радиус. За да добиете список на сите такви шестоаголници, направете чекори со радиус од центарот, а потоа следете ги ротираните вектори по патеката долж прстенот.

Функција cube_ring (центар, радиус): var резултати = # овој код не работи за радиус == 0; разбираш зошто? var коцка = cube_add (центар, cube_scale (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 ≤ радиус: резултати = резултати + cube_ring (центар, k) враќаат резултати



Областа на големиот шестоаголник е збир од сите кругови плус 1 за центарот. Користете ја оваа формула за да ја пресметате површината.

Поминување на шестоаголници на овој начин, исто така, може да се користи за пресметување на опсегот на движења (види погоре).

Област на видливост

Што е видливо од дадена позиција со одредено растојание, а не е попречено од пречки? Наједноставниот начин да се одреди ова е да се повлече линија до секој шестоаголник во даден опсег. Ако линијата не ги исполнува wallsидовите, тогаш гледате шестоаголник. Поместете го глувчето над шестоаголниците [во дијаграмот во оригиналната статија] за да го видите цртежот на линии до овие шестоаголници и theидовите со кои се спојуваат линиите.

Овој алгоритам може да биде бавен во големи области, но е лесен за имплементација, затоа препорачувам да започнете со него.

GIF



Постојат многу различни дефиниции за видливост. Дали сакате да го видите центарот на другиот шестоаголник од центарот на почетниот? Дали сакате да видите некој дел од другиот шестоаголник од центарот на почетниот? Можеби некој дел од друг шестоаголник од која било почетна точка? Дали пречките се помали од цел шестоаголник? Опсегот е посложена и поразновидна концепција отколку што изгледа. Да почнеме со наједноставниот алгоритам, но очекувајте дека дефинитивно ќе го пресмета одговорот правилно во вашиот проект. Има дури и случаи кога едноставен алгоритам дава нелогични резултати.

Сакам дополнително да го проширам овој водич. имам

Дали има молив во близина на вас? Погледнете го неговиот дел - тоа е обичен шестоаголник или, како што се нарекува и шестоаголник. Овој пресек го имаат и пресекот на орев, поле на шестоаголен шах, некои сложени молекули на јаглерод (на пример, графит), снегулка, саќе и други предмети. Неодамна беше откриен џиновски редовен шестоаголник Ајде внимателно да погледнеме.

Правилен шестоаголник е многуаголник со шест еднакви страни и еднакви агли. Ние знаеме од училишниот курс дека ги има следниве својства:

  • Должината на неговите страни одговара на радиусот на заокружениот круг. Од с all, само обичен шестоаголник го има овој имот.
  • Аглите се еднакви едни на други, а големината на секој од нив е 120 °.
  • Периметарот на шестоаголник може да се најде со формулата P = 6 * R, ако е познат радиусот на опишаниот круг околу него, или P = 4 * √ (3) * r, ако кругот е впишан во него. R и r се радиусите на обемот и заокружувањето.
  • Површината окупирана од обичен шестоаголник се одредува на следниов начин: S = (3 * √ (3) * R 2) / 2. Ако радиусот е непознат, наместо него ја заменуваме должината на една од страните - како што знаете, таа одговара на должината на радиусот на заокружениот круг.

Редовниот шестоаголник има една интересна карактеристика што го прави толку распространет во природата - може да пополни било која површина на рамнината без преклопувања и празнини. Постои дури и таканаречена лема на Пал, според која обичен шестоаголник со страна еднаква на 1 / √ (3) е универзален капак, односно може да покрие сет со дијаметар од една единица.

Сега да погледнеме во изградбата на редовен шестоаголник. Постојат неколку начини, од кои наједноставниот вклучува користење на компас, молив и линијар. Прво, ние цртаме произволен круг со компас, потоа на произволно место на овој круг правиме точка. Без да го смениме решението на компасот, го ставаме врвот во овој момент, го означуваме следниот изрез на кругот, продолжуваме на овој начин додека не ги добиеме сите 6 поени. Сега останува само да ги поврзете заедно со прави сегменти и ќе ја добиете саканата фигура.

Во пракса, има моменти кога треба да нацртате голем шестоаголник. На пример, на таван од гипс картон на две нивоа, околу точката за монтирање на централниот лустер, треба да инсталирате шест мали светилки на пониско ниво. Beе биде многу, многу тешко да се најде компас со оваа големина. Што да направите во овој случај? Како воопшто цртате голем круг? Многу едноставно. Треба да земете силна нишка со потребната должина и да врзете еден од неговите краеви спроти моливчето. Сега останува само да се најде асистент кој ќе го притисне вториот крај на конецот до таванот во саканата точка. Се разбира, во овој случај, можни се мали грешки, но тие веројатно нема да бидат забележливи за надворешни лица.

Содржина:

Редовниот шестоаголник, исто така наречен совршен шестоаголник, има шест еднакви страни и шест еднакви агли. Можете да нацртате шестоаголник со мерна лента и приказ, груб шестоаголник со тркалезен предмет и линијар, или уште погруб шестоаголник со само молив и малку интуиција. Ако сакате да знаете како да нацртате шестоаголник на различни начини, само прочитајте.

Чекори

1 Нацртајте совршен шестоаголник користејќи компас

  1. 1 Нацртајте круг користејќи компас.Вметнете го моливчето во компасот. Проширете го компасот до саканата ширина за радиусот на вашиот круг. Радиусот може да биде широк од неколку до десет сантиметри. Следно, ставете компас со молив на хартија и нацртајте круг.
    • Понекогаш е полесно прво да се нацрта половина од кругот, а потоа другата половина.
  2. 2 Поместете ја иглата за компас до работ на кругот.Ставете го на врвот на кругот. Не го менувајте аголот и положбата на компасот.
  3. 3 Направете мала ознака со молив на работ на кругот.Објаснете го, но не премногу темно, бидејќи подоцна ќе го избришете. Не заборавајте да го задржите аголот што го поставивте за компасот.
  4. 4 Поместете ја иглата за компас до ознаката што штотуку ја направивте.Ставете ја иглата директно на ознаката.
  5. 5 Направете уште една ознака со молив на работ на кругот.Така, ќе направите втора ознака на одредено растојание од првата ознака. Продолжете да се движите во една насока.
  6. 6 Направете уште четири ознаки на ист начин.Треба да се вратите на првобитната ознака. Ако не, тогаш најверојатно се промени аголот под кој го држевте компасот и ги направивте ознаките. Можеби ова се случи поради фактот што сте го стегнале премногу цврсто или, напротив, малку го олабавивте.
  7. 7 Поврзете ги ознаките со владетел.Шесте места каде што вашите знаци се сечат со работ на кругот се шесте темиња на шестоаголникот. Користејќи владетел и молив, нацртајте прави линии што ги поврзуваат соседните ознаки.
  8. 8 Избришете ги и кругот, ознаките на рабовите на кругот и сите други ознаки што сте ги направиле. Откако ќе ги избришете сите ваши градежни линии, вашиот совршен шестоаголник треба да биде подготвен.

2 Нацртајте груб шестоаголник користејќи тркалезен предмет и линијар

  1. 1 Нацртајте молив околу работ на стаклото.Ова ќе нацрта круг. Многу е важно да цртате со молив, бидејќи подоцна ќе треба да ги избришете сите помошни линии. Можете исто така да заокружите превртено стакло, тегла или што било друго што има тркалезна основа.
  2. 2 Нацртајте хоризонтални линии низ центарот на вашиот круг.Можете да користите владетел, книга, с anything што има исправен раб. Ако навистина имате владетел, можете да ја означите средината со пресметување на вертикалната должина на кругот и делење на половина.
  3. 3 Нацртајте „Х“ над половина од кругот, делејќи го на шест еднакви делови.Бидејќи веќе нацртавте линија низ средината на кругот, X мора да биде поширок отколку што е висок, така што деловите се еднакви. Замислете дека ја делите пицата на шест парчиња.
  4. 4 Направете триаголници од секој дел.За да го направите ова, користете владетел за да нацртате права линија под закривениот дел од секој дел, поврзувајќи ја со другите две линии за да формирате триаголник. Направете го тоа со преостанатите пет делови. Помислете на тоа како да правите кора околу парчињата пица.
  5. 5 Избришете ги сите градежни линии.Градежните линии го вклучуваат вашиот круг, трите линии што го поделија вашиот круг на делови и други ознаки што сте ги направиле на патот.

3 Нацртајте груб шестоаголник со еден молив

  1. 1 Нацртајте хоризонтална линија.За да нацртате права линија без линијар, едноставно нацртајте ги почетните и крајните точки на вашата хоризонтална линија. Потоа ставете го моливчето на почетната точка и продолжете ја линијата кон крајот. Должината на оваа линија може да биде само неколку сантиметри.
  2. 2 Нацртајте две дијагонални линии од краевите на хоризонталната.Дијагоналната линија од левата страна треба да биде свртена кон надвор на ист начин како и дијагоналната линија од десната страна. Можете да замислите дека овие линии формираат агол од 120 степени во однос на хоризонталната линија.
  3. 3 Нацртајте уште две хоризонтални линии што произлегуваат од првите хоризонтални линии нацртани навнатре.Ова ќе создаде огледална слика на првите две дијагонални линии. Долната лева линија треба да биде одраз на горната лева линија, а долната десна линија треба да биде одраз на горната десна линија. Додека горните хоризонтални линии треба да изгледаат нанадвор, долните треба да изгледаат внатре во основата.
  4. 4 Нацртајте друга хоризонтална линија што ги поврзува дните две дијагонални линии.На овој начин ќе ја нацртате основата за вашиот шестоаголник. Идеално, оваа линија треба да биде паралелна со горната хоризонтална линија. Сега го завршивте вашиот шестоаголник.
  • Моливчето и компасот треба да бидат остри за да се минимизираат грешките од премногу широки ознаки.
  • Ако, користејќи го методот на компас, ја поврзете секоја ознака наместо сите шест, ќе добиете рамностран триаголник.

Предупредувања

  • Компасот е прилично остар предмет, бидете многу внимателни со него.

Принцип на работа

  • Секој метод ќе нацрта шестоаголник формиран од шест рамнострани триаголници со радиус еднаков на должината на сите страни. Шесте нацртани радиуси се со иста должина и сите линии за создавање на шестоаголник се исто со иста должина, бидејќи ширината на компасот не се промени. Поради фактот што шест триаголници се рамностран, аглите помеѓу нивните темиња се 60 степени.

Што ти треба

  • Хартија
  • Молив
  • Владетел
  • Пар компаси
  • Нешто што можете да го ставите под хартијата за да не се лизне иглата за компас.
  • Гума за бришење

Затвори