From d4b7d304c257256211e7a365bf9d0cfcbc99b15f Mon Sep 17 00:00:00 2001 From: Sergey Kuzminov Date: Fri, 22 Jun 2018 07:22:58 +0500 Subject: [PATCH 1/2] ifs dragon --- index.html | 120 +++++++---------------------------------------------- main.js | 36 ++++++++++++++++ 2 files changed, 51 insertions(+), 105 deletions(-) create mode 100644 main.js diff --git a/index.html b/index.html index 39a9d04..f0e7940 100644 --- a/index.html +++ b/index.html @@ -1,110 +1,20 @@ - + - - - - - - - - - + + + + + + \ No newline at end of file diff --git a/main.js b/main.js new file mode 100644 index 0000000..11657a6 --- /dev/null +++ b/main.js @@ -0,0 +1,36 @@ +let canvas = document.getElementById('canv'); +let ctx = canvas.getContext("2d"); + +const scaleFactor = 250; +ctx.transform(scaleFactor, 0, 0, scaleFactor, canvas.width / 2, canvas.height / 2); + + +const transforms = [p => { + return { + x: p.x * 0.5 + p.y * 0.5, + y: -p.x * 0.5 + p.y * 0.5 + } +} , + p => { + return { + x: -p.x * 0.5 + p.y * 0.5 - 1, + y: -p.x * 0.5 - p.y * 0.5 + } + }] + + +const drawDragon = (depth, prevPoint) => { + if (depth <= 0) return; + + let p1 = transforms[0](prevPoint); + let p2 = transforms[1](prevPoint); + + drawPoint(p1); + drawPoint(p2); + + drawDragon(depth - 1, p1); + drawDragon(depth - 1, p2); +} + +const drawPoint = p => ctx.fillRect(p.x, p.y, 1 / scaleFactor, 1 / scaleFactor); +drawDragon(17, {x: 0, y: 0}); \ No newline at end of file From 14c900229d41171d56d0980f19e81f3c0b2b995a Mon Sep 17 00:00:00 2001 From: Sergey Kuzminov Date: Fri, 22 Jun 2018 07:27:52 +0500 Subject: [PATCH 2/2] Update README.md --- README.md | 28 ---------------------------- 1 file changed, 28 deletions(-) diff --git a/README.md b/README.md index 0ecbdae..d31cd10 100644 --- a/README.md +++ b/README.md @@ -1,29 +1 @@ -# Задание 4. Дракон Хартера-Хейтуэя -Написать программу, выполняющую построение дракона Хартера-Хейтуэя с помощью системы итерируемых функций (IFS). - -## Метод построения -Задачу можно решить с помощью рекурсии. -* На каждом шаге функция принимает отрезок в виде координат двух крайних точек. -* Каждое из двух преобразований IFS генерирует по отрезку. -При этом достаточно произвести вычисления только для двух крайних точек исходного отрезка, т.к. в нашем случае IFS состоит из аффинных преобразований, которые переводят отрезок в отрезок. -* Каждый новый отрезок запускает новую ветку рекурсии. - -![Построение](/images/ifs.png) - -## Входные данные -* количество итераций `n` - -## Описание IFS -### Первое преобразование IFS -x1' = 0.5x + 0.5y
-y1' = -0.5x + 0.5y
- -### Второе преобразование IFS -x2' = -0.5x + 0.5y - 1
-y2' = -0.5x - 0.5y
- -## Замечания -* Вследствие того, что описанная IFS является сжимающим отображением выбор начального отрезка не принципиален - результат при большом числе итераций будет одинаков. -* Хотя построение фрактала с помощью IFS реализовывается через рекурсию, здесь есть особенности. При вычислении любой точки нового поколения кривой используется только одна точка предыдущего поколения и одно из двух преобразований IFS. - ![Дракон Хартера-Хейтуэя](/images/dragon.png)