Иногда мне в голову попадают задачи, не имеющие какой-то очевидной практической ценности, но, тем не менее, они захватывают так или иначе мое воображение, по крайней мере, пока не решу. Практическая ценность задачи, как правило, нулевая, но в процессе решаются другие, которые могут иметь бОльшую ценность, чем решенная.
Все началось с желания изучить свойства правильных октагонов и октаграмм, но результаты оказались применимы ко всем выпуклым многоугольникам (полигонам) и звездам, построенным в них (по аналогии назову их полиграммами — пентаграмма, гексаграмма, септаграмма, октаграмма и т.д. — хотя этот термин имеет и иные значения).
Для начала терминология. Пентаграммой называют совокупность всех диагоналей пятиугольника, в случае гексаграммы — это уже не все диагонали, а только те, которые соединяют непротивоположные вершины шестиугольника. Во обоих случаях эти вершины идут через одну друг от друга. Например, если вершины пятиугольника перенумеровать(0, 1, 2, 3, 4) , то пентаграмма — совокупность линий (0, 2) , (1, 3) , (2, 4) , (3, 0) , (4, 1) . Гексаграмма (0, 1, 2, 3, 4, 5) , соответственно, является совокупностью линий (0, 2) , (1, 3) , (2, 4) , (3, 5) , (4, 0) , (5, 1) . Нули в качестве начальной точки взяты не случайно и не как дань програмистскому мышлению, удобство этого обозначения я опишу ниже. Линии, образующие полиграмму, я буду называть ребрами. Вершинами полиграммы я буду называть вершины исходного полигона, а не все точки пересечения ребер.
![](https://habrastorage.org/r/w1560/getpro/habr/post_images/79e/e3a/8dc/79ee3a8dcece57ca90f14c413e211c57.png)
Определение можно обобщить, введя понятие «порядок полиграммы» как некоторое целое число k, имеющее диапазон значений между 1 и n / 2, где n — количество углов исходного полигона. Верхняя граница k (равная целой частиn / 2 ) определят количество разных обобщенных полиграмм. Сам же порядок обозначает, какая по счету вершина от исходной должна быть соединена диагональю, входящей в полиграмму. Что это значит? Если рассматривать номера вершин полиграммы, начиная с нуля, то они образуют аддитивную группу вычетов по модулю n. Пусть m — это номер вершины полиграммы. Тогда отрезок, соединяющий вершину m и m + k (где k — порядок полиграммы) в данной группе, будет являться частью полиграммы порядка k. В этом обобщении полиграмма порядка 1 совпадет с исходным многоугольником.
В случае пентагона согласно формуле существует две обобщенные пентаграммы — сам пентагон и пентаграмма в классическом смысле.
![](https://habrastorage.org/r/w1560/getpro/habr/post_images/030/20d/131/03020d131cd3359b5b151df514be7d89.png)
В случае гексагона есть три обобщенные гексаграммы: сам гексагон, классическая гексаграмма и диагонали, соединяющие противоположенные вершины (вырожденный случай).
![](https://habrastorage.org/r/w1560/getpro/habr/post_images/422/84e/76e/42284e76eaee87a9b105f9eb269bfb79.png)
Для лучше иллюстрации разберу полиграмм для септагона и октагона. По формуле количество септаграмм будет равно трем, количество октаграмм четырем.
![](https://habrastorage.org/r/w1560/getpro/habr/post_images/b70/840/d59/b70840d595d4882f46d35017e326f3bd.png)
![](https://habrastorage.org/r/w1560/getpro/habr/post_images/f85/2d6/b7e/f852d6b7e4a46968a4ec92ebe9d08428.png)
В качестве побочного эффекта можно увидеть, что полиграммы естественным образом делятся на связные и несвязные. Связные полиграммы — это полиграммы, между любой парой вершин которых существует путь по ребрам (перескакивать с ребра на ребро можно только в вершинах многоугольника). Воспользовавшись теорией чисел, можно заметить, что полиграммы связны тогда и только тогда, когда количество углов исходного полигона и порядок полиграммы — взаимно простые числа.
На картинке ниже приведены примеры несвязных полиграмм, их отдельные части выделены разными цветами. Нонаграмма(n = 9, k = 3) распадается на три треугольника, декаграмма (n = 10, k = 4) — на две пентаграммы:
![](https://habrastorage.org/r/w1560/getpro/habr/post_images/13a/300/782/13a3007821fdbc53cb91a8006d6d270d.png)
Теперь полиграммы с тем же количеством углов (n = 9, k = 2 и n = 10, k = 3 ), но уже связные:
![](https://habrastorage.org/r/w1560/getpro/habr/post_images/ff8/9fd/88f/ff89fd88f903a105deef41bedd58ae54.png)
Кроме того, в случае четных n и максимальных для такого случая k (k = n / 2) полиграммы вырождаются в набор диагоналей, соединяющих противоположные вершины.
![](https://habrastorage.org/r/w1560/getpro/habr/post_images/4c9/099/0c7/4c90990c74b80720c7d7f614551085b8.png)
Довольно неожиданным для меня результатом оказалось то, что сумма углов при вершинах полиграмм (в случае выпуклых полигонов) является довольно просто вычислимая величина:π(n — 2k) . В случае полиграмм первого порядка (которые совпадают с исходным полигоном) формула сводится к известной формуле вычисления углов многоугольника, в случае же вырожденной полиграммы сумма углов оказывается равной нулю (что естественно). Доказательство этого факта заключается в следующем: каждое ребро полиграммы (при 1 < k < n / 2 — отброшен случай вырожденной полиграммы и совпадающей с исходным полигоном) делит многоугольник на два: один c k + 1 углом, другой с n — k + 1 . просуммировав суммы углов всех меньших по количеству углов частей (которые с k + 1 углом), получится результат π(k — 1)n (на каждую вершину полигона по одному (k + 1)-угольнику ). Каждый целый угол исходного полигона присутствует k — 1 раз . Плюс к этому по одному разу присутствуют смежные с углами полиграммы углы, Если из первой суммы вычесть присутствующую в ней сумму целых углов полиграммы (которая равна π(n — 2)(k — 1) , так как каждый целый угол встречается k — 1 раз), получится сумма смежных с углами полиграммы углов π(k — 1)n — π(n — 2)(k — 1) . Если теперь из суммы углов исходного полигона вычесть эту сумму углов, получится сумма углов полиграммы:
π(n — 2) — (π(k — 1)n — π(n — 2)(k — 1)) = π(n — 2) — π(k — 1)n + π(n — 2)(k — 1) = π(n — 2)k — π(k — 1)n = π(n — 2k)
Все иллюстрации и рассуждения выше относились к любым полиграммам, построенным на выпуклых многоугольниках. На рисунках я изобразил случаи правильных полиграмм исключительно из собственной лени — так было проще написать рисующую программу. Далее речь пойдет только о правильных полиграммах.
Исходя из формулы выше, угол при вершине правильной полиграммы равенπ — 2πk / n .
Если взять горизонт (множество внешних точек) правильной полиграммы, то данная фигура будет представлять собой невыпуклый 2n-угольник (n — количество вершин полиграммы. Границы фигур справа иллюстрируют это:
![](https://habrastorage.org/r/w1560/getpro/habr/post_images/b08/d13/c99/b08d13c997263ffa39de1098b4ab9359.png)
Таким образом появляется еще n «лишних» углов, которые я буду называть внутренними углами полиграммы. Эти углы невыпуклы, из формулы суммы углов многоугольника для правильной полиграммы они равны(π(2n — 2) — π(n — 2k)) / n = π(n + 2k — 2) / n = π + 2π(k — 1) / n . Обратные по отношению к ним углы равны, соответственно π — 2π(k — 1) / n . Этот угол я буду называть углом между лучами.
Данные вычисления могут пригодиться для построения узоров и забавных орнаментов, что будет проиллюстрировано ниже для терпеливых читателей.
Далее идет достаточно бесполезная часть, которая доставила мне в свое время эстетическое удовольствие, но результатом которой может быть лишь потерянное время читателя, что и послужило причиной добавления в хабр «Забавные задачки».
Все началось с желания изучить свойства правильных октагонов и октаграмм, но результаты оказались применимы ко всем выпуклым многоугольникам (полигонам) и звездам, построенным в них (по аналогии назову их полиграммами — пентаграмма, гексаграмма, септаграмма, октаграмма и т.д. — хотя этот термин имеет и иные значения).
Для начала терминология. Пентаграммой называют совокупность всех диагоналей пятиугольника, в случае гексаграммы — это уже не все диагонали, а только те, которые соединяют непротивоположные вершины шестиугольника. Во обоих случаях эти вершины идут через одну друг от друга. Например, если вершины пятиугольника перенумеровать
![](https://habrastorage.org/getpro/habr/post_images/79e/e3a/8dc/79ee3a8dcece57ca90f14c413e211c57.png)
Определение можно обобщить, введя понятие «порядок полиграммы» как некоторое целое число k, имеющее диапазон значений между 1 и n / 2, где n — количество углов исходного полигона. Верхняя граница k (равная целой части
В случае пентагона согласно формуле существует две обобщенные пентаграммы — сам пентагон и пентаграмма в классическом смысле.
![](https://habrastorage.org/getpro/habr/post_images/030/20d/131/03020d131cd3359b5b151df514be7d89.png)
В случае гексагона есть три обобщенные гексаграммы: сам гексагон, классическая гексаграмма и диагонали, соединяющие противоположенные вершины (вырожденный случай).
![](https://habrastorage.org/getpro/habr/post_images/422/84e/76e/42284e76eaee87a9b105f9eb269bfb79.png)
Для лучше иллюстрации разберу полиграмм для септагона и октагона. По формуле количество септаграмм будет равно трем, количество октаграмм четырем.
![](https://habrastorage.org/getpro/habr/post_images/b70/840/d59/b70840d595d4882f46d35017e326f3bd.png)
![](https://habrastorage.org/getpro/habr/post_images/f85/2d6/b7e/f852d6b7e4a46968a4ec92ebe9d08428.png)
В качестве побочного эффекта можно увидеть, что полиграммы естественным образом делятся на связные и несвязные. Связные полиграммы — это полиграммы, между любой парой вершин которых существует путь по ребрам (перескакивать с ребра на ребро можно только в вершинах многоугольника). Воспользовавшись теорией чисел, можно заметить, что полиграммы связны тогда и только тогда, когда количество углов исходного полигона и порядок полиграммы — взаимно простые числа.
На картинке ниже приведены примеры несвязных полиграмм, их отдельные части выделены разными цветами. Нонаграмма
![](https://habrastorage.org/getpro/habr/post_images/13a/300/782/13a3007821fdbc53cb91a8006d6d270d.png)
Теперь полиграммы с тем же количеством углов (
![](https://habrastorage.org/getpro/habr/post_images/ff8/9fd/88f/ff89fd88f903a105deef41bedd58ae54.png)
Кроме того, в случае четных n и максимальных для такого случая k (k = n / 2) полиграммы вырождаются в набор диагоналей, соединяющих противоположные вершины.
![](https://habrastorage.org/getpro/habr/post_images/4c9/099/0c7/4c90990c74b80720c7d7f614551085b8.png)
Довольно неожиданным для меня результатом оказалось то, что сумма углов при вершинах полиграмм (в случае выпуклых полигонов) является довольно просто вычислимая величина:
Все иллюстрации и рассуждения выше относились к любым полиграммам, построенным на выпуклых многоугольниках. На рисунках я изобразил случаи правильных полиграмм исключительно из собственной лени — так было проще написать рисующую программу. Далее речь пойдет только о правильных полиграммах.
Исходя из формулы выше, угол при вершине правильной полиграммы равен
Если взять горизонт (множество внешних точек) правильной полиграммы, то данная фигура будет представлять собой невыпуклый 2n-угольник (n — количество вершин полиграммы. Границы фигур справа иллюстрируют это:
![](https://habrastorage.org/getpro/habr/post_images/b08/d13/c99/b08d13c997263ffa39de1098b4ab9359.png)
Таким образом появляется еще n «лишних» углов, которые я буду называть внутренними углами полиграммы. Эти углы невыпуклы, из формулы суммы углов многоугольника для правильной полиграммы они равны
Данные вычисления могут пригодиться для построения узоров и забавных орнаментов, что будет проиллюстрировано ниже для терпеливых читателей.
Далее идет достаточно бесполезная часть, которая доставила мне в свое время эстетическое удовольствие, но результатом которой может быть лишь потерянное время читателя, что и послужило причиной добавления в хабр «Забавные задачки».
Узор с октаграммой
При k = 2 угол между лучами будет равен π — 2π / n , что в точности равно углу исходного многоугольника, в котором построена полиграмма. В каких случах такие многоугольники будут плотно примыкать друг к другу, образуя подобие мозаики? иними словами, сумма угла при вершине полиграммы плюс удвоенный угол при вершине многоугольника должны быть равны 2π. Угол при вершине правильной полиграммы в данном случае равен π — 4π / n . Таким образом, получается уравнение:
π — 4π / n + 2(π — 2π / n) = 2π
3π — 8π / n = 2π
8π / n = pi;
n = 8
Таким образом, октаграмму при k = 2 можно получить, нарисовав 8 восьмиугольников, соседние из которых имеют общую сторону — внутренние стороны таких многоугольников образуют горизонт такой октаграммы.
![](https://habrastorage.org/r/w1560/getpro/habr/post_images/73a/092/7dd/73a0927dded696cf7fa196437e36d42a.png)
Октаграмма(n = 8, k = 2) является несвязной и состоит из двух квадратов (углы во всех вершинах прямые: π — 4 π / 8 = π / 2 ). На лучах такой октаграммы можно построить квадраты со стороной, равной стороне луча.
![](https://habrastorage.org/r/w1560/getpro/habr/post_images/8ee/04b/4f2/8ee04b4f2162ec6c977427ce2871a67b.png)
Внутренний угол этой октаграммы равен5π / 4 . Вычитая из внутреннего угла сумму углов квадратов, построенных на лучах, получится угол между сторонами соседних квадратов, находящихся внутри октограммы. Этот угол равен π / 4 . Итак, внутренние стороны квадратов образуют звездообразную фигуру с углами при восьми вершинах π / 4 и углами между лучами π / 2 (угол при вершине квадрата). Таким образом, внутренние углы этой фигуры будут равны 3π / 2 .
Если теперь рассмотреть углы октаграммы(n = 8, k = 3) , обнаруживается, что угол при вершине равен π — 2πk / n = π / 4 , а внутренние углы π + 2π(k — 1) / n = 3π / 2 , что в точности соответсвует фигуре, ограниченной квадратами, описанными выше.
Иллюстрацией этих вычислений может послужить симпатичная картинка:
![](https://habrastorage.org/r/w1560/getpro/habr/post_images/3fa/9e3/cd5/3fa9e3cd55337d42c9ecdbd8d6a77308.png)
Таким образом, октаграмму при k = 2 можно получить, нарисовав 8 восьмиугольников, соседние из которых имеют общую сторону — внутренние стороны таких многоугольников образуют горизонт такой октаграммы.
![](https://habrastorage.org/getpro/habr/post_images/73a/092/7dd/73a0927dded696cf7fa196437e36d42a.png)
Октаграмма
![](https://habrastorage.org/getpro/habr/post_images/8ee/04b/4f2/8ee04b4f2162ec6c977427ce2871a67b.png)
Внутренний угол этой октаграммы равен
Если теперь рассмотреть углы октаграммы
Иллюстрацией этих вычислений может послужить симпатичная картинка:
![](https://habrastorage.org/getpro/habr/post_images/3fa/9e3/cd5/3fa9e3cd55337d42c9ecdbd8d6a77308.png)
Гексагоно-гексаграммная мозаика
Рассмотрю опять случай k = 2 . Как было описано выше в случае с октаграммой, в угол между лучами правильной полиграммы в таком случае может быть вписан правильный многоугольник с числом углов, равным числу вершин полиграммы. При этом сумма углов двух многоугольников и луча полиграммы, к которому они прилегают, в случае n > 8 будет превышать 2π, в случае n < 8 будет менее 2π. В первом случае построить что-то на данный момент интересное не удастся, а во втором в оставшееся место можно вписать что-то еще. Это может быть еще один многоугольник либо луч полиграммы.
Если это третий многоугольник, то количество сторон можно вычислить уравнением:
π — 4π / n + 3(π — 2π / n) = 2π
2π — 10π / n = 0
n = 5
Таким образом, вокруг луча пятиконечной звезды можно нарисовать три пятиугольника с общей вершиной в вершине пентаграммы. К сожалению, в данном случае мозаики не получится, разве что узор, подобный описанному выше, где вокруг вершины каждого луча группируется три пятиугольника:
![](https://habrastorage.org/r/w1560/getpro/habr/post_images/3c9/69d/fc4/3c969dfc4165729482265d6e9fdb51f9.png)
Рассматривая случай с двумя многоугольниками и двумя лучами, можно придти к следующему уравнению:
2(π — 4π / n) + 2(π — 2π / n) = 2π
2π — 12π / n = 0
n = 6
Результатом получается вот такая мозаика:
![](https://habrastorage.org/r/w1560/getpro/habr/post_images/24e/8a5/9ea/24e8a59eacceff37a3cfa7e4995ab794.png)
Если это третий многоугольник, то количество сторон можно вычислить уравнением:
Таким образом, вокруг луча пятиконечной звезды можно нарисовать три пятиугольника с общей вершиной в вершине пентаграммы. К сожалению, в данном случае мозаики не получится, разве что узор, подобный описанному выше, где вокруг вершины каждого луча группируется три пятиугольника:
![](https://habrastorage.org/getpro/habr/post_images/3c9/69d/fc4/3c969dfc4165729482265d6e9fdb51f9.png)
Рассматривая случай с двумя многоугольниками и двумя лучами, можно придти к следующему уравнению:
Результатом получается вот такая мозаика:
![](https://habrastorage.org/getpro/habr/post_images/24e/8a5/9ea/24e8a59eacceff37a3cfa7e4995ab794.png)