Исходник программы, показывающей пример рисования шестиугольных узоров для использования в качестве досок для игр или головоломок, используя обычные шестиугольные плитки.
Это доска в форме шестиугольника, состоящая из 19 плиток шестиугольной формы, пронумерованных от 1 до 19. Цель состоит в том, чтобы расположить их в «волшебном» шестиугольнике, в котором значения в каждом горизонтальном и диагональном ряду (всего 15) в сумме равны 38.
Особенности программы
Масштабирование отдельных шестиугольных плиток с заданным размером и ориентацией. Процедура MakeHexagon создает тип TPolygon как массив из 6 точек, представляющих углы шестиугольника с заданной центральной точкой, радиусом и углом одной вершины от горизонтали. Остальные 5 углов увеличены на 60 градусов по сравнению с предыдущим углом.
Рисование плиток в соответствующих позициях. Для доски с длинным горизонтальным рядом количество рядов такое же, как и количество плиток в самом длинном ряду. Мы будем шагать по одной длине радиуса за раз, и для каждого шага позиции вверх и вниз на радиус, уменьшенный на величину перекрытия со следующей строкой [sin (30 градусов) = 0,866].
Для рисования версии доски, повернутой на 30 градусов (чтобы самая длинная диагональ стала самой длинной колонкой), необходимо повернуть каждую отдельную шестиугольную плитку вперед (или назад) на 30 градусов и поменять местами роли X, Y в алгоритме рисования из предыдущего, поэтому что длинный вертикальный столбец рисуется слева и справа, причем отдельные плитки в каждом столбце смещены по вертикали на один радиус плитки, а горизонтальное смещение составляет 0,866 радиуса.
Диаграмма «подсказки головоломки» отображает значения решения для одного из решений в 6 внешних углах доски. Локации были найдены во время создания доски путем временного присвоения последовательных букв по мере создания плиток. Буквы в 6 углах были затем заменены значениями решения по мере отображения платы, а другие буквы были заменены пробелами.
При добавлении чисел или других текстовых символов в плитки размер шрифта можно настроить в соответствии с размером плитки, задав свойство Canvas.Font.Height TImage. Я установил для него значение - Radius в этой программе, сделав высоту символа 1/2 диаметра плитки. Символы можно центрировать, вычитая половину неиспользованной высоты (и ширины) из координат центра плитки. Методы Canvas.TextWidth и Canvas, TextHeight могут возвращать данные значения.