kaki-lsystem 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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: []