сворачивание четырехугольников

Aug 16, 2006 20:47

Недавно, по наводке aleksei баловался с довольно прикольной штукой -- сворачивал четырехугольники. Задача это уже почти классическая, но картинки получаются интересные...

Значит так. Берем четырехугольник и задаем его декартовыми координатами (представив их в виде комплексных чисел) всех четырех вершин. Практически без ограничения общности можно взять (центрированную в начале координат) трапецию с периметром 4. Все такие трапеции описываются двумя параметрами -- длинами сторон (короткой и длинной); обозначим их μ и ν. Диадный (слева μ, справа ν, или наоборот) глагол
ini =: [: (, +@|.) ([: (,~ -) @ %: @ >: * - +) j. ,вычисляет координаты вершин четырехугольника для заданных μ и ν. Вот так:
0.65 ini 0.2
_0.52915j0.65 0.52915j0.2 0.52915j_0.2 _0.52915j_0.65. Дальше, проводим у этого четырехугольника диагональ между второй и третьей вершинами, а затем отражаем первую вершину зеркально, относительно этой диагонали. Получаем новый четырехугольник, состоящий из последних трех вершин предыдущего и новой, отраженной, добавленной в конец. Определим теперь глагол it, который бы именно это и делал. Тоесть, добавлял бы в конец массива четвертую с конца вершину, отраженную относительно диагонали, проведенной между третьей и второй с конца:
it =: , (([: ({: * [: %/ +) [: -/ _4 _1&{ ,: _3&{) + _3&{)Понятно, что, многократно применяя данный глагол к начальному четырех угольнику, мы получим массив из некоторого количества точек (сколько раз применим, сколько точек и добавится):
it (0.65 ini 0.2)
_0.52915j0.65 0.52915j0.2 0.52915j_0.2 _0.52915j_0.65 0.740236j_0.930461Как будут расположены эти точки ?

Давайте нарисуем ! Для этого введем следующие строки (определение диадного глагола draw):
require 'plot'
draw =: dyad define
pd 'reset; type dot; pensize 2'
pd <"1 |: +. it^:x ({. ini {:) y
pd 'show'
)Теперь команда n draw μ ν нарисует n+4 точки, получающиеся итерацией глагола it в применении к начальной трапеции μ ini ν. Для начала построим 0, 1 и 100 итераций нашей исходной трапеции:

0 draw 0.65 0.2
1 draw 0.65 0.2
100 draw 0.65 0.2(нажмите на соотв. команду, чтобы увидеть картинку) Вроде бы случайный набор точек ? И действительно, точки скачут случайно (для большинства комбинаций параметров -- случайно в строгом математическом смысле). Однако, если их взять много, вырисовываются довольно забавные кривые, причем, разнообразие их для разных значений параметров просто поражает ! Например:
10000 draw 0.65 0.2
10000 draw 0.2001 0.2
10000 draw 0.33333333 0.25
10000 draw 0.35 0.2
Вот попробуйте поменять параметры и построить другие кривые... Неожиданности гарантирую ! Не пренебрегайте сотыми и тысячными. Жду параметров самых прикольных картинок в комментариях !

Ну а я пока поеду в Бердянск на море и тоже побалуюсь с этими картинками на КПК. Уезжаю завтра, вернусь через 4 дня. Потом снова поеду. Вполне возможно пару раз выйду на связь оттуда !

update (21.8.2006): Бердянск рулит ! Ну мы вчера (тоесть сегодня) и оторвались с пацанами из МИЭТ... Сейчас я в Донецке, завтра (или после-завтра) обратно в Бердянск. Show must go on ! ;-)) Краткий отчет: таки осилил треть книги "Морфология истории", при помощи Pocket Stars научился находить на небе множество созвездий, Юпитер, яркие звезды; значительно ускорил программу по рассчету сворачивания многоугольников, вот новая версия:
ini=:(,~ -)@(, -)@(* %:@>:@- +) j. , , -@,~
it=:_3&{. , ({: * [: %/ +)@(_4 _1&{ - _3 _3&{) + _3&{
itnrm=:{."1@:}: , {:
require 'plot'
draw =: dyad define
pd 'reset; type dot; pensize 2'
pd <"1 |: +. itnrm it^:(очень своеобразные картинки получаются, когда μ + ν = 1. Например:
1000000 draw 0.8 0.2
1000000 draw 0.7 0.3
1000000 draw 0.9 0.1
update (8.11.2013): пересчитал картинки и перенаправил ссылки на новый сайт

j

Previous post Next post
Up