Ще се научим как да изобразяваме шестоъгълна призма в различни позиции.

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

Помислете за шестостенната призма на фиг. 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).

Създава правилен шестоъгълник, вписан в кръг. Конструира правилен петоъгълник по дадена страна. Преместете стрелката на компаса до пресечната точка на дъгата, която току-що скицирахте с кръга. Тази конструкция може да се направи с помощта на квадрат и пергел. Редовен шестоъгълник може да бъде построен с помощта на релса и квадрат 30X60 °. Начертайте върховите точки на ъглите на правилния шестоъгълник.


Построяване на равностранен триъгълник, вписан в окръжност. Върховете на такъв триъгълник могат да бъдат построени с помощта на компас и квадрат с ъгли от 30 и 60 ° или само един компас. За да изградите страна 2-3, настройте пистата на позицията, показана с пунктирани линии, и начертайте права линия през точка 2, която ще определи третия връх на триъгълника.

Метод 1 от 3: Начертайте перфектен шестоъгълник с помощта на компас

Отбелязваме точка 1 на окръжността и я приемаме като един от върховете на петоъгълника. Нека е даден кръг с диаметър D; трябва да впишете правилен седмоъгълник в него (фиг. 65). Разделете вертикалния диаметър на кръга на седем равни части. От точка 7 с радиус, равен на диаметъра на окръжността D, описваме дъга до пресечната точка с продължение на хоризонталния диаметър в точка F. Точка F ще се нарича полюс на многоъгълника.

Техниката за конструиране на правилни многоъгълници се основава на способността да се конструират ъгли на ъгли и средни перпендикуляри на сегменти.

Първата колона на тази таблица показва броя на страните на правилен вписан многоъгълник, а втората - коефициентите. Дължината на страната на даден многоъгълник се получава чрез умножаване на радиуса на дадена окръжност с коефициент, съответстващ на броя на страните на този многоъгълник.

Темата на този видео урок е „Строителство правилни многоъгълници". Също така отново ще дадем определението за правилен многоъгълник, ще го изобразим графично и след това отново ще се уверим, че центровете на вписаните и описани кръгове около такава фигура ще съвпадат. Винаги можете да впишете кръг в този многоъгълник и винаги можете да опишете кръг около него. В хода на предишните уроци установихме, че ъглите на неговите ъгли и средните перпендикуляри на страните му играят основна роля за описание на свойствата на многоъгълниците.

4. Получи необходимия правилен триъгълник ABC. Проблемът е решен. 3. След като поставите единия крак на компаса в произволна точка A1 на кръга, с помощта на втория крак маркирайте точка A2 на същата окръжност и я свържете с точка A1. Получаваме първата страна на шестоъгълника. 3. Използвайки средните перпендикуляри на страните на многоъгълника, изпуснати от точка О, разделяме всичките му страни и всички дъги на окръжността, затворени между съседните му върхове, наполовина.

Геометричната конструкция е една от важните части на обучението. Иглата трябва да пробие начертаната линия. Колкото по-точно е настроен компасът, толкова по-точна ще бъде конструкцията. Начертайте друга дъга, която пресича окръжността. Свържете последователно всичките шест точки на пресичане на дъгите с първоначално начертания кръг. В този случай шестоъгълникът може да се окаже грешен.

За да получите върховете / - // - /// от точки IV, V и VI, начертайте хоризонтални линии до пресечната точка с окръжността

Свързваме намерените върхове последователно един с друг. Седмоъгълник може да бъде конструиран чрез изтегляне на лъчи от F полюса и чрез нечетни деления на вертикалния диаметър. Центровете на двете окръжности съвпадат (точка О на фиг. 1). Фигурата показва също радиусите на описаната (R) и вписаната (r) окръжност.

Конструкцията на шестоъгълник се основава на факта, че неговата страна е равна на радиуса на описаната окръжност. В този урок ще разгледаме начините за изграждане на правилни многоъгълници с помощта на компас и линийка. Вторият метод се основава на факта, че ако построите правилен шестоъгълник, вписан в кръг, и след това свържете върховете му през един, ще получите равностранен триъгълник. Този метод е подходящ за конструиране на правилни многоъгълници с произволен брой страни.

