Dr. K. L. Metlov (dr_klm) wrote,
Dr. K. L. Metlov
dr_klm

Categories:

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

Недавно, по наводке 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^:(<x+1) ({. ini {:) y
pd 'show'
)
очень своеобразные картинки получаются, когда μ + ν = 1. Например:
   1000000 draw 0.8 0.2
   1000000 draw 0.7 0.3
   1000000 draw 0.9 0.1

update (8.11.2013): пересчитал картинки и перенаправил ссылки на новый сайт
Tags: j
Subscribe

  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 10 comments