Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- {
- "cells": [
- {
- "cell_type": "code",
- "execution_count": 14,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "data": {
- "text/html": [
- "<canvas id=\"c00\">\n",
- "<script>\n",
- " var c00 = document.querySelector('#c00');\n",
- " c00.width = 200;\n",
- " c00.height = 200;\n",
- "</script>"
- ],
- "text/plain": [
- "<IPython.core.display.HTML object>"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- }
- ],
- "source": [
- "%%html\n",
- "<canvas id=\"c00\">\n",
- "<script>\n",
- " var c00 = document.querySelector('#c00');\n",
- " c00.width = 200;\n",
- " c00.height = 200;\n",
- "</script>"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 15,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "data": {
- "application/javascript": [
- "var g00 = c00.getContext('2d');\n",
- "g00.fillStyle = \"rgb(56, 56, 56)\";\n",
- "g00.fillRect(0, 0, g00.canvas.width, g00.canvas.height);\n",
- "g00.strokeStyle = \"rgb(255, 255, 255)\";\n",
- "g00.beginPath();\n",
- "g00.arc(g00.canvas.width/2, g00.canvas.height/2, 20, 0, 2*Math.PI);\n",
- "g00.stroke();"
- ],
- "text/plain": [
- "<IPython.core.display.Javascript object>"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- }
- ],
- "source": [
- "%%javascript\n",
- "var g00 = c00.getContext('2d');\n",
- "g00.fillStyle = \"rgb(56, 56, 56)\";\n",
- "g00.fillRect(0, 0, g00.canvas.width, g00.canvas.height);\n",
- "g00.strokeStyle = \"rgb(255, 255, 255)\";\n",
- "g00.beginPath();\n",
- "g00.arc(g00.canvas.width/2, g00.canvas.height/2, 20, 0, 2*Math.PI);\n",
- "g00.stroke();"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 16,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "data": {
- "text/html": [
- "<canvas id=\"c01\">\n",
- "<script>\n",
- " var c01 = document.querySelector('#c01');\n",
- " c01.width = 200;\n",
- " c01.height = 200;\n",
- " var g01 = c01.getContext('2d');\n",
- " g01.fillStyle = \"rgb(56, 56, 56)\";\n",
- " g01.fillRect(0, 0, g01.canvas.width, g01.canvas.height);\n",
- " g01.strokeStyle = \"rgb(255, 255, 255)\";\n",
- " \n",
- " function drawCircle(ctx, tx, ty, r) {\n",
- " ctx.save();\n",
- " ctx.translate(tx, ty);\n",
- " ctx.beginPath();\n",
- " ctx.arc(0, 0, r, 0, 2*Math.PI);\n",
- " ctx.stroke();\n",
- " ctx.restore();\n",
- " }\n",
- " function rotMtx(v, deg) {\n",
- " var rad = deg*Math.PI/180;\n",
- " var cos = Math.cos(rad);\n",
- " var sin = Math.sin(rad);\n",
- " return [cos * v[0] - sin * v[1], sin * v[0] + cos * v[1]];\n",
- " }\n",
- " var c = [g01.canvas.width/2, g01.canvas.height/2];\n",
- " var r = 20;\n",
- " drawCircle(g01, c[0], c[1], r);\n",
- " var v = [0, r];\n",
- " for(var i = 0; i < 6; i++) {\n",
- " var vi = rotMtx(v, 60*i);\n",
- " drawCircle(g01, c[0]+vi[0], c[1]+vi[1], r);\n",
- " }\n",
- "\n",
- "\n",
- "</script>"
- ],
- "text/plain": [
- "<IPython.core.display.HTML object>"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- }
- ],
- "source": [
- "%%html\n",
- "<canvas id=\"c01\">\n",
- "<script>\n",
- " var c01 = document.querySelector('#c01');\n",
- " c01.width = 200;\n",
- " c01.height = 200;\n",
- " var g01 = c01.getContext('2d');\n",
- " g01.fillStyle = \"rgb(56, 56, 56)\";\n",
- " g01.fillRect(0, 0, g01.canvas.width, g01.canvas.height);\n",
- " g01.strokeStyle = \"rgb(255, 255, 255)\";\n",
- " \n",
- " function drawCircle(ctx, tx, ty, r) {\n",
- " ctx.save();\n",
- " ctx.translate(tx, ty);\n",
- " ctx.beginPath();\n",
- " ctx.arc(0, 0, r, 0, 2*Math.PI);\n",
- " ctx.stroke();\n",
- " ctx.restore();\n",
- " }\n",
- " function rotMtx(v, deg) {\n",
- " var rad = deg*Math.PI/180;\n",
- " var cos = Math.cos(rad);\n",
- " var sin = Math.sin(rad);\n",
- " return [cos * v[0] - sin * v[1], sin * v[0] + cos * v[1]];\n",
- " }\n",
- " var c = [g01.canvas.width/2, g01.canvas.height/2];\n",
- " var r = 20;\n",
- " drawCircle(g01, c[0], c[1], r);\n",
- " var v = [0, r];\n",
- " for(var i = 0; i < 6; i++) {\n",
- " var vi = rotMtx(v, 60*i);\n",
- " drawCircle(g01, c[0]+vi[0], c[1]+vi[1], r);\n",
- " }\n",
- "\n",
- "\n",
- "</script>"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 17,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "data": {
- "text/html": [
- "<canvas id=\"c02\">\n",
- "<script>\n",
- " var g02;\n",
- " function drawCircle(ctx, t) {\n",
- " ctx.save();\n",
- " ctx.translate(t[0], t[1]);\n",
- " ctx.beginPath();\n",
- " ctx.arc(0, 0, 20, 0, 2*Math.PI);\n",
- " ctx.strokeStyle = \"rgb(255, 255, 255)\";\n",
- " ctx.stroke();\n",
- " ctx.restore();\n",
- " }\n",
- " function rotMtx(v, deg) {\n",
- " var rad = deg*Math.PI/180;\n",
- " var cos = Math.cos(rad);\n",
- " var sin = Math.sin(rad);\n",
- " return [cos * v[0] - sin * v[1], sin * v[0] + cos * v[1]];\n",
- " }\n",
- " function seven(ctx, c) {\n",
- " drawCircle(ctx, c);\n",
- " var v = [0, 20];\n",
- " for(var i = 0; i < 6; i++) {\n",
- " var vi = rotMtx(v, 60*i);\n",
- " drawCircle(ctx, [c[0]+vi[0], c[1]+vi[1]]);\n",
- " }\n",
- " }\n",
- " function setup(width, height) {\n",
- " g02 = document.querySelector('#c02').getContext('2d');\n",
- " g02.canvas.width = width;\n",
- " g02.canvas.height = height;\n",
- " g02.fillStyle = \"rgb(56, 56, 56)\";\n",
- " g02.fillRect(0, 0, width, height);\n",
- " }\n",
- " function draw() {\n",
- " var c = [g02.canvas.width/2, g02.canvas.height/2];\n",
- " seven(g02, c);\n",
- " var v = [0, 100];\n",
- " for(var i = 0; i < 6; i++) {\n",
- " var vi = rotMtx(v, 60*i);\n",
- " seven(g02, [c[0]+vi[0], c[1]+vi[1]]);\n",
- " }\n",
- " }\n",
- " /*\n",
- " function repeat(ctx, c, r, fn) {\n",
- " fn(ctx, c);\n",
- " var v = [0, r];\n",
- " for(var i = 0; i < 6; i++) {\n",
- " var vi = rotMtx(v, 60*i);\n",
- " fn(ctx, [c[0]+vi[0], c[1]+vi[1]]);\n",
- " }\n",
- " }\n",
- " */\n",
- " setup(300, 300);\n",
- " draw();\n",
- "</script>"
- ],
- "text/plain": [
- "<IPython.core.display.HTML object>"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- }
- ],
- "source": [
- "%%html\n",
- "<canvas id=\"c02\">\n",
- "<script>\n",
- " var g02;\n",
- " function drawCircle(ctx, t) {\n",
- " ctx.save();\n",
- " ctx.translate(t[0], t[1]);\n",
- " ctx.beginPath();\n",
- " ctx.arc(0, 0, 20, 0, 2*Math.PI);\n",
- " ctx.strokeStyle = \"rgb(255, 255, 255)\";\n",
- " ctx.stroke();\n",
- " ctx.restore();\n",
- " }\n",
- " function rotMtx(v, deg) {\n",
- " var rad = deg*Math.PI/180;\n",
- " var cos = Math.cos(rad);\n",
- " var sin = Math.sin(rad);\n",
- " return [cos * v[0] - sin * v[1], sin * v[0] + cos * v[1]];\n",
- " }\n",
- " function seven(ctx, c) {\n",
- " drawCircle(ctx, c);\n",
- " var v = [0, 20];\n",
- " for(var i = 0; i < 6; i++) {\n",
- " var vi = rotMtx(v, 60*i);\n",
- " drawCircle(ctx, [c[0]+vi[0], c[1]+vi[1]]);\n",
- " }\n",
- " }\n",
- " function setup(width, height) {\n",
- " g02 = document.querySelector('#c02').getContext('2d');\n",
- " g02.canvas.width = width;\n",
- " g02.canvas.height = height;\n",
- " g02.fillStyle = \"rgb(56, 56, 56)\";\n",
- " g02.fillRect(0, 0, width, height);\n",
- " }\n",
- " function draw() {\n",
- " var c = [g02.canvas.width/2, g02.canvas.height/2];\n",
- " seven(g02, c);\n",
- " var v = [0, 100];\n",
- " for(var i = 0; i < 6; i++) {\n",
- " var vi = rotMtx(v, 60*i);\n",
- " seven(g02, [c[0]+vi[0], c[1]+vi[1]]);\n",
- " }\n",
- " }\n",
- " /*\n",
- " function repeat(ctx, c, r, fn) {\n",
- " fn(ctx, c);\n",
- " var v = [0, r];\n",
- " for(var i = 0; i < 6; i++) {\n",
- " var vi = rotMtx(v, 60*i);\n",
- " fn(ctx, [c[0]+vi[0], c[1]+vi[1]]);\n",
- " }\n",
- " }\n",
- " */\n",
- " setup(300, 300);\n",
- " draw();\n",
- "</script>"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "반복되는 패턴이 보인다.\n",
- "1. 반지름 r 이 주어진다.\n",
- "2. 7개의 중심좌표를 계산한다.\n",
- "3. 좌표마다 원을 그린다.\n",
- "4. 원하는 만큼 1,2,3을 반복한다.\n",
- "\n",
- "일단 7개의 중심좌표를 구하는 것부터 해볼까."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 18,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "data": {
- "text/html": [
- "<canvas id=\"c03\">\n",
- "<script>\n",
- " var g03;\n",
- " function rot (startPoint, degree) {\n",
- " var x = startPoint[0];\n",
- " var y = startPoint[1];\n",
- " var r = startPoint[2];\n",
- " var rad = degree * Math.PI/180;\n",
- " var c = Math.cos(rad);\n",
- " var s = Math.sin(rad);\n",
- " return [c * x - s * y, s * x + c * y, r];\n",
- " }\n",
- "\n",
- " function make_seven (radius) {\n",
- " var s0 = [0, 0, radius];\n",
- " var s1 = [0, radius, radius];\n",
- " var s2 = rot(s1, 60);\n",
- " var s3 = rot(s2, 60);\n",
- " var s4 = rot(s3, 60);\n",
- " var s5 = rot(s4, 60);\n",
- " var s6 = rot(s5, 60);\n",
- " return [s0, s1, s2, s3, s4, s5, s6];\n",
- " }\n",
- "\n",
- " function setup(width, height) {\n",
- " g03 = document.querySelector('#c03').getContext('2d');\n",
- " g03.canvas.width = width;\n",
- " g03.canvas.height = height;\n",
- " g03.fillStyle = \"rgb(56, 56, 56)\";\n",
- " g03.fillRect(0, 0, width, height);\n",
- " }\n",
- " function drawCircle(ctx, x, y, r) {\n",
- " ctx.save();\n",
- " ctx.beginPath();\n",
- " ctx.arc(x, y, r, 0, 2*Math.PI);\n",
- " ctx.strokeStyle = \"rgb(255, 255, 255)\";\n",
- " ctx.stroke();\n",
- " ctx.restore();\n",
- " }\n",
- " \n",
- " setup(300, 300);\n",
- " var s = [g03.canvas.width/2, g03.canvas.height/2];\n",
- " \n",
- " // 반지름 r 이 주어진다.\n",
- " var sr = 20;\n",
- " \n",
- " // 7개의 중심좌표를 계산하고 각 좌표마다 원을 그린다.\n",
- " g03.save();\n",
- " g03.translate(s[0], s[1] + 0*sr);\n",
- " make_seven(sr).forEach(function(element, index, array) {\n",
- " drawCircle(g03, element[0], element[1], element[2]);\n",
- " })\n",
- " g03.restore();\n",
- " \n",
- " g03.save();\n",
- " g03.translate(s[0], s[1] - 4*sr);\n",
- " make_seven(sr).forEach(function(element, index, array) {\n",
- " drawCircle(g03, element[0], element[1], element[2]);\n",
- " })\n",
- " g03.restore();\n",
- "</script>"
- ],
- "text/plain": [
- "<IPython.core.display.HTML object>"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- }
- ],
- "source": [
- "%%html\n",
- "<canvas id=\"c03\">\n",
- "<script>\n",
- " var g03;\n",
- " function rot (startPoint, degree) {\n",
- " var x = startPoint[0];\n",
- " var y = startPoint[1];\n",
- " var r = startPoint[2];\n",
- " var rad = degree * Math.PI/180;\n",
- " var c = Math.cos(rad);\n",
- " var s = Math.sin(rad);\n",
- " return [c * x - s * y, s * x + c * y, r];\n",
- " }\n",
- "\n",
- " function make_seven (radius) {\n",
- " var s0 = [0, 0, radius];\n",
- " var s1 = [0, radius, radius];\n",
- " var s2 = rot(s1, 60);\n",
- " var s3 = rot(s2, 60);\n",
- " var s4 = rot(s3, 60);\n",
- " var s5 = rot(s4, 60);\n",
- " var s6 = rot(s5, 60);\n",
- " return [s0, s1, s2, s3, s4, s5, s6];\n",
- " }\n",
- "\n",
- " function setup(width, height) {\n",
- " g03 = document.querySelector('#c03').getContext('2d');\n",
- " g03.canvas.width = width;\n",
- " g03.canvas.height = height;\n",
- " g03.fillStyle = \"rgb(56, 56, 56)\";\n",
- " g03.fillRect(0, 0, width, height);\n",
- " }\n",
- " function drawCircle(ctx, x, y, r) {\n",
- " ctx.save();\n",
- " ctx.beginPath();\n",
- " ctx.arc(x, y, r, 0, 2*Math.PI);\n",
- " ctx.strokeStyle = \"rgb(255, 255, 255)\";\n",
- " ctx.stroke();\n",
- " ctx.restore();\n",
- " }\n",
- " \n",
- " setup(300, 300);\n",
- " var s = [g03.canvas.width/2, g03.canvas.height/2];\n",
- " \n",
- " // 반지름 r 이 주어진다.\n",
- " var sr = 20;\n",
- " \n",
- " // 7개의 중심좌표를 계산하고 각 좌표마다 원을 그린다.\n",
- " g03.save();\n",
- " g03.translate(s[0], s[1] + 0*sr);\n",
- " make_seven(sr).forEach(function(element, index, array) {\n",
- " drawCircle(g03, element[0], element[1], element[2]);\n",
- " })\n",
- " g03.restore();\n",
- " \n",
- " g03.save();\n",
- " g03.translate(s[0], s[1] - 4*sr);\n",
- " make_seven(sr).forEach(function(element, index, array) {\n",
- " drawCircle(g03, element[0], element[1], element[2]);\n",
- " })\n",
- " g03.restore();\n",
- "</script>"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "collapsed": true
- },
- "source": [
- "아 안되네. \n",
- "재귀호출의 형태가 잡히지 않는다. \n",
- "현재 순서는 다음과 같다. \n",
- "* canvas 의 중심으로 translate.\n",
- "* 7개의 좌표를 구한다.\n",
- "* 반지름 r 인 7개의 원을 그린다.\n",
- "\n",
- "이러면 안되겠다. \n",
- "* 중심으로 이동\n",
- "* 반지름 r 인 원을 그리지\n",
- "\n",
- "여기서 부터 반복이 필요한가? \n",
- "* 현재 중심에서 위로 d 만큼 이동(현재 중심의 y 좌표에 -d 만큼 더해야 한다.)\n",
- "* 이동한 중심에서 반지름 r 인 원을 그리지\n",
- "* 다시 원래 중심으로 좌표계 이동\n",
- "* 좌표계를 오른쪽으로 60만큼 회전\n",
- "\n",
- "근데 위의 방법은 가장 마지막에 해보고 싶다. \n",
- "현재 내가 하고 싶은 방법은 뭐지.. \n",
- "솔직히 이동도 필요없다. \n",
- "모두 좌표로 계산하면 될 듯한데. "
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "collapsed": true
- },
- "source": [
- "## L-system rule 로 표현 할 수 있을까?\n",
- "* l-system 에서는 하나의 무언가를 같거나, 다른 무언가로 대체한다. 세대(genenration)별로. 루프를 돈다.\n",
- "* 원을 반복적으로 그리는 것도 그런 것으로 바꿀 수 있을까?\n",
- "* 약간 다른 느낌이 든다.\n",
- "* l-system 은 이렇게 하면 어떤 것이 나오나 보자 이고. 내가 하는 것은 이렇게 하면 이런 것이 나오는 건 아는데 어떻게 재귀적으로 할까 라는 측면이고.\n",
- "* 거꾸로 rule 을 만드려니 어거지로 끼워맞추고 있다는 생각도 들고.\n",
- "* 핵심은 parent, child, parent ... 로 이어지는 루프다. \n",
- "\n",
- "* A: 현재 좌표에서 반지름r 인 원을 그린다.\n",
- "* B: Y축으로 d 만큼 이동한다.(d 는 + 일수도 - 일수도)\n",
- "* C: Y축으로 -d 만큼 이동한다.\n",
- "* +: 현재 좌표에서 60도만큼 왼쪽으로 회전한다.\n",
- "\n",
- "\n",
- "* A\n",
- "* B A C + B A C + B A C + B A C + B A C + B A C +\n",
- "\n",
- "* B B\n",
- "* B A C + B A C + B A C + B A C + B A C + B A C +\n",
- "* C C\n",
- "* +\n",
- "* B B\n",
- "* B A C + B A C + B A C + B A C + B A C + B A C +\n",
- "* C C\n",
- "* +\n",
- "* B B\n",
- "* B A C + B A C + B A C + B A C + B A C + B A C +\n",
- "* C C\n",
- "* +\n",
- "* B B\n",
- "* B A C + B A C + B A C + B A C + B A C + B A C +\n",
- "* C C\n",
- "* +\n",
- "* B B\n",
- "* B A C + B A C + B A C + B A C + B A C + B A C +\n",
- "* C C\n",
- "* +\n",
- "* B B\n",
- "* B A C + B A C + B A C + B A C + B A C + B A C +\n",
- "* C C\n",
- "* +\n",
- "\n",
- "뭔가 이상하다. 멈추고. 생각해보자. \n",
- "l-system 에서는 문자를 대체하는 룰뿐이다. \n",
- "다른 것으로 대체하지 않고 +, - 처럼 자기 자신을 그대로 다음 세대에 전달할 수도 있다. \n",
- "A 라는 것이 명확하지 않다. \n",
- "아니다 명확하다. 나중에 drawCircle 이라는 rule 로 대체할 수 있다. \n",
- "그렇다면 오히려 B가 불명확한건가. \n",
- "B 는 moveByMinusYOffset 이라고 할까 "
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## 0406\n",
- "마침내 찾았다 패턴을!\n",
- "\n",
- "`A` 의 다음 세대는 확실히 `BAC+BAC+BAC+BAC+BAC+BAC+` 이다. \n",
- "그런데 이것을 한 줄로 표시하면 다음 패턴을 발견하기 어렵다. \n",
- "이것을 다음과 같이 여러 줄로 나눠서 표시했더니 패턴을 발견할 수 있었다.\n",
- "```\n",
- "`B`\n",
- "`A`\n",
- "`C`\n",
- "`+`\n",
- "`B`\n",
- "`A`\n",
- "`C`\n",
- "`+`\n",
- "`B`\n",
- "`A`\n",
- "`C`\n",
- "```\n",
- "\n",
- "이런 식으로 `BAC+`가 6번 나오는 패턴이다. \n",
- "즉 다음과 같은 l-system rule 을 만들 수 있다.\n",
- "```\n",
- "`A`: `BAC+BAC+BAC+BAC+BAC+BAC+`\n",
- "`B`: `BB`\n",
- "`+`: `+`\n",
- "`C`: `CC`\n",
- "```\n",
- "\n",
- "그리고 drawing rule 은 다음과 같이 정의할 수 있다.\n",
- "```\n",
- "`A`: 중심은 현재 좌표이고 반지름 r 인 원을 그린다.\n",
- "`B`: Y축으로 d 만큼 이동한다.(d 는 + 일수도 - 일수도)\n",
- "`C`: Y축으로 -d 만큼 이동한다.\n",
- "`+`: 현재 좌표에서 60도만큼 왼쪽으로 회전한다.\n",
- "```"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "collapsed": true
- },
- "source": [
- "## 구현\n",
- "\n",
- "일단 Brackets 를 이용해서 작성했던 lsystem 코딩을 가져오자.\n",
- "우선 lsystemrule object 부터."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 19,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "data": {
- "text/html": [
- "<div id=\"t04\"></div>\n",
- "<canvas id=\"c04\">\n",
- "<script>\n",
- " var t04;\n",
- " var g04;\n",
- " var lsystemRule = {\n",
- " 'A': 'ABAC+BAC+BAC+BAC+BAC+BAC+',\n",
- " 'B': 'BB',\n",
- " 'C': 'CC',\n",
- " '+': '+'\n",
- " };\n",
- " var drawRule = {\n",
- " 'A': function() {\n",
- " drawCircle();\n",
- " },\n",
- " 'B': function() {\n",
- " moveUpByd();\n",
- " },\n",
- " 'C': function() {\n",
- " moveDownByd();\n",
- " },\n",
- " '+': function() {\n",
- " rotateUpLeftBydeg();\n",
- " }\n",
- " };\n",
- " var p = [0, 0];\n",
- " var r = 20;\n",
- " var d = -20;\n",
- " var deg = 60;\n",
- " var up = [0, 1];\n",
- " var lsystemIteration = 3;\n",
- " function lsystem(parent) {\n",
- " for (var i = 0; i < lsystemIteration; i++) {\n",
- " var child = '';\n",
- " for (var j = 0; j < parent.length; j++) {\n",
- " child += lsystemRule[parent[j]];\n",
- " }\n",
- " parent = child;\n",
- " }\n",
- " t04.textContent += parent;\n",
- " return parent;\n",
- " }\n",
- " function moveUpByd() {\n",
- " p[0] = p[0] + d * up[0];\n",
- " p[1] = p[1] + d * up[1];\n",
- " /*\n",
- " t04.textContent += '\\n';\n",
- " t04.textContent += p[0];\n",
- " t04.textContent += '\\n';\n",
- " t04.textContent += p[1];\n",
- " t04.textContent += '\\n';\n",
- " */\n",
- " }\n",
- " function moveDownByd() {\n",
- " p[0] = p[0] + d * -up[0];\n",
- " p[1] = p[1] + d * -up[1];\n",
- " /*\n",
- " t04.textContent += '\\n';\n",
- " t04.textContent += p[0];\n",
- " t04.textContent += '\\n';\n",
- " t04.textContent += p[1];\n",
- " t04.textContent += '\\n';\n",
- " */\n",
- " }\n",
- " function rotateUpLeftBydeg() {\n",
- " var rad = deg*Math.PI/180;\n",
- " var cos = Math.cos(rad);\n",
- " var sin = Math.sin(rad);\n",
- " var u = [];\n",
- " u[0] = up[0];\n",
- " u[1] = up[1];\n",
- " up[0] = cos*u[0] - sin*u[1];\n",
- " up[1] = sin*u[0] + cos*u[1];\n",
- " /*\n",
- " t04.textContent += '\\n';\n",
- " t04.textContent += u[0];\n",
- " t04.textContent += '\\n';\n",
- " t04.textContent += u[1];\n",
- " t04.textContent += '\\n';\n",
- " t04.textContent += up[0];\n",
- " t04.textContent += '\\n';\n",
- " t04.textContent += up[1];\n",
- " t04.textContent += '\\n';\n",
- " */\n",
- " }\n",
- " function drawCircle() {\n",
- " g04.save();\n",
- " g04.beginPath();\n",
- " g04.arc(p[0], p[1], r, 0, 2*Math.PI);\n",
- " g04.strokeStyle = \"rgb(255, 255, 255)\";\n",
- " g04.stroke();\n",
- " g04.restore();\n",
- " }\n",
- " function draw(lsystemResult) {\n",
- " for (var i = 0; i < lsystemResult.length; i++) {\n",
- " drawRule[lsystemResult[i]]();\n",
- " }\n",
- " }\n",
- " function setup(width, height) {\n",
- " t04 = document.getElementById(\"t04\");\n",
- " g04 = document.querySelector('#c04').getContext('2d');\n",
- " g04.canvas.width = width;\n",
- " g04.canvas.height = height;\n",
- " g04.fillStyle = \"rgb(56, 56, 56)\";\n",
- " g04.fillRect(0, 0, width, height);\n",
- " p[0] = width/2;\n",
- " p[1] = height/2;\n",
- " }\n",
- " setup(400, 400);\n",
- " draw(lsystem('A'));\n",
- "</script>"
- ],
- "text/plain": [
- "<IPython.core.display.HTML object>"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- }
- ],
- "source": [
- "%%html\n",
- "<div id=\"t04\"></div>\n",
- "<canvas id=\"c04\">\n",
- "<script>\n",
- " var t04;\n",
- " var g04;\n",
- " var lsystemRule = {\n",
- " 'A': 'ABAC+BAC+BAC+BAC+BAC+BAC+',\n",
- " 'B': 'BB',\n",
- " 'C': 'CC',\n",
- " '+': '+'\n",
- " };\n",
- " var drawRule = {\n",
- " 'A': function() {\n",
- " drawCircle();\n",
- " },\n",
- " 'B': function() {\n",
- " moveUpByd();\n",
- " },\n",
- " 'C': function() {\n",
- " moveDownByd();\n",
- " },\n",
- " '+': function() {\n",
- " rotateUpLeftBydeg();\n",
- " }\n",
- " };\n",
- " var p = [0, 0];\n",
- " var r = 20;\n",
- " var d = -20;\n",
- " var deg = 60;\n",
- " var up = [0, 1];\n",
- " var lsystemIteration = 3;\n",
- " function lsystem(parent) {\n",
- " for (var i = 0; i < lsystemIteration; i++) {\n",
- " var child = '';\n",
- " for (var j = 0; j < parent.length; j++) {\n",
- " child += lsystemRule[parent[j]];\n",
- " }\n",
- " parent = child;\n",
- " }\n",
- " t04.textContent += parent;\n",
- " return parent;\n",
- " }\n",
- " function moveUpByd() {\n",
- " p[0] = p[0] + d * up[0];\n",
- " p[1] = p[1] + d * up[1];\n",
- " /*\n",
- " t04.textContent += '\\n';\n",
- " t04.textContent += p[0];\n",
- " t04.textContent += '\\n';\n",
- " t04.textContent += p[1];\n",
- " t04.textContent += '\\n';\n",
- " */\n",
- " }\n",
- " function moveDownByd() {\n",
- " p[0] = p[0] + d * -up[0];\n",
- " p[1] = p[1] + d * -up[1];\n",
- " /*\n",
- " t04.textContent += '\\n';\n",
- " t04.textContent += p[0];\n",
- " t04.textContent += '\\n';\n",
- " t04.textContent += p[1];\n",
- " t04.textContent += '\\n';\n",
- " */\n",
- " }\n",
- " function rotateUpLeftBydeg() {\n",
- " var rad = deg*Math.PI/180;\n",
- " var cos = Math.cos(rad);\n",
- " var sin = Math.sin(rad);\n",
- " var u = [];\n",
- " u[0] = up[0];\n",
- " u[1] = up[1];\n",
- " up[0] = cos*u[0] - sin*u[1];\n",
- " up[1] = sin*u[0] + cos*u[1];\n",
- " /*\n",
- " t04.textContent += '\\n';\n",
- " t04.textContent += u[0];\n",
- " t04.textContent += '\\n';\n",
- " t04.textContent += u[1];\n",
- " t04.textContent += '\\n';\n",
- " t04.textContent += up[0];\n",
- " t04.textContent += '\\n';\n",
- " t04.textContent += up[1];\n",
- " t04.textContent += '\\n';\n",
- " */\n",
- " }\n",
- " function drawCircle() {\n",
- " g04.save();\n",
- " g04.beginPath();\n",
- " g04.arc(p[0], p[1], r, 0, 2*Math.PI);\n",
- " g04.strokeStyle = \"rgb(255, 255, 255)\";\n",
- " g04.stroke();\n",
- " g04.restore();\n",
- " }\n",
- " function draw(lsystemResult) {\n",
- " for (var i = 0; i < lsystemResult.length; i++) {\n",
- " drawRule[lsystemResult[i]]();\n",
- " }\n",
- " }\n",
- " function setup(width, height) {\n",
- " t04 = document.getElementById(\"t04\");\n",
- " g04 = document.querySelector('#c04').getContext('2d');\n",
- " g04.canvas.width = width;\n",
- " g04.canvas.height = height;\n",
- " g04.fillStyle = \"rgb(56, 56, 56)\";\n",
- " g04.fillRect(0, 0, width, height);\n",
- " p[0] = width/2;\n",
- " p[1] = height/2;\n",
- " }\n",
- " setup(400, 400);\n",
- " draw(lsystem('A'));\n",
- "</script>"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "collapsed": true
- },
- "source": [
- "내가 원하는 결과가 아니다. ㅠㅠ \n",
- "\n",
- "아니다. 문제가 있는 듯 했지만 `BB`를 `BBBB`등으로 바꿔봤더니, 가운데 원 하나가 그려지지 않고 있다는 것을 알게 되었다. \n",
- "\n",
- "이를 해결하기 위해서는 `A` 에 대한 lsystem rule 을 `ABAC+BAC+BAC+BAC+BAC+BAC+`으로 바꿔야 한다는 것을 알게 되었다.\n",
- "\n",
- "더불어 tmpparent 넣었던 것을 다시 제거하고 원래대로 `parent = child;`의 형태로 수정."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "collapsed": true
- },
- "source": [
- "# 이제 애니메이션으로!\n",
- "\n",
- "아래 코드를 작성하다보니, `<script>`태그 안에 있는 내용은 이 노트북의 위 셀들에 있는 `<script>`태그와 겹친다는 생각을 하게 되었다. 순서상 더 아래 나온 녀석이 위에 있는 녀석을 대치(Replace)할 것으로 추정은 되지만, 신경쓰인다. 유니티 C#스크립트처럼 하나의 클래스안에 머물도록 하려면, 하나의 함수안에 모두 넣어야 할 것 같다. 내가 하나의 함수 안에 넣는 것을 하지 못하는 이유는, 자주 안 해 봤기에 어떻게 하는 지 잘 모른다는 생각을 갖고 있기 때문이다. 음... 그냥 무턱대고 해볼까.\n",
- "\n",
- "`drawCircleAni`라는 함수로 만들어 기존 코드를 감싸보았다. 쩝. -> 느려진다! 왜 그럴까?"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 20,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "data": {
- "text/html": [
- "<div id=\"t05\"></div>\n",
- "<canvas id=\"c05\"></canvas>\n",
- "<script>\n",
- "function drawCircleAni() {\n",
- " var t05;\n",
- " var g05;\n",
- " var frameCnt = 0;\n",
- " var time = 0;\n",
- " var p = [];\n",
- " var r = 20;\n",
- " var sr = 0;\n",
- " var er = 2*Math.PI;\n",
- " var d = -20;\n",
- " var deg = 60;\n",
- " var up = [0, 1];\n",
- " var lsystemResult = '';\n",
- " var cnt = 0;\n",
- " var rule;\n",
- " var lsystemRule = {\n",
- " 'A': 'ABAC+BAC+BAC+BAC+BAC+BAC+',\n",
- " 'B': 'BBBB',\n",
- " 'C': 'CCCC',\n",
- " '+': '+'\n",
- " };\n",
- " var drawingRule = {\n",
- " 'A': function() {\n",
- " drawCircle();\n",
- " },\n",
- " 'B': function() {\n",
- " moveUpByd();\n",
- " },\n",
- " 'C': function() {\n",
- " moveDownByd();\n",
- " },\n",
- " '+': function() {\n",
- " rotateUpLeftByDeg();\n",
- " }\n",
- " };\n",
- " function lsystem(parent, N) {\n",
- " var child = '';\n",
- " for(var i = 0; i < N; i++) {\n",
- " child = '';\n",
- " for(var j = 0; j < parent.length; j++) {\n",
- " child += lsystemRule[parent[j]];\n",
- " }\n",
- " parent = child;\n",
- " }\n",
- " return parent;\n",
- " }\n",
- " function moveUpByd() {\n",
- " p[0] = p[0] + d * up[0];\n",
- " p[1] = p[1] + d * up[1];\n",
- " }\n",
- " function moveDownByd() {\n",
- " p[0] = p[0] + d * -up[0];\n",
- " p[1] = p[1] + d * -up[1];\n",
- " }\n",
- " function rotateUpLeftByDeg() {\n",
- " var rad = deg * Math.PI/180;\n",
- " var cos = Math.cos(rad);\n",
- " var sin = Math.sin(rad);\n",
- " var u = [];\n",
- " u[0] = up[0];\n",
- " u[1] = up[1];\n",
- " up[0] = cos * u[0] - sin * u[1];\n",
- " up[1] = sin * u[0] + cos * u[1];\n",
- " }\n",
- " function drawCircle() {\n",
- " g05.save();\n",
- " g05.beginPath();\n",
- " g05.arc(p[0], p[1], r, sr, er/*2*Math.PI*/);\n",
- " g05.strokeStyle = 'rgb(255, 255, 255)';\n",
- " g05.stroke();\n",
- " g05.restore();\n",
- " }\n",
- " function drawlsystemResult() {\n",
- " for(var i = 0; i < lsystemResult.length; i++) {\n",
- " drawingRule[lsystemResult[i]]();\n",
- " }\n",
- " }\n",
- " function setup(width, height) {\n",
- " t05 = document.getElementById('t05');\n",
- " g05 = document.getElementById('c05').getContext('2d');\n",
- " g05.canvas.width = width;\n",
- " g05.canvas.height = height;\n",
- " g05.fillStyle = 'rgb(56, 56, 56)';\n",
- " g05.fillRect(0, 0, width, height);\n",
- " p[0] = width/2;\n",
- " p[1] = height/2;\n",
- " }\n",
- " function update() {\n",
- " frameCnt++;\n",
- " time = frameCnt/480;\n",
- " r = 20*(Math.sin(time) + 1)/2;\n",
- " er += 0.01;\n",
- " //rule = lsystemResult[cnt];\n",
- " //cnt = (cnt > lsystemResult.length) ? 0 : cnt+1;\n",
- " d = -20*(Math.cos(time) + 1)/2;\n",
- " //deg = 60*(Math.cos(time) + 1)/2;\n",
- " }\n",
- " function draw() {\n",
- " g05.fillRect(0, 0, g05.canvas.width, g05.canvas.height);\n",
- " //drawCircle();\n",
- " //drawingRule[rule]();\n",
- " //draw(lsystemResult);\n",
- " drawlsystemResult();\n",
- " }\n",
- " function loop() {\n",
- " update();\n",
- " draw();\n",
- " requestAnimationFrame(loop);\n",
- " }\n",
- " setup(400, 400);\n",
- " //t05.textContent = lsystem('A', 2);\n",
- " lsystemResult = lsystem('A', 2);\n",
- " //drawingRule['A']();\n",
- " loop();\n",
- "}\n",
- "drawCircleAni();\n",
- "</script>"
- ],
- "text/plain": [
- "<IPython.core.display.HTML object>"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- }
- ],
- "source": [
- "%%html\n",
- "<div id=\"t05\"></div>\n",
- "<canvas id=\"c05\"></canvas>\n",
- "<script>\n",
- "function drawCircleAni() {\n",
- " var t05;\n",
- " var g05;\n",
- " var frameCnt = 0;\n",
- " var time = 0;\n",
- " var p = [];\n",
- " var r = 20;\n",
- " var sr = 0;\n",
- " var er = 2*Math.PI;\n",
- " var d = -20;\n",
- " var deg = 60;\n",
- " var up = [0, 1];\n",
- " var lsystemResult = '';\n",
- " var cnt = 0;\n",
- " var rule;\n",
- " var lsystemRule = {\n",
- " 'A': 'ABAC+BAC+BAC+BAC+BAC+BAC+',\n",
- " 'B': 'BBBB',\n",
- " 'C': 'CCCC',\n",
- " '+': '+'\n",
- " };\n",
- " var drawingRule = {\n",
- " 'A': function() {\n",
- " drawCircle();\n",
- " },\n",
- " 'B': function() {\n",
- " moveUpByd();\n",
- " },\n",
- " 'C': function() {\n",
- " moveDownByd();\n",
- " },\n",
- " '+': function() {\n",
- " rotateUpLeftByDeg();\n",
- " }\n",
- " };\n",
- " function lsystem(parent, N) {\n",
- " var child = '';\n",
- " for(var i = 0; i < N; i++) {\n",
- " child = '';\n",
- " for(var j = 0; j < parent.length; j++) {\n",
- " child += lsystemRule[parent[j]];\n",
- " }\n",
- " parent = child;\n",
- " }\n",
- " return parent;\n",
- " }\n",
- " function moveUpByd() {\n",
- " p[0] = p[0] + d * up[0];\n",
- " p[1] = p[1] + d * up[1];\n",
- " }\n",
- " function moveDownByd() {\n",
- " p[0] = p[0] + d * -up[0];\n",
- " p[1] = p[1] + d * -up[1];\n",
- " }\n",
- " function rotateUpLeftByDeg() {\n",
- " var rad = deg * Math.PI/180;\n",
- " var cos = Math.cos(rad);\n",
- " var sin = Math.sin(rad);\n",
- " var u = [];\n",
- " u[0] = up[0];\n",
- " u[1] = up[1];\n",
- " up[0] = cos * u[0] - sin * u[1];\n",
- " up[1] = sin * u[0] + cos * u[1];\n",
- " }\n",
- " function drawCircle() {\n",
- " g05.save();\n",
- " g05.beginPath();\n",
- " g05.arc(p[0], p[1], r, sr, er/*2*Math.PI*/);\n",
- " g05.strokeStyle = 'rgb(255, 255, 255)';\n",
- " g05.stroke();\n",
- " g05.restore();\n",
- " }\n",
- " function drawlsystemResult() {\n",
- " for(var i = 0; i < lsystemResult.length; i++) {\n",
- " drawingRule[lsystemResult[i]]();\n",
- " }\n",
- " }\n",
- " function setup(width, height) {\n",
- " t05 = document.getElementById('t05');\n",
- " g05 = document.getElementById('c05').getContext('2d');\n",
- " g05.canvas.width = width;\n",
- " g05.canvas.height = height;\n",
- " g05.fillStyle = 'rgb(56, 56, 56)';\n",
- " g05.fillRect(0, 0, width, height);\n",
- " p[0] = width/2;\n",
- " p[1] = height/2;\n",
- " }\n",
- " function update() {\n",
- " frameCnt++;\n",
- " time = frameCnt/480;\n",
- " r = 20*(Math.sin(time) + 1)/2;\n",
- " er += 0.01;\n",
- " //rule = lsystemResult[cnt];\n",
- " //cnt = (cnt > lsystemResult.length) ? 0 : cnt+1;\n",
- " d = -20*(Math.cos(time) + 1)/2;\n",
- " //deg = 60*(Math.cos(time) + 1)/2;\n",
- " }\n",
- " function draw() {\n",
- " g05.fillRect(0, 0, g05.canvas.width, g05.canvas.height);\n",
- " //drawCircle();\n",
- " //drawingRule[rule]();\n",
- " //draw(lsystemResult);\n",
- " drawlsystemResult();\n",
- " }\n",
- " function loop() {\n",
- " update();\n",
- " draw();\n",
- " requestAnimationFrame(loop);\n",
- " }\n",
- " setup(400, 400);\n",
- " //t05.textContent = lsystem('A', 2);\n",
- " lsystemResult = lsystem('A', 2);\n",
- " //drawingRule['A']();\n",
- " loop();\n",
- "}\n",
- "drawCircleAni();\n",
- "</script>"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "drawRule['A']()를 그릴 때, 점진적으로 원이 그려지려면, start angle 은 0 으로 두고, end angle 을 0.005 정도씩 증가시켜야 한다. 이 증가시키는 작업은 매 프레임마다 해야 하는데, 이는 reqeuestAnimationFrame()을 통해 구현 가능하다.\n",
- "\n",
- "문제는 원 하나가 다 그려지면 그 원은 더 이상 start angle 이나 end angle 값을 바꾸지 않고 그대로 두고, 다음 원을 start angle 은 0 으로 두고, end angle 을 0.005 씩 증가시키고 싶은 것인데.\n",
- "\n",
- "이런 작업은 반복되는 것이므로 drawCircle 안에서 처리하면 좋은데, 그러러면... \n",
- "어떤 조건이 만족되면 다음 rule 로 바뀌도록 하면 될 듯. "
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 8,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "data": {
- "text/html": [
- "<div id=\"t06\"></div>\n",
- "<canvas id=\"c06\"></canvas>\n",
- "<script>\n",
- " var t06;\n",
- " var g06;\n",
- " var frameCnt = 0;\n",
- " var time = 0;\n",
- " var p = [];\n",
- " var r = 10;\n",
- " var sr = 0;\n",
- " var er = 0;\n",
- " var d = -10;\n",
- " var deg = 60;\n",
- " var up = [0, 1];\n",
- " var lsystemResult = '';\n",
- " var cnt = 0;\n",
- " var rule;\n",
- " var ret = false;\n",
- " var lsystemRule = {\n",
- " 'A': 'ABAC+BAC+BAC+BAC+BAC+BAC+',\n",
- " 'B': 'BBB',\n",
- " 'C': 'CCC',\n",
- " '+': '+'\n",
- " };\n",
- " var drawingRule = {\n",
- " 'A': function() {\n",
- " return drawCircle();\n",
- " },\n",
- " 'B': function() {\n",
- " moveUpByd();\n",
- " return true;\n",
- " },\n",
- " 'C': function() {\n",
- " moveDownByd();\n",
- " return true\n",
- " },\n",
- " '+': function() {\n",
- " rotateUpLeftByDeg();\n",
- " return true;\n",
- " }\n",
- " };\n",
- " function lsystem(parent, N) {\n",
- " var child = '';\n",
- " for(var i = 0; i < N; i++) {\n",
- " child = '';\n",
- " for(var j = 0; j < parent.length; j++) {\n",
- " child += lsystemRule[parent[j]];\n",
- " }\n",
- " parent = child;\n",
- " }\n",
- " return parent;\n",
- " }\n",
- " function moveUpByd() {\n",
- " p[0] = p[0] + d * up[0];\n",
- " p[1] = p[1] + d * up[1];\n",
- " }\n",
- " function moveDownByd() {\n",
- " p[0] = p[0] + d * -up[0];\n",
- " p[1] = p[1] + d * -up[1];\n",
- " }\n",
- " function rotateUpLeftByDeg() {\n",
- " var rad = deg * Math.PI/180;\n",
- " var cos = Math.cos(rad);\n",
- " var sin = Math.sin(rad);\n",
- " var u = [];\n",
- " u[0] = up[0];\n",
- " u[1] = up[1];\n",
- " up[0] = cos * u[0] - sin * u[1];\n",
- " up[1] = sin * u[0] + cos * u[1];\n",
- " }\n",
- " function drawCircle() {\n",
- " //g06.save();\n",
- " g06.beginPath();\n",
- " er += 0.1;// * (Math.sin(time) + 1)/2;\n",
- " g06.arc(p[0], p[1], r, sr, er);\n",
- " sr += 0.1;// * (Math.sin(time) + 1)/2;\n",
- " g06.lineWidth = 0.5 * (Math.sin(20*time) + 1)/2;\n",
- " g06.strokeStyle = 'rgb(255, 255, 255)';\n",
- " g06.stroke();\n",
- " //g06.restore();\n",
- " if(er > 2 * Math.PI) {\n",
- " sr = 0;\n",
- " er = 0;\n",
- " return true;\n",
- " }\n",
- " else\n",
- " return false;\n",
- " }\n",
- " function drawlsystemResult() {\n",
- " for(var i = 0; i < lsystemResult.length; i++) {\n",
- " drawingRule[lsystemResult[i]]();\n",
- " }\n",
- " }\n",
- " function setup(width, height) {\n",
- " t06 = document.getElementById('t06');\n",
- " g06 = document.getElementById('c06').getContext('2d');\n",
- " g06.canvas.width = width;\n",
- " g06.canvas.height = height;\n",
- " g06.fillStyle = 'rgb(56, 56, 56)';\n",
- " g06.fillRect(0, 0, width, height);\n",
- " p[0] = width/2;\n",
- " p[1] = height/2;\n",
- " }\n",
- " function update() {\n",
- " frameCnt++;\n",
- " time = frameCnt/60;\n",
- " //r = 15*(Math.sin(time) + 1)/2;\n",
- " //d = -10*(Math.cos(time) + 1)/2;\n",
- " }\n",
- " function draw() {\n",
- " //g06.fillRect(0, 0, g06.canvas.width, g06.canvas.height);\n",
- " if(drawingRule[rule]() === true) {\n",
- " cnt += 1;\n",
- " rule = lsystemResult[cnt];\n",
- " }\n",
- " if(cnt >= lsystemResult.length) {\n",
- " cnt = 0;\n",
- " rule = lsystemResult[cnt];\n",
- " g06.fillRect(0, 0, g06.canvas.width, g06.canvas.height);\n",
- " }\n",
- " }\n",
- " function loop() {\n",
- " update();\n",
- " draw();\n",
- " requestAnimationFrame(loop);\n",
- " }\n",
- " setup(400, 400);\n",
- " //t06.textContent = lsystem('A', 2);\n",
- " lsystemResult = lsystem('A', 3);\n",
- " rule = lsystemResult[cnt];\n",
- " loop();\n",
- "</script>"
- ],
- "text/plain": [
- "<IPython.core.display.HTML object>"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- }
- ],
- "source": [
- "%%html\n",
- "<div id=\"t06\"></div>\n",
- "<canvas id=\"c06\"></canvas>\n",
- "<script>\n",
- " var t06;\n",
- " var g06;\n",
- " var frameCnt = 0;\n",
- " var time = 0;\n",
- " var p = [];\n",
- " var r = 10;\n",
- " var sr = 0;\n",
- " var er = 0;\n",
- " var d = -10;\n",
- " var deg = 60;\n",
- " var up = [0, 1];\n",
- " var lsystemResult = '';\n",
- " var cnt = 0;\n",
- " var rule;\n",
- " var ret = false;\n",
- " var lsystemRule = {\n",
- " 'A': 'ABAC+BAC+BAC+BAC+BAC+BAC+',\n",
- " 'B': 'BBB',\n",
- " 'C': 'CCC',\n",
- " '+': '+'\n",
- " };\n",
- " var drawingRule = {\n",
- " 'A': function() {\n",
- " return drawCircle();\n",
- " },\n",
- " 'B': function() {\n",
- " moveUpByd();\n",
- " return true;\n",
- " },\n",
- " 'C': function() {\n",
- " moveDownByd();\n",
- " return true\n",
- " },\n",
- " '+': function() {\n",
- " rotateUpLeftByDeg();\n",
- " return true;\n",
- " }\n",
- " };\n",
- " function lsystem(parent, N) {\n",
- " var child = '';\n",
- " for(var i = 0; i < N; i++) {\n",
- " child = '';\n",
- " for(var j = 0; j < parent.length; j++) {\n",
- " child += lsystemRule[parent[j]];\n",
- " }\n",
- " parent = child;\n",
- " }\n",
- " return parent;\n",
- " }\n",
- " function moveUpByd() {\n",
- " p[0] = p[0] + d * up[0];\n",
- " p[1] = p[1] + d * up[1];\n",
- " }\n",
- " function moveDownByd() {\n",
- " p[0] = p[0] + d * -up[0];\n",
- " p[1] = p[1] + d * -up[1];\n",
- " }\n",
- " function rotateUpLeftByDeg() {\n",
- " var rad = deg * Math.PI/180;\n",
- " var cos = Math.cos(rad);\n",
- " var sin = Math.sin(rad);\n",
- " var u = [];\n",
- " u[0] = up[0];\n",
- " u[1] = up[1];\n",
- " up[0] = cos * u[0] - sin * u[1];\n",
- " up[1] = sin * u[0] + cos * u[1];\n",
- " }\n",
- " function drawCircle() {\n",
- " //g06.save();\n",
- " g06.beginPath();\n",
- " er += 0.1;// * (Math.sin(time) + 1)/2;\n",
- " g06.arc(p[0], p[1], r, sr, er);\n",
- " sr += 0.1;// * (Math.sin(time) + 1)/2;\n",
- " g06.lineWidth = 0.5 * (Math.sin(20*time) + 1)/2;\n",
- " g06.strokeStyle = 'rgb(255, 255, 255)';\n",
- " g06.stroke();\n",
- " //g06.restore();\n",
- " if(er > 2 * Math.PI) {\n",
- " sr = 0;\n",
- " er = 0;\n",
- " return true;\n",
- " }\n",
- " else\n",
- " return false;\n",
- " }\n",
- " function drawlsystemResult() {\n",
- " for(var i = 0; i < lsystemResult.length; i++) {\n",
- " drawingRule[lsystemResult[i]]();\n",
- " }\n",
- " }\n",
- " function setup(width, height) {\n",
- " t06 = document.getElementById('t06');\n",
- " g06 = document.getElementById('c06').getContext('2d');\n",
- " g06.canvas.width = width;\n",
- " g06.canvas.height = height;\n",
- " g06.fillStyle = 'rgb(56, 56, 56)';\n",
- " g06.fillRect(0, 0, width, height);\n",
- " p[0] = width/2;\n",
- " p[1] = height/2;\n",
- " }\n",
- " function update() {\n",
- " frameCnt++;\n",
- " time = frameCnt/60;\n",
- " //r = 15*(Math.sin(time) + 1)/2;\n",
- " //d = -10*(Math.cos(time) + 1)/2;\n",
- " }\n",
- " function draw() {\n",
- " //g06.fillRect(0, 0, g06.canvas.width, g06.canvas.height);\n",
- " if(drawingRule[rule]() === true) {\n",
- " cnt += 1;\n",
- " rule = lsystemResult[cnt];\n",
- " }\n",
- " if(cnt >= lsystemResult.length) {\n",
- " cnt = 0;\n",
- " rule = lsystemResult[cnt];\n",
- " g06.fillRect(0, 0, g06.canvas.width, g06.canvas.height);\n",
- " }\n",
- " }\n",
- " function loop() {\n",
- " update();\n",
- " draw();\n",
- " requestAnimationFrame(loop);\n",
- " }\n",
- " setup(400, 400);\n",
- " //t06.textContent = lsystem('A', 2);\n",
- " lsystemResult = lsystem('A', 3);\n",
- " rule = lsystemResult[cnt];\n",
- " loop();\n",
- "</script>"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": []
- }
- ],
- "metadata": {
- "kernelspec": {
- "display_name": "Python 3",
- "language": "python",
- "name": "python3"
- },
- "language_info": {
- "codemirror_mode": {
- "name": "ipython",
- "version": 3
- },
- "file_extension": ".py",
- "mimetype": "text/x-python",
- "name": "python",
- "nbconvert_exporter": "python",
- "pygments_lexer": "ipython3",
- "version": "3.4.3"
- }
- },
- "nbformat": 4,
- "nbformat_minor": 0
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement