Комментарии 12
За енота спасибо.
Откуда у вас план моего микрорайона?
То что правильный треугольник нельзя нарисовать по точкам - это понятно. А как обстоит дело с правильными тетраэдрами (симплексами) в других размерностях? Ни для кого не секрет, что в любой размерности вида N = k^2 - 1 можно расположить N вершин тетраэдра на координатных осях на расстоянии (k-1) от нуля, а оставшуюся вершину - в точке (1, 1, ..., 1).
В прочих размерностях, если они четные, объем симплекса иррациональный, хотя должен быть рациональным (ведь такой симплекс можно порезать на ориентированные по осям прямоугольные симплексы с вершинами в рациональных точках, имеющие рациональный объем). В нечетных размерностях можно легко добиться рационального объема, при условии что длина ребра содержит определенный радикал, например, в 5D это должен быть корень из 3. Но что-то подобрать координаты пока не удалось.
Очень качественный цикл статей. Всё-таки, именно красота математики и влюбляет в нее
Мне показалось немного странным говорить о гауссовых числах, но ничего не сказать о комплексной плоскости. Понятно, что материал для детей, но дети в школе, а на хабре аудитория чуть повзрослее. Соответственно, и вопросы стоят чуть другие — например, не просто нарисовать вектор с углом, а аппроксимировать произвольный угол или длину вектора в пределах заданной точности, а значения например ограничить простыми числами. Ну или как площадь таких многоугольников посчитать без тригонометрии, ждал этого в статье.
Вы правы! В таких случаях непросто понять, где начать (последовательно ввести комплексные числа, или счесть, что это уже известно) и где остановиться (остановиться на квадратных решётках или увлечься и рассказать про числа Эйзенштейна или опространственных решётках и дойти до обобщённой теоремы Пика).
Опять же, формула Пика достаточно наглядна, когда многоугольник нарисован на тетрадном листочке, и пересчитать узлы вручную довольно просто. Но как это сделать алгоритмически? Когда вершины многоугольника задаются не визуально, а конкретными гауссовыми числами. Интуиция подсказывает, что считать узлы это не единственный путь, а формулу Пика можно использовать для обоснования корректности округления результата с шагом 1/2.
Для алгоритмического вычисления площади многоугольника, заданного списком координат вершин, мне кажется, лучше не гауссовыми числами воспользоваться, а векторным произведением, "пройдя" из одной вершины по всем прочим, и вычислив ротор единичного потока. При этом для n-угольника сложность O(n), тригонометрия не всплывает, а целочисленность координат особой роли не играет. Но я не могу сказать, что крепко подумал перед тем, как написать этот комментарий, возможно, есть идеи и получше.
Есть идеи как минимум попроще. Разбить многоугольник на треугольники, а их площадь считать сразу через координаты, результаты суммировать. Целочисленность координат играет роль для уверенности в предельной точности полученного результата и возможности хранить его в целочисленном типе данных, поскольку множитель 1/2 можно вынести за скобки, а умножение целых чисел на целые гарантированно дадут целый результат (ну и с рациональными так же).
function area(pts)
(x0,y0) = pts[1]
res = 0
for i in 2:length(pts)-1
(x1,y1) = pts[i]
(x2,y2) = pts[i+1]
res += (x1-x0)*(y2-y0)-(y1-y0)*(x2-x0)
end
return res/2
end
Мой способ с ротором только звучит страшно, а по сути является разбиением на треугольники, и вычисляется не сложнее, чем любой из способов, приведённых в материале по вашей ссылке.
Статья про ротор из Википедии выглядит страшной даже для взрослого человека. Никогда не понимал, зачем усложнять то, что можно упростить.
Математическая продлёнка. Рисуем по клеточкам