kaki-lsystem 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/README.md +62 -0
- data/example/lsystem_Penrose_tiling.rb +21 -0
- data/example/lsystem_gragon_curve.rb +15 -0
- data/example/lsystem_koch_curve.rb +13 -0
- data/example/lsystem_koch_island.rb +11 -0
- data/example/lsystem_sample1.rb +12 -0
- data/example/lsystem_sample2.rb +11 -0
- data/example/lsystem_sierpinski_arrowhead.rb +21 -0
- data/example/lsystem_sierpinski_gasket.rb +15 -0
- data/lib/kaki/lsystem.rb +76 -0
- metadata +67 -0
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,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)
|
data/lib/kaki/lsystem.rb
ADDED
@@ -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: []
|