gray_scott_gtk3 0.4.0 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +8 -4
- data/exe/grayscott +8 -11
- data/gray_scott_gtk3.gemspec +3 -3
- data/lib/gray_scott.rb +26 -0
- data/lib/{gray_scott_gtk3 → gray_scott}/controller.rb +50 -8
- data/lib/{gray_scott_gtk3 → gray_scott}/controller/aboutdialog.rb +2 -2
- data/lib/gray_scott/laplacian.rb +29 -0
- data/lib/{gray_scott_gtk3 → gray_scott}/model.rb +9 -6
- data/lib/gray_scott/version.rb +3 -0
- data/resources/gray_scott.glade +167 -70
- metadata +11 -12
- data/lib/gray_scott_gtk3.rb +0 -21
- data/lib/gray_scott_gtk3/laplacian.rb +0 -27
- data/lib/gray_scott_gtk3/version.rb +0 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 631ab3461313a23f12de24a7416a993a2522364ac3b50d36dabd65a2477e30a1
|
4
|
+
data.tar.gz: 9e43e401b1f7719a04ff320e29ef01a87450637087c95cc1f77f6dd6dfd7d2f3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: dbbf57fdb426ef5c62b859a5df4decae30a090d2f08b031e997f13f8afa3148aa4a5ba20f6eeca372550ad82a6e18b96f99ee3e8bd9718f98a1ae77fdfe51057
|
7
|
+
data.tar.gz: 5e6e37d935c7d35dfe1c1644ddb665563a0ab3af3a5849badd8950180af66bf6d927666ebe3ef3e753857d9b9b3dbca7f9bf756ddeaf7c15d8694b9eaa72f7e1
|
data/README.md
CHANGED
@@ -5,7 +5,8 @@
|
|
5
5
|
## Requirements
|
6
6
|
|
7
7
|
* Ruby
|
8
|
-
* Numo/NArray
|
8
|
+
* Numo/NArray (CPU)
|
9
|
+
* Cumo/NArray (GPU)
|
9
10
|
* Ruby/Gtk3
|
10
11
|
|
11
12
|
## Installation
|
@@ -21,11 +22,12 @@ $ grayscott 40 -w 256 -h 256 # size of model. display is fixed to 512 x 512 pixe
|
|
21
22
|
## Usage with terminal(example)
|
22
23
|
|
23
24
|
$ bundle install
|
25
|
+
|
24
26
|
$ bundle exec bin/console
|
25
27
|
|
26
28
|
```ruby
|
27
|
-
|
28
|
-
c =
|
29
|
+
GrayScott::Controller::MSEC = 50
|
30
|
+
c = GrayScott::Controller.new 'resources/', width:1024, height:1024
|
29
31
|
|
30
32
|
# custom feed / kill ratio
|
31
33
|
na = Numo::SFloat.new(1024,1).seq + 10 # avoid zero
|
@@ -36,10 +38,12 @@ k = na.transpose * 0.06 + 0.01
|
|
36
38
|
c.model.f = f
|
37
39
|
c.model.k = k
|
38
40
|
c.model.v.rand(0.0, 0.15)
|
39
|
-
c.color = '
|
41
|
+
c.color = 'reverse_green' # colorful is slow.
|
40
42
|
Gtk.main
|
41
43
|
```
|
42
44
|
|
45
|
+
![screenshot](https://raw.githubusercontent.com/kojix2/Gray-Scott/screenshot/screenshot/reverse-green.png)
|
46
|
+
|
43
47
|
## Known issue
|
44
48
|
|
45
49
|
Glib::Timeout.add(number_of_seconds)
|
data/exe/grayscott
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
-
require 'gray_scott_gtk3'
|
4
3
|
require 'optparse'
|
5
4
|
|
6
5
|
opt = {}
|
@@ -8,20 +7,18 @@ OptionParser.new do |op|
|
|
8
7
|
op.banner += ' msec'
|
9
8
|
op.on('-h val', '--height', 'height of the model') { |v| opt[:height] = v.to_i }
|
10
9
|
op.on('-w val', '--width', 'width of the model') { |v| opt[:width] = v.to_i }
|
11
|
-
op.
|
10
|
+
op.on('-g', '--gpu', 'use GPU(Cumo)'){ |v| opt[:gpu] = v }
|
12
11
|
op.parse!(ARGV)
|
13
12
|
end
|
14
13
|
|
15
|
-
if
|
16
|
-
|
17
|
-
MSEC = ARGV[0].to_i
|
18
|
-
end
|
19
|
-
else
|
20
|
-
puts 'please specify command-line argument. For example `grayscott 40`'
|
21
|
-
exit
|
14
|
+
if opt[:gpu]
|
15
|
+
require 'cumo/narray'
|
22
16
|
end
|
17
|
+
opt.delete(:gpu)
|
18
|
+
|
19
|
+
require 'gray_scott'
|
23
20
|
|
24
|
-
module
|
21
|
+
module GrayScott
|
25
22
|
class << self
|
26
23
|
def run(opt)
|
27
24
|
xml_path = File.expand_path('../resources/', __dir__)
|
@@ -31,4 +28,4 @@ module GrayScottGtk3
|
|
31
28
|
end
|
32
29
|
end
|
33
30
|
|
34
|
-
|
31
|
+
GrayScott.run(opt)
|
data/gray_scott_gtk3.gemspec
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
lib = File.expand_path('lib', __dir__)
|
2
2
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
3
|
-
require '
|
3
|
+
require 'gray_scott/version'
|
4
4
|
|
5
5
|
Gem::Specification.new do |spec|
|
6
6
|
spec.name = 'gray_scott_gtk3'
|
7
|
-
spec.version =
|
7
|
+
spec.version = GrayScott::VERSION
|
8
8
|
spec.authors = ['kojix2']
|
9
9
|
spec.email = ['2xijok@gmail.com']
|
10
10
|
|
@@ -21,8 +21,8 @@ Gem::Specification.new do |spec|
|
|
21
21
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
22
22
|
spec.require_paths = ['lib']
|
23
23
|
|
24
|
-
spec.add_dependency 'numo-narray'
|
25
24
|
spec.add_dependency 'gtk3'
|
25
|
+
spec.add_dependency 'numo-narray'
|
26
26
|
|
27
27
|
spec.add_development_dependency 'bundler', '~> 1.17'
|
28
28
|
spec.add_development_dependency 'rake', '~> 10.0'
|
data/lib/gray_scott.rb
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'gtk3'
|
2
|
+
|
3
|
+
unless Object.const_defined? :Cumo
|
4
|
+
require 'numo/narray'
|
5
|
+
Xumo = Numo
|
6
|
+
else
|
7
|
+
Xumo = Cumo
|
8
|
+
end
|
9
|
+
|
10
|
+
module XumoShortHand
|
11
|
+
class Xumo::SFloat
|
12
|
+
alias _ inplace
|
13
|
+
end
|
14
|
+
SFloat = Xumo::SFloat
|
15
|
+
UInt8 = Xumo::UInt8
|
16
|
+
end
|
17
|
+
|
18
|
+
require 'gray_scott/model'
|
19
|
+
require 'gray_scott/controller'
|
20
|
+
require 'gray_scott/laplacian'
|
21
|
+
require 'gray_scott/version'
|
22
|
+
|
23
|
+
module GrayScott
|
24
|
+
class Error < StandardError; end
|
25
|
+
# Your code goes here...
|
26
|
+
end
|
@@ -1,8 +1,8 @@
|
|
1
1
|
require_relative 'controller/aboutdialog'
|
2
2
|
|
3
|
-
module
|
3
|
+
module GrayScott
|
4
4
|
class Controller
|
5
|
-
include
|
5
|
+
include XumoShortHand
|
6
6
|
attr_accessor :resource_dir, :height, :width, :model, :color
|
7
7
|
|
8
8
|
def initialize(dir, height: 256, width: 256)
|
@@ -12,6 +12,8 @@ module GrayScottGtk3
|
|
12
12
|
@model = Model.new(height: height, width: width)
|
13
13
|
@show_u = false
|
14
14
|
@color = 'colorful'
|
15
|
+
@frames = 1
|
16
|
+
@msec = 40
|
15
17
|
|
16
18
|
builder = Gtk::Builder.new
|
17
19
|
builder.add_from_file File.join(resource_dir, 'gray_scott.glade')
|
@@ -23,7 +25,7 @@ module GrayScottGtk3
|
|
23
25
|
builder.connect_signals { |handler| method(handler) }
|
24
26
|
|
25
27
|
@win.show_all # window
|
26
|
-
|
28
|
+
on_clear_clicked
|
27
29
|
end
|
28
30
|
|
29
31
|
def show_about
|
@@ -38,6 +40,15 @@ module GrayScottGtk3
|
|
38
40
|
model.k = k.value
|
39
41
|
end
|
40
42
|
|
43
|
+
def on_frames_changed(frames)
|
44
|
+
@frames = frames.value.to_i
|
45
|
+
end
|
46
|
+
|
47
|
+
def on_msec_changed(msec)
|
48
|
+
@msec = msec.value.to_i
|
49
|
+
end
|
50
|
+
|
51
|
+
|
41
52
|
def display
|
42
53
|
@gimage.pixbuf = to_pixbuf(@show_u ? model.u : model.v)
|
43
54
|
end
|
@@ -60,8 +71,10 @@ module GrayScottGtk3
|
|
60
71
|
|
61
72
|
def execute
|
62
73
|
@doing_now = true
|
63
|
-
GLib::Timeout.add
|
64
|
-
|
74
|
+
GLib::Timeout.add @msec do
|
75
|
+
@frames.times do
|
76
|
+
model.update
|
77
|
+
end
|
65
78
|
display
|
66
79
|
@doing_now
|
67
80
|
end
|
@@ -72,9 +85,38 @@ module GrayScottGtk3
|
|
72
85
|
@execute_button.active = false
|
73
86
|
end
|
74
87
|
|
88
|
+
def on_open_clicked
|
89
|
+
stop if doing_now?
|
90
|
+
dialog = Gtk::FileChooserDialog.new(title: 'Open Gray-Scott Model',
|
91
|
+
action: :open,
|
92
|
+
buttons: [%i[open accept], %i[cancel cancel]])
|
93
|
+
if dialog.run == :accept
|
94
|
+
filename = dialog.filename
|
95
|
+
str = File.read(filename)
|
96
|
+
# todo: check model
|
97
|
+
@model = Marshal.load(str)
|
98
|
+
display
|
99
|
+
end
|
100
|
+
dialog.destroy
|
101
|
+
end
|
102
|
+
|
75
103
|
def on_save_clicked
|
76
104
|
stop if doing_now?
|
77
|
-
dialog = Gtk::FileChooserDialog.new(title: '
|
105
|
+
dialog = Gtk::FileChooserDialog.new(title: 'Save Gray-Scott Model',
|
106
|
+
action: :save,
|
107
|
+
buttons: [%i[save accept], %i[cancel cancel]])
|
108
|
+
dialog.do_overwrite_confirmation = true
|
109
|
+
if dialog.run == :accept
|
110
|
+
filename = dialog.filename
|
111
|
+
str = Marshal.dump(model)
|
112
|
+
File.write(filename, str)
|
113
|
+
end
|
114
|
+
dialog.destroy
|
115
|
+
end
|
116
|
+
|
117
|
+
def on_convert_clicked
|
118
|
+
stop if doing_now?
|
119
|
+
dialog = Gtk::FileChooserDialog.new(title: 'Save PNG image',
|
78
120
|
action: :save,
|
79
121
|
buttons: [%i[save accept], %i[cancel cancel]])
|
80
122
|
dialog.do_overwrite_confirmation = true
|
@@ -89,7 +131,7 @@ module GrayScottGtk3
|
|
89
131
|
Gtk.main_quit
|
90
132
|
end
|
91
133
|
|
92
|
-
def
|
134
|
+
def on_clear_clicked
|
93
135
|
model.clear
|
94
136
|
display_legend
|
95
137
|
display
|
@@ -175,6 +217,7 @@ module GrayScottGtk3
|
|
175
217
|
end
|
176
218
|
|
177
219
|
private
|
220
|
+
|
178
221
|
def debug_p_u
|
179
222
|
p model.u
|
180
223
|
end
|
@@ -190,6 +233,5 @@ module GrayScottGtk3
|
|
190
233
|
def debug_p_k
|
191
234
|
p model.k
|
192
235
|
end
|
193
|
-
|
194
236
|
end
|
195
237
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
module
|
1
|
+
module GrayScott
|
2
2
|
class Controller
|
3
3
|
class AboutDialog
|
4
4
|
def initialize(resource_dir)
|
@@ -6,7 +6,7 @@ module GrayScottGtk3
|
|
6
6
|
@a.program_name = 'Gray-Scott'
|
7
7
|
@a.logo = GdkPixbuf::Pixbuf.new(file: File.join(resource_dir, 'about_icon.png'))
|
8
8
|
@a.authors = ['kojix2']
|
9
|
-
@a.version =
|
9
|
+
@a.version = GrayScott::VERSION
|
10
10
|
@a.run
|
11
11
|
@a.destroy
|
12
12
|
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module GrayScott
|
2
|
+
module Utils
|
3
|
+
module Math
|
4
|
+
# To avoid mistakes
|
5
|
+
A = (1..-1).freeze
|
6
|
+
B = (0..-2).freeze
|
7
|
+
T = true
|
8
|
+
|
9
|
+
def self._laplacian2d(uv, dx)
|
10
|
+
l_uv = uv.new_zeros
|
11
|
+
l_uv[A, T]._ + uv[B, T]
|
12
|
+
l_uv[T, A]._ + uv[T, B]
|
13
|
+
|
14
|
+
l_uv[0, T]._ + uv[-1, T]
|
15
|
+
l_uv[T, 0]._ + uv[T, -1]
|
16
|
+
|
17
|
+
l_uv[B, T]._ + uv[A, T]
|
18
|
+
l_uv[T, B]._ + uv[T, A]
|
19
|
+
|
20
|
+
l_uv[-1, T]._ + uv[0, T]
|
21
|
+
l_uv[T, -1]._ + uv[T, 0]
|
22
|
+
|
23
|
+
l_uv._ - (uv * 4)
|
24
|
+
l_uv._ / (dx * dx)
|
25
|
+
l_uv
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -1,6 +1,6 @@
|
|
1
|
-
module
|
1
|
+
module GrayScott
|
2
2
|
class Model
|
3
|
-
include
|
3
|
+
include XumoShortHand
|
4
4
|
|
5
5
|
Dx = 0.01
|
6
6
|
Dt = 1
|
@@ -26,8 +26,8 @@ module GrayScottGtk3
|
|
26
26
|
end
|
27
27
|
|
28
28
|
def update
|
29
|
-
l_u =
|
30
|
-
l_v =
|
29
|
+
l_u = Utils::Math._laplacian2d u, Dx
|
30
|
+
l_v = Utils::Math._laplacian2d v, Dx
|
31
31
|
|
32
32
|
uvv = u * v * v
|
33
33
|
dudt = Du * l_u - uvv + f * (1.0 - u)
|
@@ -38,8 +38,11 @@ module GrayScottGtk3
|
|
38
38
|
end
|
39
39
|
|
40
40
|
def immune_surveillance
|
41
|
-
|
42
|
-
@
|
41
|
+
# clip is better.
|
42
|
+
@u[@u.lt 0.00001] = 0.00001
|
43
|
+
@u[@u.gt 1] = 1
|
44
|
+
@v[@v.lt 0.00001] = 0.00001
|
45
|
+
@v[@v.gt 1] = 1
|
43
46
|
end
|
44
47
|
end
|
45
48
|
end
|
data/resources/gray_scott.glade
CHANGED
@@ -9,6 +9,13 @@
|
|
9
9
|
<property name="page_increment">0.01</property>
|
10
10
|
<signal name="value-changed" handler="on_f_changed" swapped="no"/>
|
11
11
|
</object>
|
12
|
+
<object class="GtkAdjustment" id="frames">
|
13
|
+
<property name="upper">1000</property>
|
14
|
+
<property name="value">1</property>
|
15
|
+
<property name="step_increment">1</property>
|
16
|
+
<property name="page_increment">10</property>
|
17
|
+
<signal name="value-changed" handler="on_frames_changed" swapped="no"/>
|
18
|
+
</object>
|
12
19
|
<object class="GtkAdjustment" id="k">
|
13
20
|
<property name="upper">0.10000000000000001</property>
|
14
21
|
<property name="value">0.059999999999999998</property>
|
@@ -16,6 +23,13 @@
|
|
16
23
|
<property name="page_increment">0.01</property>
|
17
24
|
<signal name="value-changed" handler="on_k_changed" swapped="no"/>
|
18
25
|
</object>
|
26
|
+
<object class="GtkAdjustment" id="msec">
|
27
|
+
<property name="upper">10000</property>
|
28
|
+
<property name="value">40</property>
|
29
|
+
<property name="step_increment">1</property>
|
30
|
+
<property name="page_increment">10</property>
|
31
|
+
<signal name="value-changed" handler="on_msec_changed" swapped="no"/>
|
32
|
+
</object>
|
19
33
|
<object class="GtkAdjustment" id="pen_density">
|
20
34
|
<property name="upper">1</property>
|
21
35
|
<property name="value">0.5</property>
|
@@ -64,7 +78,17 @@
|
|
64
78
|
<property name="can_focus">False</property>
|
65
79
|
<property name="use_underline">True</property>
|
66
80
|
<property name="use_stock">True</property>
|
67
|
-
<signal name="activate" handler="
|
81
|
+
<signal name="activate" handler="on_clear_clicked" swapped="no"/>
|
82
|
+
</object>
|
83
|
+
</child>
|
84
|
+
<child>
|
85
|
+
<object class="GtkImageMenuItem">
|
86
|
+
<property name="label">gtk-open</property>
|
87
|
+
<property name="visible">True</property>
|
88
|
+
<property name="can_focus">False</property>
|
89
|
+
<property name="use_underline">True</property>
|
90
|
+
<property name="use_stock">True</property>
|
91
|
+
<signal name="activate" handler="on_open_clicked" swapped="no"/>
|
68
92
|
</object>
|
69
93
|
</child>
|
70
94
|
<child>
|
@@ -77,6 +101,16 @@
|
|
77
101
|
<signal name="activate" handler="on_save_clicked" swapped="no"/>
|
78
102
|
</object>
|
79
103
|
</child>
|
104
|
+
<child>
|
105
|
+
<object class="GtkImageMenuItem">
|
106
|
+
<property name="label">gtk-convert</property>
|
107
|
+
<property name="visible">True</property>
|
108
|
+
<property name="can_focus">False</property>
|
109
|
+
<property name="use_underline">True</property>
|
110
|
+
<property name="use_stock">True</property>
|
111
|
+
<signal name="activate" handler="on_convert_clicked" swapped="no"/>
|
112
|
+
</object>
|
113
|
+
</child>
|
80
114
|
<child>
|
81
115
|
<object class="GtkSeparatorMenuItem">
|
82
116
|
<property name="visible">True</property>
|
@@ -179,51 +213,103 @@
|
|
179
213
|
</packing>
|
180
214
|
</child>
|
181
215
|
<child>
|
182
|
-
<object class="
|
216
|
+
<object class="GtkToolbar">
|
183
217
|
<property name="visible">True</property>
|
184
218
|
<property name="can_focus">False</property>
|
185
|
-
<property name="margin_left">5</property>
|
186
|
-
<property name="margin_right">5</property>
|
187
|
-
<property name="spacing">5</property>
|
188
219
|
<child>
|
189
|
-
<object class="
|
190
|
-
<property name="label">gtk-new</property>
|
220
|
+
<object class="GtkToolButton">
|
191
221
|
<property name="visible">True</property>
|
192
|
-
<property name="can_focus">
|
193
|
-
<property name="
|
194
|
-
<property name="
|
195
|
-
<property name="
|
196
|
-
<property name="
|
197
|
-
<signal name="clicked" handler="
|
222
|
+
<property name="can_focus">False</property>
|
223
|
+
<property name="tooltip_text" translatable="yes">clear</property>
|
224
|
+
<property name="label" translatable="yes">clear</property>
|
225
|
+
<property name="use_underline">True</property>
|
226
|
+
<property name="stock_id">gtk-clear</property>
|
227
|
+
<signal name="clicked" handler="on_clear_clicked" swapped="no"/>
|
198
228
|
</object>
|
199
229
|
<packing>
|
200
230
|
<property name="expand">False</property>
|
201
|
-
<property name="
|
202
|
-
|
231
|
+
<property name="homogeneous">True</property>
|
232
|
+
</packing>
|
233
|
+
</child>
|
234
|
+
<child>
|
235
|
+
<object class="GtkToolButton">
|
236
|
+
<property name="visible">True</property>
|
237
|
+
<property name="can_focus">False</property>
|
238
|
+
<property name="tooltip_text" translatable="yes">open</property>
|
239
|
+
<property name="label" translatable="yes">open</property>
|
240
|
+
<property name="use_underline">True</property>
|
241
|
+
<property name="stock_id">gtk-open</property>
|
242
|
+
<signal name="clicked" handler="on_open_clicked" swapped="no"/>
|
243
|
+
</object>
|
244
|
+
<packing>
|
245
|
+
<property name="expand">False</property>
|
246
|
+
<property name="homogeneous">True</property>
|
247
|
+
</packing>
|
248
|
+
</child>
|
249
|
+
<child>
|
250
|
+
<object class="GtkToolButton">
|
251
|
+
<property name="visible">True</property>
|
252
|
+
<property name="can_focus">False</property>
|
253
|
+
<property name="tooltip_text" translatable="yes">save model</property>
|
254
|
+
<property name="label" translatable="yes">save</property>
|
255
|
+
<property name="use_underline">True</property>
|
256
|
+
<property name="stock_id">gtk-save</property>
|
257
|
+
</object>
|
258
|
+
<packing>
|
259
|
+
<property name="expand">False</property>
|
260
|
+
<property name="homogeneous">True</property>
|
203
261
|
</packing>
|
204
262
|
</child>
|
263
|
+
<child>
|
264
|
+
<object class="GtkToolButton">
|
265
|
+
<property name="visible">True</property>
|
266
|
+
<property name="can_focus">False</property>
|
267
|
+
<property name="tooltip_text" translatable="yes">save png image</property>
|
268
|
+
<property name="label" translatable="yes">save_png</property>
|
269
|
+
<property name="use_underline">True</property>
|
270
|
+
<property name="stock_id">gtk-convert</property>
|
271
|
+
<signal name="clicked" handler="on_convert_clicked" swapped="no"/>
|
272
|
+
</object>
|
273
|
+
<packing>
|
274
|
+
<property name="expand">False</property>
|
275
|
+
<property name="homogeneous">True</property>
|
276
|
+
</packing>
|
277
|
+
</child>
|
278
|
+
<child>
|
279
|
+
<object class="GtkToggleToolButton">
|
280
|
+
<property name="visible">True</property>
|
281
|
+
<property name="can_focus">False</property>
|
282
|
+
<property name="tooltip_text" translatable="yes">execute</property>
|
283
|
+
<property name="label" translatable="yes">__glade_unnamed_42</property>
|
284
|
+
<property name="use_underline">True</property>
|
285
|
+
<property name="stock_id">gtk-media-play</property>
|
286
|
+
<signal name="toggled" handler="on_execute_toggled" swapped="no"/>
|
287
|
+
</object>
|
288
|
+
<packing>
|
289
|
+
<property name="expand">False</property>
|
290
|
+
<property name="homogeneous">True</property>
|
291
|
+
</packing>
|
292
|
+
</child>
|
293
|
+
</object>
|
294
|
+
<packing>
|
295
|
+
<property name="expand">False</property>
|
296
|
+
<property name="fill">True</property>
|
297
|
+
<property name="position">1</property>
|
298
|
+
</packing>
|
299
|
+
</child>
|
300
|
+
<child>
|
301
|
+
<object class="GtkBox">
|
302
|
+
<property name="visible">True</property>
|
303
|
+
<property name="can_focus">False</property>
|
304
|
+
<property name="margin_left">5</property>
|
305
|
+
<property name="margin_right">5</property>
|
306
|
+
<property name="spacing">3</property>
|
205
307
|
<child>
|
206
308
|
<object class="GtkGrid">
|
207
309
|
<property name="visible">True</property>
|
208
310
|
<property name="can_focus">False</property>
|
209
311
|
<property name="margin_top">1</property>
|
210
312
|
<property name="border_width">0</property>
|
211
|
-
<child>
|
212
|
-
<object class="GtkLabel" id="klabel">
|
213
|
-
<property name="visible">True</property>
|
214
|
-
<property name="can_focus">False</property>
|
215
|
-
<property name="tooltip_text" translatable="yes">Kill is the removal/kill rate of U</property>
|
216
|
-
<property name="margin_left">5</property>
|
217
|
-
<property name="margin_right">5</property>
|
218
|
-
<property name="margin_top">5</property>
|
219
|
-
<property name="margin_bottom">5</property>
|
220
|
-
<property name="label" translatable="yes">Kill</property>
|
221
|
-
</object>
|
222
|
-
<packing>
|
223
|
-
<property name="left_attach">0</property>
|
224
|
-
<property name="top_attach">1</property>
|
225
|
-
</packing>
|
226
|
-
</child>
|
227
313
|
<child>
|
228
314
|
<object class="GtkLabel" id="flabel">
|
229
315
|
<property name="visible">True</property>
|
@@ -260,6 +346,22 @@
|
|
260
346
|
<property name="top_attach">0</property>
|
261
347
|
</packing>
|
262
348
|
</child>
|
349
|
+
<child>
|
350
|
+
<object class="GtkLabel" id="klabel">
|
351
|
+
<property name="visible">True</property>
|
352
|
+
<property name="can_focus">False</property>
|
353
|
+
<property name="tooltip_text" translatable="yes">Kill is the removal/kill rate of U</property>
|
354
|
+
<property name="margin_left">5</property>
|
355
|
+
<property name="margin_right">5</property>
|
356
|
+
<property name="margin_top">5</property>
|
357
|
+
<property name="margin_bottom">5</property>
|
358
|
+
<property name="label" translatable="yes">Kill</property>
|
359
|
+
</object>
|
360
|
+
<packing>
|
361
|
+
<property name="left_attach">0</property>
|
362
|
+
<property name="top_attach">1</property>
|
363
|
+
</packing>
|
364
|
+
</child>
|
263
365
|
<child>
|
264
366
|
<object class="GtkScale" id="kscale">
|
265
367
|
<property name="visible">True</property>
|
@@ -284,50 +386,15 @@
|
|
284
386
|
<packing>
|
285
387
|
<property name="expand">True</property>
|
286
388
|
<property name="fill">True</property>
|
287
|
-
<property name="position">1</property>
|
288
|
-
</packing>
|
289
|
-
</child>
|
290
|
-
<child>
|
291
|
-
<object class="GtkButton" id="save_button">
|
292
|
-
<property name="label">gtk-save</property>
|
293
|
-
<property name="visible">True</property>
|
294
|
-
<property name="can_focus">True</property>
|
295
|
-
<property name="receives_default">True</property>
|
296
|
-
<property name="tooltip_text" translatable="yes">Save as PNG image</property>
|
297
|
-
<property name="use_stock">True</property>
|
298
|
-
<property name="image_position">top</property>
|
299
|
-
<property name="always_show_image">True</property>
|
300
|
-
<signal name="clicked" handler="on_save_clicked" swapped="no"/>
|
301
|
-
</object>
|
302
|
-
<packing>
|
303
|
-
<property name="expand">False</property>
|
304
|
-
<property name="fill">True</property>
|
305
389
|
<property name="position">2</property>
|
306
390
|
</packing>
|
307
391
|
</child>
|
308
|
-
<child>
|
309
|
-
<object class="GtkToggleButton" id="execute_button">
|
310
|
-
<property name="label">gtk-execute</property>
|
311
|
-
<property name="visible">True</property>
|
312
|
-
<property name="can_focus">True</property>
|
313
|
-
<property name="receives_default">True</property>
|
314
|
-
<property name="use_stock">True</property>
|
315
|
-
<property name="image_position">top</property>
|
316
|
-
<property name="always_show_image">True</property>
|
317
|
-
<signal name="toggled" handler="on_execute_toggled" swapped="no"/>
|
318
|
-
</object>
|
319
|
-
<packing>
|
320
|
-
<property name="expand">False</property>
|
321
|
-
<property name="fill">True</property>
|
322
|
-
<property name="position">3</property>
|
323
|
-
</packing>
|
324
|
-
</child>
|
325
392
|
</object>
|
326
393
|
<packing>
|
327
394
|
<property name="expand">True</property>
|
328
395
|
<property name="fill">True</property>
|
329
396
|
<property name="padding">5</property>
|
330
|
-
<property name="position">
|
397
|
+
<property name="position">2</property>
|
331
398
|
</packing>
|
332
399
|
</child>
|
333
400
|
<child>
|
@@ -408,7 +475,7 @@ applications-graphics</property>
|
|
408
475
|
</child>
|
409
476
|
</object>
|
410
477
|
<packing>
|
411
|
-
<property name="position">
|
478
|
+
<property name="position">0</property>
|
412
479
|
</packing>
|
413
480
|
</child>
|
414
481
|
<child>
|
@@ -444,7 +511,37 @@ applications-graphics</property>
|
|
444
511
|
</child>
|
445
512
|
</object>
|
446
513
|
<packing>
|
447
|
-
<property name="position">
|
514
|
+
<property name="position">0</property>
|
515
|
+
</packing>
|
516
|
+
</child>
|
517
|
+
<child>
|
518
|
+
<object class="GtkSpinButton">
|
519
|
+
<property name="visible">True</property>
|
520
|
+
<property name="can_focus">True</property>
|
521
|
+
<property name="tooltip_text" translatable="yes">frames</property>
|
522
|
+
<property name="input_purpose">digits</property>
|
523
|
+
<property name="adjustment">frames</property>
|
524
|
+
<property name="climb_rate">1</property>
|
525
|
+
<property name="numeric">True</property>
|
526
|
+
</object>
|
527
|
+
<packing>
|
528
|
+
<property name="pack_type">end</property>
|
529
|
+
<property name="position">0</property>
|
530
|
+
</packing>
|
531
|
+
</child>
|
532
|
+
<child>
|
533
|
+
<object class="GtkSpinButton">
|
534
|
+
<property name="visible">True</property>
|
535
|
+
<property name="can_focus">True</property>
|
536
|
+
<property name="tooltip_text" translatable="yes">msec</property>
|
537
|
+
<property name="input_purpose">digits</property>
|
538
|
+
<property name="adjustment">msec</property>
|
539
|
+
<property name="climb_rate">1</property>
|
540
|
+
<property name="numeric">True</property>
|
541
|
+
</object>
|
542
|
+
<packing>
|
543
|
+
<property name="pack_type">end</property>
|
544
|
+
<property name="position">0</property>
|
448
545
|
</packing>
|
449
546
|
</child>
|
450
547
|
</object>
|
@@ -469,7 +566,7 @@ applications-graphics</property>
|
|
469
566
|
<packing>
|
470
567
|
<property name="expand">False</property>
|
471
568
|
<property name="fill">True</property>
|
472
|
-
<property name="position">
|
569
|
+
<property name="position">3</property>
|
473
570
|
</packing>
|
474
571
|
</child>
|
475
572
|
<child>
|
metadata
CHANGED
@@ -1,17 +1,17 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gray_scott_gtk3
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- kojix2
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-12-
|
11
|
+
date: 2018-12-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: gtk3
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
@@ -25,7 +25,7 @@ dependencies:
|
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
28
|
+
name: numo-narray
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - ">="
|
@@ -97,12 +97,12 @@ files:
|
|
97
97
|
- bin/setup
|
98
98
|
- exe/grayscott
|
99
99
|
- gray_scott_gtk3.gemspec
|
100
|
-
- lib/
|
101
|
-
- lib/
|
102
|
-
- lib/
|
103
|
-
- lib/
|
104
|
-
- lib/
|
105
|
-
- lib/
|
100
|
+
- lib/gray_scott.rb
|
101
|
+
- lib/gray_scott/controller.rb
|
102
|
+
- lib/gray_scott/controller/aboutdialog.rb
|
103
|
+
- lib/gray_scott/laplacian.rb
|
104
|
+
- lib/gray_scott/model.rb
|
105
|
+
- lib/gray_scott/version.rb
|
106
106
|
- resources/about_icon.png
|
107
107
|
- resources/gray_scott.glade
|
108
108
|
homepage: https://github.com/kojix2/Gray-Scott
|
@@ -123,8 +123,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
123
123
|
- !ruby/object:Gem::Version
|
124
124
|
version: '0'
|
125
125
|
requirements: []
|
126
|
-
|
127
|
-
rubygems_version: 2.7.6
|
126
|
+
rubygems_version: 3.0.1
|
128
127
|
signing_key:
|
129
128
|
specification_version: 4
|
130
129
|
summary: Gray-Scott model.
|
data/lib/gray_scott_gtk3.rb
DELETED
@@ -1,21 +0,0 @@
|
|
1
|
-
require 'numo/narray'
|
2
|
-
require 'gtk3'
|
3
|
-
|
4
|
-
module ShortNumo
|
5
|
-
N = Numo
|
6
|
-
class Numo::SFloat
|
7
|
-
alias _ inplace
|
8
|
-
end
|
9
|
-
SFloat = Numo::SFloat
|
10
|
-
UInt8 = Numo::UInt8
|
11
|
-
end
|
12
|
-
|
13
|
-
require 'gray_scott_gtk3/model'
|
14
|
-
require 'gray_scott_gtk3/controller'
|
15
|
-
require 'gray_scott_gtk3/laplacian'
|
16
|
-
require 'gray_scott_gtk3/version'
|
17
|
-
|
18
|
-
module GrayScottGtk3
|
19
|
-
class Error < StandardError; end
|
20
|
-
# Your code goes here...
|
21
|
-
end
|
@@ -1,27 +0,0 @@
|
|
1
|
-
module Numo
|
2
|
-
class SFloat
|
3
|
-
# To avoid mistakes
|
4
|
-
A = (1..-1).freeze
|
5
|
-
B = (0..-2).freeze
|
6
|
-
T = true
|
7
|
-
|
8
|
-
def self._laplacian2d(uv, dx)
|
9
|
-
l_uv = uv.new_zeros
|
10
|
-
l_uv[A, T]._ + uv[B, T]
|
11
|
-
l_uv[T, A]._ + uv[T, B]
|
12
|
-
|
13
|
-
l_uv[0, T]._ + uv[-1, T]
|
14
|
-
l_uv[T, 0]._ + uv[T, -1]
|
15
|
-
|
16
|
-
l_uv[B, T]._ + uv[A, T]
|
17
|
-
l_uv[T, B]._ + uv[T, A]
|
18
|
-
|
19
|
-
l_uv[-1, T]._ + uv[0, T]
|
20
|
-
l_uv[T, -1]._ + uv[T, 0]
|
21
|
-
|
22
|
-
l_uv._ - (uv * 4)
|
23
|
-
l_uv._ / (dx * dx)
|
24
|
-
l_uv
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|