kaki-lsystem 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: afb0207087587ab5cd30b17637b5847a523d43ee
4
+ data.tar.gz: ba351b43f64f4c897fee821269aa18c315d2c15b
5
+ SHA512:
6
+ metadata.gz: 962abb9543c1af45ab0fc626def70f9e40736a229a6dcd2838ca6790189478979fd19f2a02c8865152ed29c5112e06eb607bcbd87611efb7d8f17cc6a6c1f713
7
+ data.tar.gz: 85e577232cf77b92e420f23132ee986294576a4c65375d46ab694c7c9574f6fb1fd515a2a73b4d54b24414a5ecd980135b0c83177a607ff2bb8d62e9bc9fb943
data/README.md ADDED
@@ -0,0 +1,62 @@
1
+ ## 概要
2
+
3
+ 再帰曲線を描く「L-system」を実装しています。内部で Gem 'oekaki' のタートルグラフィックス機能を使っています。よって、Gem 'oekaki' をインストールすることが必要です。
4
+
5
+ ## method
6
+
7
+ - Lsystem.new(width, height, title = "L-system")
8
+ - インスタンスを生成します。width, height はウィンドウのサイズです。
9
+ - move(x, y)
10
+ - ペンの初期位置を移動させます。y方向は上が + です。
11
+ - prologue {..}
12
+ - ブロック内が描画前に実行されます。
13
+ - set(command) {...}
14
+ - 与えられた commnd(長さ1の文字列)について、ブロック内を実行するように設定します。
15
+ - init(st)
16
+ - st は開始時の手続きです。
17
+ - rule(command) {...}
18
+ - command を再帰的に展開するルールです。
19
+ - draw(n)
20
+ - 再帰的に深さnだけ実行します。n = 0 ならば init(st) で指定された手続きのみ実行します。
21
+
22
+ ブロック内は Oekaki::Turtle クラスのメソッドを使います。left(), right(), forward(), color(), circle(), move() など。下のURL参照。
23
+ [http://obelisk.hatenablog.com/entry/2018/02/06/025222](http://obelisk.hatenablog.com/entry/2018/02/06/025222)
24
+
25
+
26
+ ## プロパティ
27
+ - dir
28
+ - 開始時の方向を指定します。初期値は Vector[1, 0] です。Vector の長さは1にして下さい。
29
+
30
+ ## 例
31
+ ```ruby
32
+ require 'kaki/lsystem'
33
+
34
+ n = 7
35
+ length = n.zero? ? 500 : 500.0 / 2 ** (n - 1)
36
+
37
+ l = Lsystem.new(520, 500, "Sierpinski gasket")
38
+ l.move(-250, -240)
39
+ l.prologue {color(0x55c5, 0xe363, 0xf1d5)}
40
+ l.set("-") {left(120)}
41
+ l.init("F")
42
+ l.set("F") {forward(length)}
43
+ l.set("G") {forward(length, false)}
44
+ l.rule("F", "F-F-F-GG")
45
+ l.rule("G", "GG")
46
+ l.draw(n)
47
+ ```
48
+
49
+ ```ruby
50
+ require 'kaki/lsystem'
51
+
52
+ l = Lsystem.new(400, 640)
53
+ l.move(50, -310)
54
+ l.prologue {color(0x28a5, 0xa3c8, 0xca7)}
55
+ l.dir = Vector[0, 1]
56
+ l.set("-") {left(15)}
57
+ l.set("+") {right(15)}
58
+ l.init("F")
59
+ l.set("F") {forward(10)}
60
+ l.rule("F", "F[+F-F-F]F[--F+F+F]")
61
+ l.draw(4)
62
+ ```
@@ -0,0 +1,21 @@
1
+ require 'kaki/lsystem'
2
+
3
+ n = 5
4
+
5
+ l = Lsystem.new(600, 600, "Penrose Tiling")
6
+ l.move(0, 0)
7
+ l.prologue {color(0xffff, 0x5feb, 0xe51f)}
8
+ l.set("-") {left(36)}
9
+ l.set("+") {right(36)}
10
+ l.init("[N]++[N]++[N]++[N]++[N]")
11
+ l.set("M") {forward(10)}
12
+ l.set("N") {forward(10)}
13
+ l.set("O") {forward(10)}
14
+ l.set("P") {forward(10)}
15
+ l.set("A") {forward(10)}
16
+ l.rule("M", "OA++PA----NA[-OA----MA]++")
17
+ l.rule("N", "+OA--PA[---MA--NA]+")
18
+ l.rule("O", "-MA++NA[+++OA++PA]-")
19
+ l.rule("P", "--OA++++MA[+PA++++NA]--NA")
20
+ l.rule("A", "")
21
+ l.draw(n)
@@ -0,0 +1,15 @@
1
+ require 'kaki/lsystem'
2
+
3
+ n = 10
4
+
5
+ l = Lsystem.new(500, 600, "Dragon curve")
6
+ l.move(-80, 150)
7
+ l.prologue {color(0x143f, 0x832d, 0xe783)}
8
+ l.set("-") {left(90)}
9
+ l.set("+") {right(90)}
10
+ l.init("A")
11
+ l.set("A") {forward(10)}
12
+ l.set("B") {forward(10)}
13
+ l.rule("A", "A+B+")
14
+ l.rule("B", "-A-B")
15
+ l.draw(n)
@@ -0,0 +1,13 @@
1
+ require 'kaki/lsystem'
2
+
3
+ n = 3
4
+
5
+ l = Lsystem.new(550, 200, "Koch curve")
6
+ l.move(-250, -70)
7
+ l.prologue {color(0xffff, 0, 0)}
8
+ l.set("-") {left(60)}
9
+ l.set("+") {right(60)}
10
+ l.init("F")
11
+ l.set("F") {forward(500.0 / 3 ** n)}
12
+ l.rule("F", "F-F++F-F")
13
+ l.draw(n)
@@ -0,0 +1,11 @@
1
+ require 'kaki/lsystem'
2
+
3
+ l = Lsystem.new(600, 600, "Koch island")
4
+ l.move(-150, -150)
5
+ l.prologue {color(0x28a5, 0xa3c8, 0xca7)}
6
+ l.set("-") {left(90)}
7
+ l.set("+") {right(90)}
8
+ l.init("F-F-F-F")
9
+ l.set("F") {forward(8)}
10
+ l.rule("F", "F+FF-FF-F-F+F+FF-F-F+F+FF+FF-F")
11
+ l.draw(2)
@@ -0,0 +1,12 @@
1
+ require 'kaki/lsystem'
2
+
3
+ l = Lsystem.new(400, 640)
4
+ l.move(50, -310)
5
+ l.prologue {color(0x28a5, 0xa3c8, 0xca7)}
6
+ l.dir = Vector[0, 1]
7
+ l.set("-") {left(15)}
8
+ l.set("+") {right(15)}
9
+ l.init("F")
10
+ l.set("F") {forward(10)}
11
+ l.rule("F", "F[+F-F-F]F[--F+F+F]")
12
+ l.draw(4)
@@ -0,0 +1,11 @@
1
+ require 'kaki/lsystem'
2
+
3
+ l = Lsystem.new(500, 500)
4
+ l.move(50, -230)
5
+ l.prologue {color(0xe713, 0x5742, 0xff23)}
6
+ l.set("-") {left(90)}
7
+ l.set("+") {right(90)}
8
+ l.init("F-F-F-F")
9
+ l.set("F") {forward(10)}
10
+ l.rule("F", "FF-F-F-F-F-F+F")
11
+ l.draw(3)
@@ -0,0 +1,21 @@
1
+ require 'kaki/lsystem'
2
+
3
+ n = 6
4
+ length = n.zero? ? 500 : 500.0 / 2 ** n
5
+
6
+ l = Lsystem.new(520, 500, "Sierpinski arrowhead")
7
+ l.move(-250, -240)
8
+ l.prologue do
9
+ clear(color(0xffff, 0xef5b, 0xf677))
10
+ color(0x12de, 0x5320, 0xb4a)
11
+ end
12
+ l.set("-") {left(60)}
13
+ l.set("+") {right(60)}
14
+ l.init("LF")
15
+ l.set("L") {}
16
+ l.set("R") {}
17
+ l.set("F") {forward(length)}
18
+ l.rule("L", "-RF+LF+RF-")
19
+ l.rule("R", "+LF-RF-LF+")
20
+ l.rule("F", "")
21
+ l.draw(n)
@@ -0,0 +1,15 @@
1
+ require 'kaki/lsystem'
2
+
3
+ n = 7
4
+ length = n.zero? ? 500 : 500.0 / 2 ** (n - 1)
5
+
6
+ l = Lsystem.new(520, 500, "Sierpinski gasket")
7
+ l.move(-250, -240)
8
+ l.prologue {color(0x55c5, 0xe363, 0xf1d5)}
9
+ l.set("-") {left(120)}
10
+ l.init("F")
11
+ l.set("F") {forward(length)}
12
+ l.set("G") {forward(length, false)}
13
+ l.rule("F", "F-F-F-GG")
14
+ l.rule("G", "GG")
15
+ l.draw(n)
@@ -0,0 +1,76 @@
1
+ require 'bundler/setup'
2
+ require 'oekaki'
3
+
4
+ class Lsystem
5
+ def initialize(width, height, title = "L-system")
6
+ @width = width
7
+ @height = height
8
+ @title = title
9
+ @procedure = ""
10
+ @command = {}
11
+ @rule = {}
12
+ @eval = proc {}
13
+ @po = [0, 0]
14
+ end
15
+ attr_accessor :dir
16
+
17
+ def move(x, y)
18
+ @po = [x, y]
19
+ end
20
+
21
+ def init(st)
22
+ @procedure = st
23
+ end
24
+
25
+ def set(st, &block)
26
+ @command[st] = block
27
+ end
28
+
29
+ def rule(a, r)
30
+ @rule[a] = r
31
+ end
32
+
33
+ def prologue(&block)
34
+ @eval = block
35
+ end
36
+
37
+ def generate(n)
38
+ n.times do
39
+ pr = ""
40
+ @procedure.each_char do |c|
41
+ pr += @rule[c] || c
42
+ end
43
+ @procedure = pr
44
+ end
45
+ end
46
+
47
+ def exec(t)
48
+ stack = []
49
+ @procedure.each_char do |c|
50
+ case c
51
+ when "["
52
+ stack << t.dup
53
+ when "]"
54
+ t = stack.pop
55
+ else
56
+ t.instance_exec(&@command[c]) rescue raise "'#{c}' not defined."
57
+ end
58
+ end
59
+ end
60
+
61
+ def draw(n)
62
+ ob = self
63
+ Oekaki.app width: @width, height: @height, title: @title do
64
+ t = Oekaki::Turtle.new
65
+ ob.generate(n)
66
+
67
+ draw do
68
+ clear
69
+ t.instance_exec(&ob.instance_variable_get(:@eval))
70
+ t.move(*ob.instance_variable_get(:@po))
71
+ t.dir = ob.dir if ob.dir
72
+ ob.exec(t)
73
+ end
74
+ end
75
+ end
76
+ end
metadata ADDED
@@ -0,0 +1,67 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: kaki-lsystem
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - obelisk
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2018-03-22 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: oekaki
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ description: L-system language which draws recursive forms.
28
+ email: obelisk_1968@mail.goo.ne.jp
29
+ executables: []
30
+ extensions: []
31
+ extra_rdoc_files: []
32
+ files:
33
+ - README.md
34
+ - example/lsystem_Penrose_tiling.rb
35
+ - example/lsystem_gragon_curve.rb
36
+ - example/lsystem_koch_curve.rb
37
+ - example/lsystem_koch_island.rb
38
+ - example/lsystem_sample1.rb
39
+ - example/lsystem_sample2.rb
40
+ - example/lsystem_sierpinski_arrowhead.rb
41
+ - example/lsystem_sierpinski_gasket.rb
42
+ - lib/kaki/lsystem.rb
43
+ homepage:
44
+ licenses:
45
+ - MIT
46
+ metadata: {}
47
+ post_install_message:
48
+ rdoc_options: []
49
+ require_paths:
50
+ - lib
51
+ required_ruby_version: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
56
+ required_rubygems_version: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: '0'
61
+ requirements: []
62
+ rubyforge_project:
63
+ rubygems_version: 2.5.2
64
+ signing_key:
65
+ specification_version: 4
66
+ summary: L-system.
67
+ test_files: []