Шестоъгълни мрежи (шестоъгълни мрежи) се използват в някои игри, но те не са толкова прости и често срещани, колкото правоъгълните мрежи. Събирам ресурси за шестнадесетични мрежи вече почти 20 години и написах това ръководство за някои от най-елегантните подходи, реализирани в най-простия код. Тази статия често използва уроците на Чарлз Фу и Кларк Вербрюге. Ще опиша различните начини за създаване на шестнадесетични мрежи, как те се свързват и най-често срещаните алгоритми. Много части от тази статия са интерактивни: изборът на тип мрежа променя съответните схеми, код и текстове. (Прибл. Lane: това се отнася само за оригинала, съветвам ви да го проучите. В превода цялата информация на оригинала е запазена, но без интерактивност.).

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

Геометрия

Шестоъгълните са шестнадесетични многоъгълници. Правилните шестоъгълници имат всички страни (лица) с еднаква дължина. Ще работим само с обикновени шестоъгълници. Обикновено шестнадесетичните мрежи използват хоризонтална (заострена горна част) и вертикална (плоска горна) ориентация.


Плоски (вляво) и заострени (вдясно) горни шестоъгълници

Шестоъгълниците имат 6 лица. Всяко лице е общо за два шестоъгълника. Шестоъгълниците имат 6 ъглови точки. Всяка ъглова точка се споделя от три шестоъгълника. Можете да прочетете повече за центровете, ръбовете и ъгловите точки в моята статия за части на мрежата (квадрати, шестоъгълници и триъгълници).

Ъгли

В правилния шестоъгълник вътрешните ъгли са 120 °. Има шест "клина", всеки от които е равностранен триъгълник с вътрешни ъгли от 60 °. Ъглова точка ие на разстояние (60 ° * i) + 30 °, размерни единици от центъра. в кода:

Функция hex_corner (center, size, i): var angle_deg = 60 * i + 30 var angle_rad = PI / 180 * angle_deg обратна точка (center.x + размер * 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 * височина. Хоризонталното разстояние между съседни шестоъгълници horiz = ширина.

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



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

Нека започнем да сглобяваме шестоъгълниците в решетка. В случай на решетки от квадрати има само един очевиден начин за сглобяване. Има много подходи за шестоъгълници. Препоръчвам да използвате кубични координати като основно представяне. Координатите на оста или координатите на отместване трябва да се използват за съхраняване на карти и показване на координати за потребителя.

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

Най-често срещаният подход е да се компенсира всяка следваща колона или ред. Колоните са обозначени col или q. Редовете са обозначени като ред или r. Нечетните или четните колони/редове могат да бъдат изместени, така че хоризонталните и вертикалните шестоъгълници имат две опции.


Нечетно-r хоризонтално оформление


Четно-r хоризонтално разположение


Нечетно-q вертикално подреждане


Четно-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
В кода тези две функции могат да бъдат написани по следния начин:

Функция cube_to_hex (h): # axial var q = hx var r = hz return Hex (q, r) функция hex_to_cube (h): # cubic var x = hq var z = hr var y = -xz return Cube (x, y) , z)
Координатите на изместването са доста трудни:

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

Даден е един шестоъгълник, към кои шест шестоъгълника е съседен? Както може да очаквате, отговорът е най-лесният в кубичните координати, сравнително прост в аксиалните координати и малко по-сложен в координатите на изместване. Може също да се наложи да изчислите шест "диагонални" шестоъгълника.

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

Преместването на едно пространство в координатите на шестоъгълниците променя една от трите кубични координати с +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_direction (посока): функция за връщане на упътвания cube_neighbor (шестнадесетичен, посока): връщане на cube_add (шестнадесетичен, посока на_куб (посок))

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

Както и преди, започваме с кубовата система. Вземете таблицата 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 (посока) return Hex (hex.q + dir.q, hex.r + dir.r)

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

В аксиалните координати правим промени в зависимост от това къде се намираме в мрежата. Ако сме в отместване на колона/ред, тогава правилото се различава от случая на колона/ред без отместване.

Както и преди, създаваме таблица с числа, които да добавим към col и row. Този път обаче ще имаме два масива, единият за нечетните колони/редове, а другият за четните. Погледнете (1,1) в решетката по-горе и забележете как се променят колоната и реда, докато се движите във всяка от шестте посоки. Сега повтаряме процеса за (2,2). Таблиците и кодът ще бъдат различни за всеки от четири видарешетки за изместване, тук е съответният код за всеки тип мрежа.

Нечетно-р
var directions = [[Hex (+1, 0), Hex (0, -1), Hex (-1, -1), Hex (-1, 0), Hex (-1, +1), Hex (0 , +1)], [Hex (+1, 0), Hex (+1, -1), Hex (0, -1), Hex (-1, 0), Hex (0, +1), Hex ( +1, +1)]] функция offset_neighbor (hex, посока): var parity = hex.row & 1 var dir = упътвания връщат Hex (hex.col + dir.col, hex.row + dir.row)


Even-r
var directions = [[Hex (+1, 0), Hex (+1, -1), Hex (0, -1), Hex (-1, 0), Hex (0, +1), Hex (+1 , +1)], [Hex (+1, 0), Hex (0, -1), Hex (-1, -1), Hex (-1, 0), Hex (-1, +1), Hex (0, +1)]] функция offset_neighbor (hex, посока): var parity = hex.row & 1 var dir = упътвания връщат Hex (hex.col + dir.col, hex.row + dir.row)


Решетка за четни (ЧЕТНИ) и нечетни (ODD) редове

Нечетно-q
var directions = [[Hex (+1, 0), Hex (+1, -1), Hex (0, -1), Hex (-1, -1), Hex (-1, 0), Hex (0 , +1)], [Hex (+1, +1), Hex (+1, 0), Hex (0, -1), Hex (-1, 0), Hex (-1, +1), Hex (0, +1)]] функция offset_neighbor (hex, посока): var parity = hex.col & 1 var dir = упътвания връщат Hex (hex.col + dir.col, hex.row + dir.row)


Четно-q
var directions = [[Hex (+1, +1), Hex (+1, 0), Hex (0, -1), Hex (-1, 0), Hex (-1, +1), Hex (0 , +1)], [Hex (+1, 0), Hex (+1, -1), Hex (0, -1), Hex (-1, -1), Hex (-1, 0), Hex (0, +1)]] функция offset_neighbor (hex, посока): var parity = hex.col & 1 var dir = упътвания връщат Hex (hex.col + dir.col, hex.row + dir.row)


Решетка за четни (ЧЕТНИ) и нечетни (ODD) колони

Диагонали

Преместването в "диагоналното" пространство в координатите на шестоъгълниците променя една от трите кубични координати с ± 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 (hex, посока): return cube_add (hex, диагонали)
Както и преди, можем да преобразуваме тези координати в аксиални, като изхвърлим една от трите координати, или да преобразуваме в координати на изместване, след като изчислим резултатите.


Разстояния

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

В кубична координатна система всеки шестоъгълник е куб в три измерения. Съседните шестоъгълници са на 1 разстояние един от друг в шестнадесетичната мрежа, но на 2 интервала в кубичната мрежа. Това прави изчисляването на разстояния лесно. В мрежа от квадрати разстоянията в Манхатън са abs (dx) + abs (dy). В решетка от кубчета разстоянията в Манхатън са abs (dx) + abs (dy) + abs (dz). Разстоянието в решетката от шестоъгълници е равно на половината от тях:

Функция 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) return cube_distance (ac, bc)
Ако компилаторът във вашия случай 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) return cube_distance (ac, bc)
Ще използваме същия модел за много алгоритми: преобразуваме от шестоъгълници в кубове, стартираме кубичната версия на алгоритъма и преобразуваме кубичните резултати в шестнадесетични координати (аксиални или изместени координати).

Рисуване на линии

Как да начертая линия от един шестоъгълник до друг? Използвам линейна интерполация за рисуване на линии. Линията се взема равномерно в N + 1 точки и се изчислява в кои шестоъгълници са разположени тези проби.

GIF


  1. Първо изчисляваме N, което ще бъде шестнадесетичното разстояние между крайните точки.
  2. След това вземаме равномерно проби от N + 1 точки между точки A и B. Използвайки линейна интерполация, определяме, че за стойности на i от 0 до N, включително тях, всяка точка ще бъде A + (B - A) * 1.0 / N * и. На фигурата тези контролни точки са показани в синьо. Резултатът е координати с плаваща запетая.
  3. Преобразувайте всяка контролна точка (float) обратно в шестоъгълници (int). Алгоритъмът се нарича cube_round (вижте по-долу).
Събирайки всичко заедно, за да начертаете линия от А до Б:

