oekaki 0.1.3 → 0.1.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c09d48a14772b6e735751f3db73c491ce8ff51f9
4
- data.tar.gz: 9f11e33449cfd11ab213cfed03f65226a09603b8
3
+ metadata.gz: 2c1e71b934906a7cb076791108504709515d4253
4
+ data.tar.gz: 07b385f02f2f514bce69049a805a8427443927ba
5
5
  SHA512:
6
- metadata.gz: 690627971413908043ab82209d8e77c5b4fe99ba91e62a61832a01c5f1dd1f1e2e350a6ccf0f4bfc9c34d1f18a2f06bde8a6066aef79fb597c064400c62480c6
7
- data.tar.gz: 0bdd954e3e5e9459de850dea2187b85643bfe79bb128f7ea46a552709a7db1869ca5d8b26d94eba2744b8e1f96bcf83b77fb3b7a4a37ba4512579890946aa86f
6
+ metadata.gz: 3634834be985b965c7168bfa06d39d79b9b335e871d37921743f6c1ed86fbb35ff12643dbb1094eab69060e2a1b5d439e8785841cc31c464d1d09d9853319104
7
+ data.tar.gz: 16f5b93a27f97bbf2d8fb511199e648aeab3b5dbaed3f7e7cc8d6d94a53761fcf813128af4cac4b5e8efa56a095cafbb4b73bfb6a7dc54ac771170027597e91a
@@ -0,0 +1,52 @@
1
+ require 'oekaki'
2
+ include Math
3
+
4
+ W, H = 600, 300
5
+ V0, A, G = 10.0, 0.75, 5.0
6
+
7
+ v = lambda {|n| - A ** n * sqrt(2 * G * H)}
8
+
9
+ t = lambda do |n|
10
+ if n.zero?
11
+ sqrt(2 * H / G)
12
+ else
13
+ ar = [1]
14
+ n.times {|i| ar << 2 * A ** (i + 1)}
15
+ sqrt(2 * H / G) * ar.inject(:+)
16
+ end
17
+ end
18
+
19
+ y = lambda do |n, t1|
20
+ if n.zero?
21
+ H - G * t1 ** 2 / 2
22
+ else
23
+ t2 = t1 - t.call(n - 1)
24
+ - v.call(n) * t2 - G * t2 ** 2 / 2
25
+ end
26
+ end
27
+
28
+ x = lambda {|t1| V0 * t1}
29
+
30
+ num = lambda do |tm|
31
+ 1000.times {|i| return i if tm <= t.call(i)}
32
+ end
33
+
34
+ i = 0
35
+
36
+ Oekaki.app width: W, height: H do
37
+ draw do
38
+ clear
39
+ end
40
+
41
+ id = timer(20) do
42
+ tm = i / V0
43
+ x1 = x.call(tm)
44
+ y1 = H - y.call(num[tm], tm)
45
+ color(65535, 0, 0)
46
+ arc(false, x1, y1, 4, 4, 0, 64 * 360)
47
+ timer_stop(id) if i >= W
48
+ i += 1
49
+ end
50
+ end
51
+
52
+
@@ -0,0 +1,21 @@
1
+ require 'oekaki'
2
+
3
+ Width, Height = 500, 500
4
+
5
+ Oekaki.app width: Width, height: Height do
6
+ draw do
7
+ clear
8
+
9
+ color(0, 65535, 0)
10
+ r = Width / 2
11
+ circle(false, 0, r, r)
12
+ circle(false, 2 * r, r, r)
13
+
14
+ (1..9).to_a.combination(2) do |p, q|
15
+ x = p / q.to_f
16
+ y = 1 / (2 * q ** 2).to_f
17
+ wx, wy = Width * x, Height * y
18
+ circle(false, wx, Height - wy, wy)
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,69 @@
1
+ require 'oekaki'
2
+
3
+ Width, Height = if ARGV.size == 2
4
+ ARGV.map(&:to_i)
5
+ else
6
+ [1000, 700]
7
+ end
8
+
9
+ Max_r, Min_r = 40, 10
10
+ ColorMax = 65535
11
+ MaxNum = 60
12
+
13
+
14
+ class Circle
15
+ def initialize(ob)
16
+ @slot = ob
17
+ @width, @height = Width, Height
18
+ renewal
19
+ @y = rand(@height)
20
+ end
21
+ attr_reader :height
22
+ attr_writer :y
23
+
24
+ def renewal
25
+ @width, @height = @slot.get_window_size
26
+ @max_r = rand(Max_r - Min_r) + Min_r
27
+ @x = rand(@width)
28
+ @y = -rand(@max_r)
29
+ @color = [rand(ColorMax), rand(ColorMax), rand(ColorMax)]
30
+ @fall_step = 1 + rand * 3
31
+ @r = 1
32
+ @r_step = rand * 0.2 + 0.8
33
+ end
34
+
35
+ def paint
36
+ @slot.color(@color[0], @color[1], @color[2])
37
+ @slot.circle(true, @x, @y, @r)
38
+ @y += @fall_step
39
+ @r += @r_step
40
+ @r_step *= -1 if @r > @max_r or @r < 1
41
+ renewal if @y > @height + Max_r
42
+ true
43
+ end
44
+ end
45
+
46
+
47
+ Oekaki.app width: Width, height: Height, resizable: true do
48
+ circles = []
49
+ MaxNum.times {circles << Circle.new(self)}
50
+ black = color(0, 0, 0)
51
+
52
+ draw do
53
+ clear(black)
54
+ end
55
+
56
+ timer(60) do
57
+ clear(black)
58
+ circles.each(&:paint)
59
+ end
60
+
61
+ window_changed do
62
+ clear(black)
63
+ circles.each do |c|
64
+ c.renewal
65
+ c.y = rand(c.height)
66
+ c.paint
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,51 @@
1
+ require 'oekaki'
2
+
3
+ Width, Height = 400, 300
4
+ CircumcircleR = 0.8
5
+
6
+ def incircle(a, b, c)
7
+ l, m, n = (b - a).norm, (c - b).norm, (a - c).norm
8
+ q = l + m + n
9
+
10
+ po = a * (m / q) + b * (n / q) + c * (l / q)
11
+ r = sqrt((q / 2 - l) * (q / 2 - m) * (q / 2 - n) * 2 / q)
12
+ [po, r]
13
+ end
14
+
15
+ class Vector
16
+ def to_w
17
+ l = Height / 2
18
+ Vector[Width / 2 + self[0] * l, l - self[1] * l]
19
+ end
20
+ end
21
+
22
+ get_po = proc {|θ| Vector[cos(θ), sin(θ)] * CircumcircleR}
23
+ rv = proc {PI * (rand + 1) * 0.005}
24
+
25
+ angle = [0.5 * 2 * PI, 1.17 * 2 * PI, 1.83 * 2 * PI]
26
+ step = [rv.call, rv.call, -rv.call]
27
+
28
+
29
+ Oekaki.app width: Width, height: Height do
30
+ draw {clear}
31
+
32
+ timer(30) do
33
+ clear
34
+
35
+ a, b, c = get_po[angle[0]], get_po[angle[1]], get_po[angle[2]]
36
+
37
+ color(0, 65535, 0)
38
+ line(a.to_w[0], a.to_w[1], b.to_w[0], b.to_w[1])
39
+ line(b.to_w[0], b.to_w[1], c.to_w[0], c.to_w[1])
40
+ line(c.to_w[0], c.to_w[1], a.to_w[0], a.to_w[1])
41
+
42
+ color(65535, 0, 65535)
43
+ circle(false, Width / 2, Height / 2, CircumcircleR * Height / 2)
44
+
45
+ color(65535, 65535, 0)
46
+ po, r = incircle(a, b, c)
47
+ circle(true, po.to_w[0], po.to_w[1], r * Height / 2)
48
+
49
+ angle = angle.map.with_index {|θ, i| θ + step[i]}
50
+ end
51
+ end
@@ -0,0 +1,27 @@
1
+ require 'oekaki'
2
+
3
+ L, R = 500, 25
4
+
5
+ Oekaki.app width: L, height: L do
6
+ draw do
7
+ clear
8
+ end
9
+
10
+ quit_window = proc do
11
+ make_window do |w|
12
+ w.title = ""
13
+ b = button do
14
+ set_size_request(120, 40)
15
+ add(Gtk::Label.new.set_markup('<span size="x-large">Quit!</span>'))
16
+ signal_connect("clicked") {Gtk.main_quit}
17
+ end
18
+ add(b)
19
+ end
20
+ end
21
+
22
+ mouse_button do |w, e|
23
+ quit_window.call if e.button != 1
24
+ color(rand(65536), rand(65536), rand(65536))
25
+ arc(true, e.x - R, e.y - R, R * 2, R * 2, 0, 64 * 360)
26
+ end
27
+ end
@@ -0,0 +1,33 @@
1
+ require 'oekaki'
2
+
3
+ L = 300; O = L / 2
4
+ R = 140
5
+ step = 20
6
+
7
+ i = 0
8
+
9
+ Oekaki.app width: L, height: L do
10
+ draw do
11
+ clear
12
+ color(0x87 * 256, 0xce * 256, 0xeb * 256) #skyblue
13
+ arc(false, O - R, O - R, R * 2, R * 2, 0, 64 * 360)
14
+ end
15
+
16
+ id = timer(500) do
17
+ ar = []
18
+ θ = i * step * PI / 180
19
+ x = R * cos(θ)
20
+ y = R * sin(θ)
21
+ ar << [O + x, O - y]
22
+ 3.times do
23
+ x, y = -y, x
24
+ ar << [O + x, O - y]
25
+ end
26
+ color(0x22 * 256, 0x8b * 256, 0x22 * 256) #forestgreen
27
+ polygon(false, ar)
28
+ i += 1
29
+ timer_stop(id) if i * step > 180
30
+ true
31
+ end
32
+ end
33
+
@@ -0,0 +1,25 @@
1
+ require 'oekaki'
2
+
3
+ L = 400
4
+ R1 = 150
5
+ R2 = (L - R1 * 2) / 2 - 5
6
+ STP1 = (PI / 180) * 0.5
7
+ STP2 = (PI / 180) * 10
8
+
9
+ Oekaki.app width: L, height: L do
10
+ draw do
11
+ clear(color(5000, 0, 10000))
12
+ end
13
+
14
+ i = 0
15
+
16
+ id = timer(20) do
17
+ x = L / 2 + (R1 * cos(STP1 * i) + R2 * cos(STP2 * i))
18
+ y = L / 2 - (R1 * sin(STP1 * i) + R2 * sin(STP2 * i))
19
+ color(0, 65535, 0)
20
+ arc(false, x, y, 3, 3, 0, 64 * 360)
21
+ i += 1
22
+ timer_stop(id) if STP1 * i > PI * 2
23
+ true
24
+ end
25
+ end
@@ -0,0 +1,58 @@
1
+ require 'oekaki'
2
+
3
+ L = 400
4
+ C_MAX = 65536
5
+ C_STEP = 1000
6
+
7
+ class Field
8
+ def initialize
9
+ @x = rand(L); @y = rand(L)
10
+ n = Vector[rand, rand]
11
+ @n = [n[0] * 2 / n.norm, n[1] * 2 / n.norm]
12
+ end
13
+ attr_reader :x, :y
14
+
15
+ def next
16
+ @x, @y = @x + @n[0], @y + @n[1]
17
+ @n[0] = -@n[0] if @x < 2 or @x >= L - 2
18
+ @n[1] = -@n[1] if @y < 2 or @y >= L - 2
19
+ end
20
+ end
21
+
22
+ class Color
23
+ def initialize
24
+ init
25
+ end
26
+ attr_reader :x, :y, :z
27
+
28
+ def init
29
+ @x = rand(C_MAX); @y = rand(C_MAX); @z = rand(C_MAX)
30
+ cn = Vector[rand, rand, rand]
31
+ @cn = [cn[0] / cn.norm, cn[1] / cn.norm, cn[2]/ cn.norm]
32
+ end
33
+
34
+ def next
35
+ @x, @y, @z = @x + @cn[0] * C_STEP, @y + @cn[1] * C_STEP, @z + @cn[2] * C_STEP
36
+ @cn[0] = -@cn[0] if @x < C_STEP or @x >= C_MAX - C_STEP
37
+ @cn[1] = -@cn[1] if @y < C_STEP or @y >= C_MAX - C_STEP
38
+ @cn[2] = -@cn[2] if @z < C_STEP or @z >= C_MAX - C_STEP
39
+ init if rand < 0.001
40
+ end
41
+ end
42
+
43
+ pos = Field.new
44
+ col = Color.new
45
+
46
+ Oekaki.app width: L, height: L do
47
+ draw do
48
+ clear
49
+ end
50
+
51
+ timer(20) do
52
+ color(col.x.to_i, col.y.to_i, col.z.to_i)
53
+ arc(true, pos.x.to_i + 2, pos.y.to_i + 2, 4, 4, 0, 64 * 360)
54
+ pos.next
55
+ col.next
56
+ true
57
+ end
58
+ end
@@ -0,0 +1,20 @@
1
+ require 'oekaki'
2
+
3
+ Oekaki.app width: 400, height: 400 do
4
+ draw do
5
+ clear
6
+
7
+ color(0, 65535, 0)
8
+ po = Vector[0, 50]
9
+ θ = PI / 15
10
+ a = Matrix[[cos(θ), -sin(θ)], [sin(θ), cos(θ)]]
11
+ for y in 0..3
12
+ for x in 0..3
13
+ x1 = x * 100 + 50
14
+ y1 = y * 100 + 50
15
+ star(false, x1, y1, x1 + po[0], y1 - po[1])
16
+ po = a * po
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,18 @@
1
+ require 'oekaki'
2
+
3
+ Oekaki.app do
4
+ draw do
5
+ clear
6
+ end
7
+
8
+ po = Vector[0, 150]
9
+ θ = PI / 50
10
+ a = Matrix[[cos(θ), -sin(θ)], [sin(θ), cos(θ)]]
11
+
12
+ timer(20) do
13
+ clear
14
+ color(0, 65535, 0)
15
+ star(false, 150, 150, 150 + po[0], 150 - po[1])
16
+ po = a * po
17
+ end
18
+ end
@@ -0,0 +1,39 @@
1
+ require 'oekaki'
2
+
3
+ Width, Height = 400, 300
4
+ Turn = 20
5
+ Length = 40
6
+ Ratio = 0.9
7
+ Depth = 8
8
+
9
+ θ = PI * Turn / 180
10
+ left = Matrix[[cos(θ), -sin(θ)], [sin(θ), cos(θ)]]
11
+ right = Matrix[[cos(-θ), -sin(-θ)], [sin(-θ), cos(-θ)]]
12
+
13
+
14
+ Oekaki.app width: Width, height: Height, title: "tree" do
15
+ draw do
16
+ clear
17
+ end
18
+
19
+ ar = [[Vector[Width / 2, 1], Vector[0, Length]]]
20
+ branch_num = 0
21
+
22
+ id = timer(80) do
23
+ ob = ar.shift
24
+ v1 = left * ob[1]
25
+ v2 = right * ob[1]
26
+ p1 = ob[0] + v1
27
+ p2 = ob[0] + v2
28
+
29
+ color(0, 65535, 0)
30
+ line(ob[0][0], Height - ob[0][1], p1[0], Height - p1[1])
31
+ line(ob[0][0], Height - ob[0][1], p2[0], Height - p2[1])
32
+
33
+ ar << [p1, v1 * Ratio]
34
+ ar << [p2, v2 * Ratio]
35
+ branch_num += 2
36
+ timer_stop(id) if branch_num >= 2 ** (Depth + 1) - 2
37
+ true
38
+ end
39
+ end
@@ -0,0 +1,39 @@
1
+ require 'oekaki'
2
+
3
+ R = 7
4
+ Width, Height = 500, 500
5
+
6
+ Oekaki.app width: Width, height: Height do
7
+ draw do
8
+ clear
9
+ end
10
+
11
+ p = Vector[0, 0]
12
+ np = p
13
+ deg = 90
14
+ r = 0
15
+ step = 1.5
16
+
17
+ b_line = lambda do |p1, p2|
18
+ l = (p2 - p1).r
19
+ pt = p1
20
+ 0.upto(l) do
21
+ color(0, 65535, 0)
22
+ arc(true, Width / 2 + pt[0] - R, Height / 2 - pt[1] - R, R * 2, R * 2, 0, 64 * 360)
23
+ pt += (p2 - p1) / l
24
+ end
25
+ end
26
+
27
+ id = timer(50) do
28
+ b_line.call(p, np)
29
+
30
+ p = np
31
+ θ = PI * deg / 180
32
+ np = Vector[cos(θ), sin(θ)] * r
33
+ r += step
34
+ step_d = 20 - r / 35
35
+ deg -= step_d
36
+ timer_stop(id) if r > 220
37
+ true
38
+ end
39
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: oekaki
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.1.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - obelisk
@@ -31,6 +31,18 @@ extensions: []
31
31
  extra_rdoc_files: []
32
32
  files:
33
33
  - README
34
+ - example/oekaki_sample1.rb
35
+ - example/oekaki_sample10.rb
36
+ - example/oekaki_sample12.rb
37
+ - example/oekaki_sample14.rb
38
+ - example/oekaki_sample2.rb
39
+ - example/oekaki_sample3.rb
40
+ - example/oekaki_sample4.rb
41
+ - example/oekaki_sample5.rb
42
+ - example/oekaki_sample6.rb
43
+ - example/oekaki_sample7.rb
44
+ - example/oekaki_sample8.rb
45
+ - example/oekaki_sample9.rb
34
46
  - lib/oekaki.rb
35
47
  homepage: http://obelisk.hatenablog.com/entry/2016/12/15/172026
36
48
  licenses: