cyross-ruby-miyako 2.0.5.1.0 → 2.1.0
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.
- data/README +1092 -929
- data/Rakefile +7 -7
- data/defines.h +144 -144
- data/extern.h +29 -29
- data/install_miyako.rb +87 -87
- data/lib/Miyako/API/audio.rb +572 -198
- data/lib/Miyako/API/basic_data.rb +825 -573
- data/lib/Miyako/API/bitmap.rb +534 -507
- data/lib/Miyako/API/choices.rb +481 -475
- data/lib/Miyako/API/collision.rb +486 -460
- data/lib/Miyako/API/diagram.rb +586 -561
- data/lib/Miyako/API/drawing.rb +151 -151
- data/lib/Miyako/API/exceptions.rb +105 -0
- data/lib/Miyako/API/fixedmap.rb +462 -428
- data/lib/Miyako/API/font.rb +430 -403
- data/lib/Miyako/API/input.rb +456 -447
- data/lib/Miyako/API/layout.rb +636 -433
- data/lib/Miyako/API/map.rb +583 -529
- data/lib/Miyako/API/map_event.rb +222 -198
- data/lib/Miyako/API/modules.rb +357 -109
- data/lib/Miyako/API/movie.rb +166 -154
- data/lib/Miyako/API/parts.rb +276 -189
- data/lib/Miyako/API/plane.rb +205 -166
- data/lib/Miyako/API/screen.rb +341 -325
- data/lib/Miyako/API/shape.rb +443 -443
- data/lib/Miyako/API/sprite.rb +771 -752
- data/lib/Miyako/API/sprite_animation.rb +490 -481
- data/lib/Miyako/API/sprite_list.rb +1135 -0
- data/lib/Miyako/API/spriteunit.rb +168 -147
- data/lib/Miyako/API/story.rb +350 -300
- data/lib/Miyako/API/textbox.rb +770 -725
- data/lib/Miyako/API/utility.rb +419 -388
- data/lib/Miyako/API/viewport.rb +189 -139
- data/lib/Miyako/API/yuki.rb +1226 -996
- data/lib/Miyako/EXT/miyako_cairo.rb +62 -62
- data/lib/Miyako/EXT/raster_scroll.rb +138 -138
- data/lib/Miyako/EXT/slides.rb +157 -157
- data/lib/Miyako/miyako.rb +201 -171
- data/lib/Miyako/miyako_require_only.rb +35 -0
- data/miyako_basicdata.c +590 -590
- data/miyako_bitmap.c +1225 -1225
- data/miyako_collision.c +403 -403
- data/miyako_drawing.c +187 -187
- data/miyako_font.c +334 -334
- data/miyako_hsv.c +830 -830
- data/miyako_input_audio.c +254 -0
- data/miyako_layout.c +191 -191
- data/miyako_no_katana.c +1078 -1074
- data/miyako_sprite2.c +431 -0
- data/miyako_transform.c +438 -438
- data/miyako_utility.c +288 -288
- data/sample/Animation1/m1ku.rb +68 -68
- data/sample/Animation2/lex.rb +96 -96
- data/sample/Diagram_sample/diagram_sample_yuki2.rb +328 -386
- data/sample/Room3/blue.rb +297 -297
- data/sample/Room3/ending.rb +180 -180
- data/sample/Room3/green.rb +220 -220
- data/sample/Room3/main.rb +119 -119
- data/sample/Room3/main_component.rb +59 -59
- data/sample/Room3/red.rb +227 -227
- data/sample/Room3/room3.rb +25 -27
- data/sample/Room3/title.rb +184 -184
- data/sample/ball_action_sample.rb +204 -204
- data/sample/blit_rop.rb +70 -70
- data/sample/cairo_sample.rb +25 -25
- data/sample/circle_collision_test.rb +66 -66
- data/sample/collision_test.rb +33 -33
- data/sample/collision_test2.rb +108 -108
- data/sample/fixed_map_test/fixed_map_sample.rb +140 -140
- data/sample/fixed_map_test/readme.txt +72 -72
- data/sample/map_test/chara.rb +58 -58
- data/sample/map_test/main_parts.rb +69 -69
- data/sample/map_test/main_scene.rb +153 -153
- data/sample/map_test/map_manager.rb +75 -75
- data/sample/map_test/map_test.rb +23 -23
- data/sample/map_test/oasis.rb +71 -71
- data/sample/map_test/readme.txt +89 -89
- data/sample/map_test/route.rb +157 -157
- data/sample/map_test/town.rb +74 -74
- data/sample/polygon_test.rb +35 -35
- data/sample/rasterscroll.rb +24 -24
- data/sample/takahashi.rb +42 -42
- data/sample/textbox_sample.rb +189 -189
- data/sample/transform.rb +54 -54
- data/sample/utility_test.rb +73 -73
- data/sample/utility_test2.rb +61 -61
- data/sample/utility_test3.rb +64 -64
- data/sample/utility_test4.rb +73 -73
- data/uninstall_miyako.rb +19 -19
- data/win/miyako_no_katana.so +0 -0
- metadata +7 -2
data/lib/Miyako/API/utility.rb
CHANGED
@@ -1,388 +1,419 @@
|
|
1
|
-
# -*- encoding: utf-8 -*-
|
2
|
-
=begin
|
3
|
-
--
|
4
|
-
Miyako v2.
|
5
|
-
Copyright (C) 2007-2009 Cyross Makoto
|
6
|
-
|
7
|
-
This library is free software; you can redistribute it and/or
|
8
|
-
modify it under the terms of the GNU Lesser General Public
|
9
|
-
License as published by the Free Software Foundation; either
|
10
|
-
version 2.1 of the License, or (at your option) any later version.
|
11
|
-
|
12
|
-
This library is distributed in the hope that it will be useful,
|
13
|
-
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
14
|
-
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
15
|
-
Lesser General Public License for more details.
|
16
|
-
|
17
|
-
You should have received a copy of the GNU Lesser General Public
|
18
|
-
License along with this library; if not, write to the Free Software
|
19
|
-
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
20
|
-
++
|
21
|
-
=end
|
22
|
-
|
23
|
-
module Miyako
|
24
|
-
#==ユーティリティモジュール
|
25
|
-
module Utility
|
26
|
-
def Utility.get_step_array_f(v1, v2, amount, skip_even = false) #:nodoc:
|
27
|
-
steps = []
|
28
|
-
amount = amount.abs
|
29
|
-
val = v1
|
30
|
-
if v1 < v2
|
31
|
-
loop do
|
32
|
-
val = val + amount
|
33
|
-
break if (skip_even && (v2-val).abs < Float::EPSILON)
|
34
|
-
break if val > v2
|
35
|
-
steps << val
|
36
|
-
end
|
37
|
-
else
|
38
|
-
loop do
|
39
|
-
val = val - amount
|
40
|
-
break if (skip_even && (v2-val).abs < Float::EPSILON)
|
41
|
-
break if val < v2
|
42
|
-
steps << val
|
43
|
-
end
|
44
|
-
end
|
45
|
-
return steps
|
46
|
-
end
|
47
|
-
|
48
|
-
def Utility.product_liner_inner_f(x1, y1, x2, y2, amount) #:nodoc:
|
49
|
-
array = nil
|
50
|
-
step_x = get_step_array_f(x1, x2, amount)
|
51
|
-
step_y = get_step_array_f(y1, y2, amount)
|
52
|
-
dx = x2 - x1
|
53
|
-
dy = y2 - y1
|
54
|
-
a = dx < Float::EPSILON ? dy.to_f : dy.to_f / dx.to_f
|
55
|
-
b = y1.to_f - a * x1.to_f
|
56
|
-
array = [[x1,y1] , [x2,y2]] + step_x.map{|x| [x, (a * x.to_f + b).to_i]}
|
57
|
-
array += step_y.map{|y| [((y.to_f - b) / a).to_i, y]} if (a.abs >= Float::EPSILON)
|
58
|
-
return array.uniq
|
59
|
-
end
|
60
|
-
|
61
|
-
#===矩形内の対角線の座標リストを実数で取得する
|
62
|
-
# (互換性維持のために残している)
|
63
|
-
# 矩形内の対角線の座標リストを取得する
|
64
|
-
# 引数には、Rect(x,y,w,h)形式のインスタンスを渡す
|
65
|
-
# 幅・高さはマイナスの値の設定が可能。
|
66
|
-
# 幅・高さのどちらかの値が0(Float::EPSILON未満)の場合は[]が返る
|
67
|
-
# 刻みの値は1以上の整数を渡す。0(Float::EPSILON未満)以下の場合は例外が発生する。
|
68
|
-
# 結果は[x,y]の配列となるが、正確さを優先したため、必ず刻みの値の間隔で並んでいない
|
69
|
-
#(刻みの値より小さい)ことがある
|
70
|
-
#_rect_:: 矩形情報
|
71
|
-
#_amount_:: 配列を作成する座標の刻み。デフォルトは1.0
|
72
|
-
#返却値:: 矩形左上位置[x,y]の配列(指定の矩形に掛かる位置の組み合わせ)
|
73
|
-
def Utility.product_liner_f(rect, amount = 1.0)
|
74
|
-
raise
|
75
|
-
return [] if rect[2] < Float::EPSILON || rect[3] < Float::EPSILON
|
76
|
-
x1 = rect[0]
|
77
|
-
y1 = rect[1]
|
78
|
-
x2 = x1 + rect[2] - 1
|
79
|
-
y2 = y1 + rect[3] - 1
|
80
|
-
return product_liner_inner_f(x1, y1, x2, y2, amount)
|
81
|
-
end
|
82
|
-
|
83
|
-
#===矩形内の対角線の座標リストを実数で取得する
|
84
|
-
# (互換性維持のために残している)
|
85
|
-
# 矩形内の対角線の座標リストを取得する
|
86
|
-
# 引数には、Rect(x,y,w,h)形式のインスタンスを渡す
|
87
|
-
# 幅・高さはマイナスの値の設定が可能。
|
88
|
-
# 幅・高さのどちらかの値が0(Float::EPSILON未満)の場合は[]が返る
|
89
|
-
# 刻みの値は1以上の整数を渡す。0(Float::EPSILON未満)以下の場合は例外が発生する。
|
90
|
-
# 結果は[x,y]の配列となるが、正確さを優先したため、必ず刻みの値の間隔で並んでいない
|
91
|
-
#(刻みの値より小さい)ことがある
|
92
|
-
#_rect_:: 矩形情報
|
93
|
-
#_amount_:: 配列を作成する座標の刻み。デフォルトは1
|
94
|
-
#返却値:: 矩形左上位置[x,y]の配列(指定の矩形に掛かる位置の組み合わせ)
|
95
|
-
def Utility.product_liner_by_square_f(square, amount = 1.0)
|
96
|
-
raise
|
97
|
-
return [] if (square[2] - square[0]) < Float::EPSILON || (square[3] - square[1]) < Float::EPSILON
|
98
|
-
return product_liner_inner_f(*square, amount)
|
99
|
-
end
|
100
|
-
|
101
|
-
def Utility.product_liner_inner(x1, y1, x2, y2, amount) #:nodoc:
|
102
|
-
array = nil
|
103
|
-
step_x = []
|
104
|
-
step_y = []
|
105
|
-
dx = x2 - x1
|
106
|
-
dy = y2 - y1
|
107
|
-
a = 0.0
|
108
|
-
if [x1, y1, x2, y2, amount].all?{|v| v.methods.include?(:step)}
|
109
|
-
step_x = x1 < x2 ? x1.step(x2, amount).to_a : x1.step(x2, -amount).to_a
|
110
|
-
step_y = y1 < y2 ? y1.step(y2, amount).to_a : y1.step(y2, -amount).to_a
|
111
|
-
a = dx == 0 ? dy.to_f : dy.to_f / dx.to_f
|
112
|
-
else
|
113
|
-
step_x = get_step_array_f(x1, x2, amount)
|
114
|
-
step_y = get_step_array_f(y1, y2, amount)
|
115
|
-
a = dx < Float::EPSILON ? dy.to_f : dy.to_f / dx.to_f
|
116
|
-
end
|
117
|
-
b = y1.to_f - a * x1.to_f
|
118
|
-
array = [[x1,y1] , [x2,y2]] + step_x.map{|x| [x, (a * x.to_f + b).to_i]}
|
119
|
-
array += step_y.map{|y| [((y.to_f - b) / a).to_i, y]} if (a.abs >= Float::EPSILON)
|
120
|
-
return array.uniq
|
121
|
-
end
|
122
|
-
|
123
|
-
#===矩形内の対角線の座標リストを取得する
|
124
|
-
# 矩形内の対角線の座標リストを取得する
|
125
|
-
# 引数には、Rect(x,y,w,h)形式のインスタンスを渡す
|
126
|
-
# 幅・高さはマイナスの値の設定が可能。
|
127
|
-
# 幅・高さのどちらかの値が0の場合は[]が返る
|
128
|
-
# 刻みの値は1以上の整数を渡す。0以下の場合は例外が発生する。
|
129
|
-
# 結果は[x,y]の配列となるが、正確さを優先したため、必ず刻みの値の間隔で並んでいない
|
130
|
-
#(刻みの値より小さいことがある)ことがある
|
131
|
-
#_rect_:: 矩形情報
|
132
|
-
#_amount_:: 配列を作成する座標の刻み。デフォルトは1
|
133
|
-
#返却値:: 矩形左上位置[x,y]の配列(指定の矩形に掛かる位置の組み合わせ)
|
134
|
-
def Utility.product_liner(rect, amount = 1)
|
135
|
-
raise
|
136
|
-
return [] if rect[2] == 0 || rect[3] == 0
|
137
|
-
x1 = rect[0]
|
138
|
-
y1 = rect[1]
|
139
|
-
x2 = x1 + rect[2] - 1
|
140
|
-
y2 = y1 + rect[3] - 1
|
141
|
-
return product_liner_inner(x1, y1, x2, y2, amount)
|
142
|
-
end
|
143
|
-
|
144
|
-
#===矩形内の対角線の座標リストを取得する
|
145
|
-
# 矩形内の対角線の座標リストを取得する
|
146
|
-
# 引数には、Rect(x,y,w,h)形式のインスタンスを渡す
|
147
|
-
# 幅・高さはマイナスの値の設定が可能。
|
148
|
-
# 幅・高さのどちらかの値が0の場合は[]が返る
|
149
|
-
# 刻みの値は1以上の整数を渡す。0以下の場合は例外が発生する。
|
150
|
-
# 結果は[x,y]の配列となるが、正確さを優先したため、必ず刻みの値の間隔で並んでいない
|
151
|
-
#(刻みの値より小さいことがある)ことがある
|
152
|
-
#_rect_:: 矩形情報
|
153
|
-
#_amount_:: 配列を作成する座標の刻み。デフォルトは1
|
154
|
-
#返却値:: 矩形左上位置[x,y]の配列(指定の矩形に掛かる位置の組み合わせ)
|
155
|
-
def Utility.product_liner_by_square(square, amount = 1)
|
156
|
-
raise
|
157
|
-
return [] if (square[2] - square[0]) == 0 || (square[3] - square[1]) == 0
|
158
|
-
return product_liner_inner(*square, amount)
|
159
|
-
end
|
160
|
-
|
161
|
-
def Utility.product_inner(x1, y1, x2, y2, size) #:nodoc:
|
162
|
-
x_array = ((x1 / size[0])..(x2 / size[0])).to_a.map{|e| e * size[0]}
|
163
|
-
y_array = ((y1 / size[1])..(y2 / size[1])).to_a.map{|e| e * size[1]}
|
164
|
-
return x_array.product(y_array)
|
165
|
-
end
|
166
|
-
|
167
|
-
#===指定の矩形が格子状のどこに重なっているかを返す
|
168
|
-
# position(Point([x,y])形式)を基準として、矩形rect(Rect([x,y,w,h])形式)が、格子状の並べた矩形
|
169
|
-
# (基準を[0,0]とした、大きさ[size,size]の矩形をタイル状に並べた物)にある場合、
|
170
|
-
#どの格子状の矩形が重なっているかを、矩形の左上座標の配列として渡す(x座標とy座標の組み合わせ)。
|
171
|
-
#
|
172
|
-
#_position_:: 基準位置
|
173
|
-
#_rect_:: 矩形情報
|
174
|
-
#返却値:: 矩形左上位置の配列(指定の矩形に掛かる位置の組み合わせ)
|
175
|
-
def Utility.product_position(position, rect, size)
|
176
|
-
return product_inner(
|
177
|
-
position[0] + rect[0],
|
178
|
-
position[1] + rect[1],
|
179
|
-
position[0] + rect[0] + rect[2] - 1,
|
180
|
-
position[1] + rect[1] + rect[3] - 1,
|
181
|
-
size
|
182
|
-
)
|
183
|
-
end
|
184
|
-
|
185
|
-
#===指定の矩形が格子状のどこに重なっているかを返す
|
186
|
-
# 矩形square(Square([x1,y1,x2,y2])形式)が、格子状の並べた矩形
|
187
|
-
# (基準を[0,0]とした、大きさ[size,size]の矩形をタイル状に並べた物)にある場合、
|
188
|
-
#どの格子状の矩形が重なっているかを、矩形の左上座標の配列として渡す(x座標とy座標の組み合わせ)。
|
189
|
-
#_square_:: 矩形情報
|
190
|
-
#返却値:: 矩形左上位置の配列(指定の矩形に掛かる位置の組み合わせ)
|
191
|
-
def Utility.product_position_by_square(square, size)
|
192
|
-
return product_inner(*square.to_a, size)
|
193
|
-
end
|
194
|
-
|
195
|
-
def Utility.product_inner_f(x1, y1, x2, y2, size, skip_even = false) #:nodoc:
|
196
|
-
sz = size[0].to_f
|
197
|
-
min = (x1.to_f/sz).floor.to_f * sz
|
198
|
-
x_array = [min] + get_step_array_f(min, x2.to_f, sz, skip_even)
|
199
|
-
sz = size[1].to_f
|
200
|
-
min = (y1.to_f/sz).floor.to_f * sz
|
201
|
-
y_array = [min] + get_step_array_f(min, y2.to_f, sz, skip_even)
|
202
|
-
return x_array.uniq.product(y_array.uniq)
|
203
|
-
end
|
204
|
-
|
205
|
-
#===指定の矩形が格子状のどこに重なっているかを返す(実数で指定)
|
206
|
-
#position(Point([x,y])形式)を基準として、矩形rect(Rect([x,y,w,h])形式)が、格子状の並べた矩形
|
207
|
-
#(基準を[0.0,0.0]とした、大きさ[size,size]の矩形をタイル状に並べた物)にある場合、
|
208
|
-
#どの格子状の矩形が重なっているかを、矩形の左上座標の配列として渡す(x座標とy座標の組み合わせ)。
|
209
|
-
#
|
210
|
-
#_position_:: 基準位置
|
211
|
-
#_rect_:: 矩形情報
|
212
|
-
#返却値:: 矩形左上位置の配列(指定の矩形に掛かる位置の組み合わせ)
|
213
|
-
def Utility.product_position_f(position, rect, size)
|
214
|
-
return product_inner_f(
|
215
|
-
position[0] + rect[0],
|
216
|
-
position[1] + rect[1],
|
217
|
-
position[0] + rect[0] + rect[2],
|
218
|
-
position[1] + rect[1] + rect[3],
|
219
|
-
size,
|
220
|
-
true
|
221
|
-
)
|
222
|
-
end
|
223
|
-
|
224
|
-
#===指定の矩形が格子状のどこに重なっているかを返す(実数で指定)
|
225
|
-
# 矩形square(Square([x1,y1,x2,y2])形式)が、格子状の並べた矩形
|
226
|
-
# (基準を[0.0,0.0]とした、大きさ[size,size]の矩形をタイル状に並べた物)にある場合、
|
227
|
-
#どの格子状の矩形が重なっているかを、矩形の左上座標の配列として渡す(x座標とy座標の組み合わせ)。
|
228
|
-
#_square_:: 矩形情報
|
229
|
-
#返却値:: 矩形左上位置の配列(指定の矩形に掛かる位置の組み合わせ)
|
230
|
-
def Utility.product_position_by_square_f(square, size)
|
231
|
-
return product_inner_f(*square.to_a, size)
|
232
|
-
end
|
233
|
-
|
234
|
-
|
235
|
-
#
|
236
|
-
#
|
237
|
-
#
|
238
|
-
#
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
#
|
250
|
-
#
|
251
|
-
#
|
252
|
-
#
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
return
|
263
|
-
end
|
264
|
-
|
265
|
-
|
266
|
-
#
|
267
|
-
#
|
268
|
-
#
|
269
|
-
#
|
270
|
-
#
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
nx =
|
276
|
-
nx2
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
#
|
284
|
-
#
|
285
|
-
#
|
286
|
-
#
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
return
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
#
|
303
|
-
#
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
|
328
|
-
|
329
|
-
|
330
|
-
|
331
|
-
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
|
340
|
-
|
341
|
-
|
342
|
-
|
343
|
-
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
|
358
|
-
|
359
|
-
|
360
|
-
|
361
|
-
|
362
|
-
|
363
|
-
|
364
|
-
|
365
|
-
|
366
|
-
|
367
|
-
|
368
|
-
|
369
|
-
|
370
|
-
|
371
|
-
|
372
|
-
|
373
|
-
|
374
|
-
|
375
|
-
|
376
|
-
|
377
|
-
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
|
382
|
-
|
383
|
-
|
384
|
-
|
385
|
-
|
386
|
-
|
387
|
-
|
388
|
-
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
=begin
|
3
|
+
--
|
4
|
+
Miyako v2.1
|
5
|
+
Copyright (C) 2007-2009 Cyross Makoto
|
6
|
+
|
7
|
+
This library is free software; you can redistribute it and/or
|
8
|
+
modify it under the terms of the GNU Lesser General Public
|
9
|
+
License as published by the Free Software Foundation; either
|
10
|
+
version 2.1 of the License, or (at your option) any later version.
|
11
|
+
|
12
|
+
This library is distributed in the hope that it will be useful,
|
13
|
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
14
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
15
|
+
Lesser General Public License for more details.
|
16
|
+
|
17
|
+
You should have received a copy of the GNU Lesser General Public
|
18
|
+
License along with this library; if not, write to the Free Software
|
19
|
+
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
20
|
+
++
|
21
|
+
=end
|
22
|
+
|
23
|
+
module Miyako
|
24
|
+
#==ユーティリティモジュール
|
25
|
+
module Utility
|
26
|
+
def Utility.get_step_array_f(v1, v2, amount, skip_even = false) #:nodoc:
|
27
|
+
steps = []
|
28
|
+
amount = amount.abs
|
29
|
+
val = v1
|
30
|
+
if v1 < v2
|
31
|
+
loop do
|
32
|
+
val = val + amount
|
33
|
+
break if (skip_even && (v2-val).abs < Float::EPSILON)
|
34
|
+
break if val > v2
|
35
|
+
steps << val
|
36
|
+
end
|
37
|
+
else
|
38
|
+
loop do
|
39
|
+
val = val - amount
|
40
|
+
break if (skip_even && (v2-val).abs < Float::EPSILON)
|
41
|
+
break if val < v2
|
42
|
+
steps << val
|
43
|
+
end
|
44
|
+
end
|
45
|
+
return steps
|
46
|
+
end
|
47
|
+
|
48
|
+
def Utility.product_liner_inner_f(x1, y1, x2, y2, amount) #:nodoc:
|
49
|
+
array = nil
|
50
|
+
step_x = get_step_array_f(x1, x2, amount)
|
51
|
+
step_y = get_step_array_f(y1, y2, amount)
|
52
|
+
dx = x2 - x1
|
53
|
+
dy = y2 - y1
|
54
|
+
a = dx < Float::EPSILON ? dy.to_f : dy.to_f / dx.to_f
|
55
|
+
b = y1.to_f - a * x1.to_f
|
56
|
+
array = [[x1,y1] , [x2,y2]] + step_x.map{|x| [x, (a * x.to_f + b).to_i]}
|
57
|
+
array += step_y.map{|y| [((y.to_f - b) / a).to_i, y]} if (a.abs >= Float::EPSILON)
|
58
|
+
return array.uniq
|
59
|
+
end
|
60
|
+
|
61
|
+
#===矩形内の対角線の座標リストを実数で取得する
|
62
|
+
# (互換性維持のために残している)
|
63
|
+
# 矩形内の対角線の座標リストを取得する
|
64
|
+
# 引数には、Rect(x,y,w,h)形式のインスタンスを渡す
|
65
|
+
# 幅・高さはマイナスの値の設定が可能。
|
66
|
+
# 幅・高さのどちらかの値が0(Float::EPSILON未満)の場合は[]が返る
|
67
|
+
# 刻みの値は1以上の整数を渡す。0(Float::EPSILON未満)以下の場合は例外が発生する。
|
68
|
+
# 結果は[x,y]の配列となるが、正確さを優先したため、必ず刻みの値の間隔で並んでいない
|
69
|
+
#(刻みの値より小さい)ことがある
|
70
|
+
#_rect_:: 矩形情報
|
71
|
+
#_amount_:: 配列を作成する座標の刻み。デフォルトは1.0
|
72
|
+
#返却値:: 矩形左上位置[x,y]の配列(指定の矩形に掛かる位置の組み合わせ)
|
73
|
+
def Utility.product_liner_f(rect, amount = 1.0)
|
74
|
+
raise MiyakoValueError, "Illegal amount! #{amount}" if amount < Float::EPSILON
|
75
|
+
return [] if rect[2] < Float::EPSILON || rect[3] < Float::EPSILON
|
76
|
+
x1 = rect[0]
|
77
|
+
y1 = rect[1]
|
78
|
+
x2 = x1 + rect[2] - 1
|
79
|
+
y2 = y1 + rect[3] - 1
|
80
|
+
return product_liner_inner_f(x1, y1, x2, y2, amount)
|
81
|
+
end
|
82
|
+
|
83
|
+
#===矩形内の対角線の座標リストを実数で取得する
|
84
|
+
# (互換性維持のために残している)
|
85
|
+
# 矩形内の対角線の座標リストを取得する
|
86
|
+
# 引数には、Rect(x,y,w,h)形式のインスタンスを渡す
|
87
|
+
# 幅・高さはマイナスの値の設定が可能。
|
88
|
+
# 幅・高さのどちらかの値が0(Float::EPSILON未満)の場合は[]が返る
|
89
|
+
# 刻みの値は1以上の整数を渡す。0(Float::EPSILON未満)以下の場合は例外が発生する。
|
90
|
+
# 結果は[x,y]の配列となるが、正確さを優先したため、必ず刻みの値の間隔で並んでいない
|
91
|
+
#(刻みの値より小さい)ことがある
|
92
|
+
#_rect_:: 矩形情報
|
93
|
+
#_amount_:: 配列を作成する座標の刻み。デフォルトは1
|
94
|
+
#返却値:: 矩形左上位置[x,y]の配列(指定の矩形に掛かる位置の組み合わせ)
|
95
|
+
def Utility.product_liner_by_square_f(square, amount = 1.0)
|
96
|
+
raise MiyakoValueError, "Illegal amount! #{amount}" if amount < Float::EPSILON
|
97
|
+
return [] if (square[2] - square[0]) < Float::EPSILON || (square[3] - square[1]) < Float::EPSILON
|
98
|
+
return product_liner_inner_f(*square, amount)
|
99
|
+
end
|
100
|
+
|
101
|
+
def Utility.product_liner_inner(x1, y1, x2, y2, amount) #:nodoc:
|
102
|
+
array = nil
|
103
|
+
step_x = []
|
104
|
+
step_y = []
|
105
|
+
dx = x2 - x1
|
106
|
+
dy = y2 - y1
|
107
|
+
a = 0.0
|
108
|
+
if [x1, y1, x2, y2, amount].all?{|v| v.methods.include?(:step)}
|
109
|
+
step_x = x1 < x2 ? x1.step(x2, amount).to_a : x1.step(x2, -amount).to_a
|
110
|
+
step_y = y1 < y2 ? y1.step(y2, amount).to_a : y1.step(y2, -amount).to_a
|
111
|
+
a = dx == 0 ? dy.to_f : dy.to_f / dx.to_f
|
112
|
+
else
|
113
|
+
step_x = get_step_array_f(x1, x2, amount)
|
114
|
+
step_y = get_step_array_f(y1, y2, amount)
|
115
|
+
a = dx < Float::EPSILON ? dy.to_f : dy.to_f / dx.to_f
|
116
|
+
end
|
117
|
+
b = y1.to_f - a * x1.to_f
|
118
|
+
array = [[x1,y1] , [x2,y2]] + step_x.map{|x| [x, (a * x.to_f + b).to_i]}
|
119
|
+
array += step_y.map{|y| [((y.to_f - b) / a).to_i, y]} if (a.abs >= Float::EPSILON)
|
120
|
+
return array.uniq
|
121
|
+
end
|
122
|
+
|
123
|
+
#===矩形内の対角線の座標リストを取得する
|
124
|
+
# 矩形内の対角線の座標リストを取得する
|
125
|
+
# 引数には、Rect(x,y,w,h)形式のインスタンスを渡す
|
126
|
+
# 幅・高さはマイナスの値の設定が可能。
|
127
|
+
# 幅・高さのどちらかの値が0の場合は[]が返る
|
128
|
+
# 刻みの値は1以上の整数を渡す。0以下の場合は例外が発生する。
|
129
|
+
# 結果は[x,y]の配列となるが、正確さを優先したため、必ず刻みの値の間隔で並んでいない
|
130
|
+
#(刻みの値より小さいことがある)ことがある
|
131
|
+
#_rect_:: 矩形情報
|
132
|
+
#_amount_:: 配列を作成する座標の刻み。デフォルトは1
|
133
|
+
#返却値:: 矩形左上位置[x,y]の配列(指定の矩形に掛かる位置の組み合わせ)
|
134
|
+
def Utility.product_liner(rect, amount = 1)
|
135
|
+
raise MiyakoValueError, "Illegal amount! #{amount}" if amount <= 0
|
136
|
+
return [] if rect[2] == 0 || rect[3] == 0
|
137
|
+
x1 = rect[0]
|
138
|
+
y1 = rect[1]
|
139
|
+
x2 = x1 + rect[2] - 1
|
140
|
+
y2 = y1 + rect[3] - 1
|
141
|
+
return product_liner_inner(x1, y1, x2, y2, amount)
|
142
|
+
end
|
143
|
+
|
144
|
+
#===矩形内の対角線の座標リストを取得する
|
145
|
+
# 矩形内の対角線の座標リストを取得する
|
146
|
+
# 引数には、Rect(x,y,w,h)形式のインスタンスを渡す
|
147
|
+
# 幅・高さはマイナスの値の設定が可能。
|
148
|
+
# 幅・高さのどちらかの値が0の場合は[]が返る
|
149
|
+
# 刻みの値は1以上の整数を渡す。0以下の場合は例外が発生する。
|
150
|
+
# 結果は[x,y]の配列となるが、正確さを優先したため、必ず刻みの値の間隔で並んでいない
|
151
|
+
#(刻みの値より小さいことがある)ことがある
|
152
|
+
#_rect_:: 矩形情報
|
153
|
+
#_amount_:: 配列を作成する座標の刻み。デフォルトは1
|
154
|
+
#返却値:: 矩形左上位置[x,y]の配列(指定の矩形に掛かる位置の組み合わせ)
|
155
|
+
def Utility.product_liner_by_square(square, amount = 1)
|
156
|
+
raise MiyakoValueError, "Illegal amount! #{amount}" if amount <= 0
|
157
|
+
return [] if (square[2] - square[0]) == 0 || (square[3] - square[1]) == 0
|
158
|
+
return product_liner_inner(*square, amount)
|
159
|
+
end
|
160
|
+
|
161
|
+
def Utility.product_inner(x1, y1, x2, y2, size) #:nodoc:
|
162
|
+
x_array = ((x1 / size[0])..(x2 / size[0])).to_a.map{|e| e * size[0]}
|
163
|
+
y_array = ((y1 / size[1])..(y2 / size[1])).to_a.map{|e| e * size[1]}
|
164
|
+
return x_array.product(y_array)
|
165
|
+
end
|
166
|
+
|
167
|
+
#===指定の矩形が格子状のどこに重なっているかを返す
|
168
|
+
# position(Point([x,y])形式)を基準として、矩形rect(Rect([x,y,w,h])形式)が、格子状の並べた矩形
|
169
|
+
# (基準を[0,0]とした、大きさ[size,size]の矩形をタイル状に並べた物)にある場合、
|
170
|
+
#どの格子状の矩形が重なっているかを、矩形の左上座標の配列として渡す(x座標とy座標の組み合わせ)。
|
171
|
+
#
|
172
|
+
#_position_:: 基準位置
|
173
|
+
#_rect_:: 矩形情報
|
174
|
+
#返却値:: 矩形左上位置の配列(指定の矩形に掛かる位置の組み合わせ)
|
175
|
+
def Utility.product_position(position, rect, size)
|
176
|
+
return product_inner(
|
177
|
+
position[0] + rect[0],
|
178
|
+
position[1] + rect[1],
|
179
|
+
position[0] + rect[0] + rect[2] - 1,
|
180
|
+
position[1] + rect[1] + rect[3] - 1,
|
181
|
+
size
|
182
|
+
)
|
183
|
+
end
|
184
|
+
|
185
|
+
#===指定の矩形が格子状のどこに重なっているかを返す
|
186
|
+
# 矩形square(Square([x1,y1,x2,y2])形式)が、格子状の並べた矩形
|
187
|
+
# (基準を[0,0]とした、大きさ[size,size]の矩形をタイル状に並べた物)にある場合、
|
188
|
+
#どの格子状の矩形が重なっているかを、矩形の左上座標の配列として渡す(x座標とy座標の組み合わせ)。
|
189
|
+
#_square_:: 矩形情報
|
190
|
+
#返却値:: 矩形左上位置の配列(指定の矩形に掛かる位置の組み合わせ)
|
191
|
+
def Utility.product_position_by_square(square, size)
|
192
|
+
return product_inner(*square.to_a, size)
|
193
|
+
end
|
194
|
+
|
195
|
+
def Utility.product_inner_f(x1, y1, x2, y2, size, skip_even = false) #:nodoc:
|
196
|
+
sz = size[0].to_f
|
197
|
+
min = (x1.to_f/sz).floor.to_f * sz
|
198
|
+
x_array = [min] + get_step_array_f(min, x2.to_f, sz, skip_even)
|
199
|
+
sz = size[1].to_f
|
200
|
+
min = (y1.to_f/sz).floor.to_f * sz
|
201
|
+
y_array = [min] + get_step_array_f(min, y2.to_f, sz, skip_even)
|
202
|
+
return x_array.uniq.product(y_array.uniq)
|
203
|
+
end
|
204
|
+
|
205
|
+
#===指定の矩形が格子状のどこに重なっているかを返す(実数で指定)
|
206
|
+
#position(Point([x,y])形式)を基準として、矩形rect(Rect([x,y,w,h])形式)が、格子状の並べた矩形
|
207
|
+
#(基準を[0.0,0.0]とした、大きさ[size,size]の矩形をタイル状に並べた物)にある場合、
|
208
|
+
#どの格子状の矩形が重なっているかを、矩形の左上座標の配列として渡す(x座標とy座標の組み合わせ)。
|
209
|
+
#
|
210
|
+
#_position_:: 基準位置
|
211
|
+
#_rect_:: 矩形情報
|
212
|
+
#返却値:: 矩形左上位置の配列(指定の矩形に掛かる位置の組み合わせ)
|
213
|
+
def Utility.product_position_f(position, rect, size)
|
214
|
+
return product_inner_f(
|
215
|
+
position[0] + rect[0],
|
216
|
+
position[1] + rect[1],
|
217
|
+
position[0] + rect[0] + rect[2],
|
218
|
+
position[1] + rect[1] + rect[3],
|
219
|
+
size,
|
220
|
+
true
|
221
|
+
)
|
222
|
+
end
|
223
|
+
|
224
|
+
#===指定の矩形が格子状のどこに重なっているかを返す(実数で指定)
|
225
|
+
# 矩形square(Square([x1,y1,x2,y2])形式)が、格子状の並べた矩形
|
226
|
+
# (基準を[0.0,0.0]とした、大きさ[size,size]の矩形をタイル状に並べた物)にある場合、
|
227
|
+
#どの格子状の矩形が重なっているかを、矩形の左上座標の配列として渡す(x座標とy座標の組み合わせ)。
|
228
|
+
#_square_:: 矩形情報
|
229
|
+
#返却値:: 矩形左上位置の配列(指定の矩形に掛かる位置の組み合わせ)
|
230
|
+
def Utility.product_position_by_square_f(square, size)
|
231
|
+
return product_inner_f(*square.to_a, size)
|
232
|
+
end
|
233
|
+
|
234
|
+
#===2点間の距離を算出する
|
235
|
+
# 2点(点1、点2)がどの程度離れているかを算出する。
|
236
|
+
# 返ってくる値は、正の実数で返ってくる
|
237
|
+
#_point1_:: 点1の位置(Point/Rect/Square構造体、2要素以上の配列、もしくはx,yメソッドを持つインスタンス)
|
238
|
+
#_point2_:: 点2の位置(Point/Rect/Square構造体、2要素以上の配列、もしくはx,yメソッドを持つインスタンス)
|
239
|
+
#返却値:: 2点間の距離
|
240
|
+
def Utility.interval(point1, point2)
|
241
|
+
#2点間の距離を求める
|
242
|
+
d = Math.sqrt(((point1[0].to_f - point2[0].to_f) ** 2) +
|
243
|
+
((point1[1].to_f - point2[1].to_f) ** 2))
|
244
|
+
return d < Float::EPSILON ? 0.0 : d
|
245
|
+
end
|
246
|
+
|
247
|
+
#===2点間の傾きを角度で算出する
|
248
|
+
# 2点(点1、点2)がどの程度傾いているか算出する。傾きの中心は点1とする。
|
249
|
+
# 角度の単位は度(0.0<=θ<360.0)
|
250
|
+
# 返ってくる値は、正の実数で返ってくる
|
251
|
+
#_point1_:: 点1の位置(Point/Rect/Square構造体、2要素以上の配列、もしくはx,yメソッドを持つインスタンス)
|
252
|
+
#_point2_:: 点2の位置(Point/Rect/Square構造体、2要素以上の配列、もしくはx,yメソッドを持つインスタンス)
|
253
|
+
#返却値:: 2点間の傾き
|
254
|
+
def Utility.theta(point1, point2)
|
255
|
+
#2点間の距離を求める
|
256
|
+
d = Math.sqrt(((point1[0].to_f - point2[0].to_f) ** 2) +
|
257
|
+
((point1[1].to_f - point2[1].to_f) ** 2))
|
258
|
+
x = point2[0].to_f - point[1].to_f
|
259
|
+
# 傾き・幅が0のときは傾きは0度
|
260
|
+
return 0.0 if (x.abs < Float::EPSILON or d < Float::EPSILON)
|
261
|
+
theta = (Math.acos(x / d) / (2 * Math::PI)) * 360.0
|
262
|
+
return theta < Float::EPSILON ? 0.0 : theta
|
263
|
+
end
|
264
|
+
|
265
|
+
#===小線分を移動させたとき、大線分が範囲内かどうかを判別する
|
266
|
+
# 移動後の小線分が大線分の範囲内にあるかどうかをtrue/falseで取得する
|
267
|
+
#_mini_segment_:: 小線分の範囲。[min,max]で構成された2要素の配列
|
268
|
+
#_big_segment_:: 大線分の範囲。[min,max]で構成された2要素の配列
|
269
|
+
#_d_:: mini_segmentの移動量
|
270
|
+
#_flag_:: 大線分の端いっぱいも範囲外に含めるときはtrueを設定する。デフォルトはfalse
|
271
|
+
#返却値:: 範囲内のときはtrue、範囲外の時はfalseを返す
|
272
|
+
def Utility.in_bounds?(mini_segment, big_segment, d, flag = false)
|
273
|
+
nx = mini_segment[0] + d
|
274
|
+
nx2 = mini_segment[1] + d
|
275
|
+
nx, nx2 = nx2, nx if nx > nx2
|
276
|
+
return flag ? (nx >= big_segment[0] && nx2 <= big_segment[1]) : (nx > big_segment[0] && (nx2 - 1) < big_segment[1])
|
277
|
+
end
|
278
|
+
|
279
|
+
#===小線分を移動させたとき、大線分が範囲内かどうかを判別して、その状態によって値を整数で返す
|
280
|
+
# 移動後の小線分の範囲が大線分の範囲内のときは0、
|
281
|
+
# マイナス方向で範囲外に出るときは-1、
|
282
|
+
# プラス方向で出るときは1を返す
|
283
|
+
#_mini_segment_:: 小線分の範囲。[min,max]で構成された2要素の配列
|
284
|
+
#_big_segment_:: 大線分の範囲。[min,max]で構成された2要素の配列
|
285
|
+
#_d_:: mini_segmentの移動量
|
286
|
+
#_flag_:: 大線分の端いっぱいも範囲外に含めるときはtrueを設定する。デフォルトはfalse
|
287
|
+
#返却値:: 判別の結果
|
288
|
+
def Utility.in_bounds_ex?(mini_segment, big_segment, d, flag = false)
|
289
|
+
nx = mini_segment[0] + d
|
290
|
+
nx2 = mini_segment[1] + d - 1
|
291
|
+
nx, nx2 = nx2, nx if nx > nx2
|
292
|
+
return -1 if (nx < big_segment[0]) || (flag && (nx == big_segment[0]))
|
293
|
+
return (nx2 > big_segment[1]) || (flag && (nx2 == big_segment[1])) ? 1 : 0
|
294
|
+
end
|
295
|
+
|
296
|
+
#===移動先が表示範囲内かどうかを判別して、その状態によって値を整数で返す
|
297
|
+
# 移動後の小線分の範囲が大線分の範囲内のときは0、
|
298
|
+
# マイナス方向で範囲外に出るときは1、
|
299
|
+
# プラス方向で出るときは-1を返す
|
300
|
+
#_mini_segment_:: 小線分の範囲。[min,max]で構成された2要素の配列
|
301
|
+
#_big_segment_:: 大線分の範囲。[min,max]で構成された2要素の配列
|
302
|
+
#_d_:: mini_segmentの移動量
|
303
|
+
#_flag_:: 大線分の端いっぱいも範囲外に含めるときはtrueを設定する。デフォルトはfalse
|
304
|
+
#返却値:: 判別の結果
|
305
|
+
def Utility.in_bounds_rev?(mini_segment, big_segment, d, flag = false)
|
306
|
+
nx = mini_segment[0] + d
|
307
|
+
nx2 = mini_segment[1] + d - 1
|
308
|
+
nx, nx2 = nx2, nx if nx > nx2
|
309
|
+
return 1 if (nx < big_segment[0]) || (flag && (nx == big_segment[0]))
|
310
|
+
return (nx2 > big_segment[1]) || (flag && (nx2 == big_segment[1])) ? -1 : 0
|
311
|
+
end
|
312
|
+
|
313
|
+
#===移動先が表示範囲内かどうかを判別して、その状態によって値を整数で返す
|
314
|
+
# 移動量が0のときは0、
|
315
|
+
# 移動後の小線分の範囲が大線分の範囲内のときは1、
|
316
|
+
# 範囲外に出るときは-1を返す
|
317
|
+
#_mini_segment_:: 小線分の範囲。[min,max]で構成された2要素の配列
|
318
|
+
#_big_segment_:: 大線分の範囲。[min,max]で構成された2要素の配列
|
319
|
+
#_d_:: mini_segmentの移動量
|
320
|
+
#_flag_:: 大線分の端いっぱいも範囲外に含めるときはtrueを設定する。デフォルトはfalse
|
321
|
+
#返却値:: 判別の結果
|
322
|
+
def Utility.in_bounds_rev_ex?(mini_segment, big_segment, d, flag = false)
|
323
|
+
return 0 if d == 0
|
324
|
+
dir = (d <=> 0)
|
325
|
+
nx = mini_segment[0] + d
|
326
|
+
nx2 = mini_segment[1] + d - 1
|
327
|
+
nx, nx2 = nx2, nx if nx > nx2
|
328
|
+
return -dir if (nx < big_segment[0]) || (flag && (nx == big_segment[0]))
|
329
|
+
return (nx2 > big_segment[1]) || (flag && (nx2 == big_segment[1])) ? -dir : dir
|
330
|
+
end
|
331
|
+
|
332
|
+
#===小線分を移動させたとき、大線分が範囲内かどうかを判別する
|
333
|
+
# 移動後の小線分が大線分の範囲内にあるかどうかをtrue/falseで取得する
|
334
|
+
#_mini_pos_:: 小線分の開始点の位置
|
335
|
+
#_mini_size_:: 小線分の幅。0以上の整数
|
336
|
+
#_big_pos_:: 大線分の開始点の位置
|
337
|
+
#_big_size_:: 大線分の幅。1以上の整数
|
338
|
+
#_d_:: mini_segmentの移動量
|
339
|
+
#_flag_:: 大線分の端いっぱいも範囲外に含めるときはtrueを設定する。デフォルトはfalse
|
340
|
+
#返却値:: 範囲内のときはtrue、範囲外の時はfalseを返す
|
341
|
+
def Utility.in_bounds_by_size?(pos1, size1, pos2, size2, d, flag = false)
|
342
|
+
raise MiyakoValueError, "illegal size1! #{size1}" if size1 < 0
|
343
|
+
raise MiyakoValueError, "illegal size2! #{size2}" if size2 <= 0
|
344
|
+
raise MiyakoValueError, "size1 is more than size2! #{size1}, #{size2}" if size1 > size2
|
345
|
+
min_x1 = pos1 + d
|
346
|
+
min_x2 = pos1 + size1 + d
|
347
|
+
min_x1, min_x2 = min_x2, min_x1 if min_x1 > min_x2
|
348
|
+
return flag ? (min_x1 >= pos2 && min_x2 <= pos2+size2) : (minx_x1 > pos2 && min_x2 < pos2+size2)
|
349
|
+
end
|
350
|
+
|
351
|
+
#===小線分を移動させたとき、大線分が範囲内かどうかを判別して、その状態によって値を整数で返す
|
352
|
+
# 移動後の小線分の範囲が大線分の範囲内のときは0、
|
353
|
+
# マイナス方向で範囲外に出るときは-1、
|
354
|
+
# プラス方向で出るときは1を返す
|
355
|
+
#_mini_pos_:: 小線分の開始点の位置
|
356
|
+
#_mini_size_:: 小線分の幅。0以上の整数
|
357
|
+
#_big_pos_:: 大線分の開始点の位置
|
358
|
+
#_big_size_:: 大線分の幅。1以上の整数
|
359
|
+
#_d_:: mini_segmentの移動量
|
360
|
+
#_flag_:: 大線分の端いっぱいも範囲外に含めるときはtrueを設定する。デフォルトはfalse
|
361
|
+
#返却値:: 判別の結果
|
362
|
+
def Utility.in_bounds_ex_by_size?(pos1, size1, pos2, size2, d, flag = false)
|
363
|
+
raise MiyakoValueError, "illegal size1! #{size1}" if size1 < 0
|
364
|
+
raise MiyakoValueError, "illegal size2! #{size2}" if size2 <= 0
|
365
|
+
raise MiyakoValueError, "size1 is more than size2! #{size1}, #{size2}" if size1 > size2
|
366
|
+
min_x1 = pos1 + d
|
367
|
+
min_x2 = pos1 + size1 + d
|
368
|
+
min_x1, min_x2 = min_x2, min_x1 if min_x1 > min_x2
|
369
|
+
return -1 if (min_x1 < pos2) || (flag && (min_x1 == pos2))
|
370
|
+
return (min_x2 > pos2+size2) || (flag && (min_x2 == pos2+size2)) ? 1 : 0
|
371
|
+
end
|
372
|
+
|
373
|
+
#===移動先が表示範囲内かどうかを判別して、その状態によって値を整数で返す
|
374
|
+
# 移動後の小線分の範囲が大線分の範囲内のときは0、
|
375
|
+
# マイナス方向で範囲外に出るときは1、
|
376
|
+
# プラス方向で出るときは-1を返す
|
377
|
+
#_mini_pos_:: 小線分の開始点の位置
|
378
|
+
#_mini_size_:: 小線分の幅。0以上の整数
|
379
|
+
#_big_pos_:: 大線分の開始点の位置
|
380
|
+
#_big_size_:: 大線分の幅。1以上の整数
|
381
|
+
#_d_:: mini_segmentの移動量
|
382
|
+
#_flag_:: 大線分の端いっぱいも範囲外に含めるときはtrueを設定する。デフォルトはfalse
|
383
|
+
#返却値:: 判別の結果
|
384
|
+
def Utility.in_bounds_rev_by_size?(pos1, size1, pos2, size2, d, flag = false)
|
385
|
+
raise MiyakoValueError, "illegal size1! #{size1}" if size1 < 0
|
386
|
+
raise MiyakoValueError, "illegal size2! #{size2}" if size2 <= 0
|
387
|
+
raise MiyakoValueError, "size1 is more than size2! #{size1}, #{size2}" if size1 > size2
|
388
|
+
min_x1 = pos1 + d
|
389
|
+
min_x2 = pos1 + size1 + d
|
390
|
+
min_x1, min_x2 = min_x2, min_x1 if min_x1 > min_x2
|
391
|
+
return 1 if (min_x1 < pos2) || (flag && (min_x1 == pos2))
|
392
|
+
return (min_x2 > pos2+size2) || (flag && (min_x2 == pos2+size2)) ? -1 : 0
|
393
|
+
end
|
394
|
+
|
395
|
+
#===移動先が表示範囲内かどうかを判別して、その状態によって値を整数で返す
|
396
|
+
# 移動量が0のときは0、
|
397
|
+
# 移動後の小線分の範囲が大線分の範囲内のときは1、
|
398
|
+
# 範囲外に出るときは-1を返す
|
399
|
+
#_mini_pos_:: 小線分の開始点の位置
|
400
|
+
#_mini_size_:: 小線分の幅。0以上の整数
|
401
|
+
#_big_pos_:: 大線分の開始点の位置
|
402
|
+
#_big_size_:: 大線分の幅。1以上の整数
|
403
|
+
#_d_:: mini_segmentの移動量
|
404
|
+
#_flag_:: 大線分の端いっぱいも範囲外に含めるときはtrueを設定する。デフォルトはfalse
|
405
|
+
#返却値:: 判別の結果
|
406
|
+
def Utility.in_bounds_rev_ex_by_size?(pos1, size1, pos2, size2, d, flag = false)
|
407
|
+
return 0 if d == 0
|
408
|
+
raise MiyakoValueError, "illegal size1! #{size1}" if size1 < 0
|
409
|
+
raise MiyakoValueError, "illegal size2! #{size2}" if size2 <= 0
|
410
|
+
raise MiyakoValueError, "size1 is more than size2! #{size1}, #{size2}" if size1 > size2
|
411
|
+
dir = (d <=> 0)
|
412
|
+
min_x1 = pos1 + d
|
413
|
+
min_x2 = pos1 + size1 + d
|
414
|
+
min_x1, min_x2 = min_x2, min_x1 if min_x1 > min_x2
|
415
|
+
return -dir if (min_x1 < pos2) || (flag && (min_x1 == pos2))
|
416
|
+
return (min_x2 > pos2+size2) || (flag && (min_x2 == pos2+size2)) ? -dir : dir
|
417
|
+
end
|
418
|
+
end
|
419
|
+
end
|