Функция lerp (a, b, t): // за float връщане a + (b - a) * t функция cube_lerp (a, b, t): // за шестоъгълници връщане на Cube (lerp (ax, bx, t), lerp (ay, by, t), lerp (az, bz, t)) функция cube_linedraw (a, b): var N = cube_distance (a, b) var резултати = за всяко 0 ≤ i ≤ N: results.append ( 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. Ако програмирате на статично въведен език, не можете да използвате типа Cube. Вместо това можете да дефинирате типа FloatCube или да вградите функция във вашия код за чертане на линии, ако не искате да дефинирате друг тип.
  • Можете да оптимизирате кода си чрез вграден 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: резултати.добавете (cube_add (център, куб (dx , dy, dz)))
Този цикъл ще работи, но ще бъде доста неефективен. От всички dz стойности, които итерираме в цикъла, само една наистина удовлетворява условието за кубчета dx + dy + dz = 0. Вместо това директно ще изчислим стойността на dz, която удовлетворява условието:

Var резултати = за всеки -N ≤ dx ≤ N: за всеки макс (-N, -dx-N) ≤ dy ≤ min (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 = center.x - N и x max = center.x + N. Нека направим същото за y и z, което води до общ изглед на кода от предишния раздел:

Var резултати = за всеки xmin ≤ x ≤ xmax: за всеки макс (ymin, -x-zmax) ≤ y ≤ min (ymax, -x-zmin): var z = -xy резултати.append (Cube (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


Препятствия

Ако има препятствия, най-лесно е да се запълни с ограничено разстояние (Breadth First Search). На снимката по-долу сме ограничени до четири хода. В кода ресни [k] е масив от всички шестоъгълници, които могат да бъдат достигнати на k стъпки. С всяко преминаване през главния цикъл разширяваме ниво k-1 до ниво k.

Функция cube_reachable (старт, движение): var visited = set () add start to visited 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 за други начини за изчисляване на опорната точка.

Пръстени

Обикновен пръстен

За да разберете дали даден шестоъгълник принадлежи на пръстен с даден радиус, трябва да изчислите разстоянието от този шестоъгълник до центъра и да разберете дали е равно на радиуса. За да получите списък с всички такива шестоъгълници, направете радиус стъпки от центъра и след това следвайте завъртените вектори по пътя по протежение на пръстена.

Функция cube_ring (център, радиус): var results = # този код не работи за радиус == 0; разбираш ли защо? var cube = 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 за центъра. Използвайте тази формула, за да изчислите площта.

Преминаването на шестоъгълници по този начин може също да се използва за изчисляване на обхвата на движение (вижте по-горе).

Зона на видимост

Какво се вижда от дадено място с дадено разстояние и не е препятствано от препятствия? Най-простият начиндефинирайте го - начертайте линия към всеки шестоъгълник в даден диапазон. Ако линията не отговаря на стените, тогава виждате шестоъгълник. Преместете мишката върху шестоъгълниците [на диаграмата в оригиналната статия], за да видите чертежа на линиите към тези шестоъгълници и стените, с които линиите се срещат.

Този алгоритъм може да бъде бавен на големи площи, но е лесен за изпълнение, затова препоръчвам да започнете с него.

GIF



Има много различни дефинициивидимост. Искате ли да видите центъра на другия шестоъгълник от центъра на началния? Искате ли да видите част от другия шестоъгълник от центъра на началния? Може би част от друг шестоъгълник от всяка начална точка? Препятствията по-малки ли са от пълен шестоъгълник? Обхватът е по-сложна и по-разнообразна концепция, отколкото изглежда. Нека започнем с най-простия алгоритъм, но очаквайте той да изчисли правилно отговора във вашия проект. Има дори случаи, когато прост алгоритъм дава нелогични резултати.

Искам да разширя това ръководство в бъдеще. аз имам

Има ли молив близо до вас? Разгледайте сечението му - това е правилен шестоъгълник или, както още го наричат, шестоъгълник. Тази форма също имат напречното сечение на орех, поле от шестоъгълен шах, някои сложни въглеродни молекули (например графит), снежинка, пчелна пита и други предмети. Наскоро беше открит гигантски правилен шестоъгълник Нека разгледаме по-отблизо.

Правилният шестоъгълник е многоъгълник с шест равни страни и равни ъгли. От училищния курс знаем, че има следните свойства:

  • Дължината на страните му съответства на радиуса на описаната окръжност. От всички, само правилен шестоъгълник има това свойство.
  • Ъглите са равни един на друг, а големината на всеки е 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 градуса.

Какво ти е необходимо

  • хартия
  • молив
  • Владетел
  • Чифт компаси
  • Нещо, което можете да поставите под хартията, за да не се плъзга стрелката на компаса.
  • Гумичка

Близо