cyross-ruby-miyako 2.0.5.1 → 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.
Files changed (91) hide show
  1. data/README +1092 -929
  2. data/Rakefile +7 -7
  3. data/defines.h +144 -144
  4. data/extern.h +29 -29
  5. data/install_miyako.rb +87 -87
  6. data/lib/Miyako/API/audio.rb +572 -198
  7. data/lib/Miyako/API/basic_data.rb +825 -573
  8. data/lib/Miyako/API/bitmap.rb +534 -507
  9. data/lib/Miyako/API/choices.rb +481 -475
  10. data/lib/Miyako/API/collision.rb +486 -460
  11. data/lib/Miyako/API/diagram.rb +586 -561
  12. data/lib/Miyako/API/drawing.rb +151 -151
  13. data/lib/Miyako/API/exceptions.rb +105 -0
  14. data/lib/Miyako/API/fixedmap.rb +462 -428
  15. data/lib/Miyako/API/font.rb +430 -403
  16. data/lib/Miyako/API/input.rb +456 -447
  17. data/lib/Miyako/API/layout.rb +636 -433
  18. data/lib/Miyako/API/map.rb +583 -529
  19. data/lib/Miyako/API/map_event.rb +222 -198
  20. data/lib/Miyako/API/modules.rb +357 -109
  21. data/lib/Miyako/API/movie.rb +166 -154
  22. data/lib/Miyako/API/parts.rb +276 -189
  23. data/lib/Miyako/API/plane.rb +205 -166
  24. data/lib/Miyako/API/screen.rb +341 -325
  25. data/lib/Miyako/API/shape.rb +443 -443
  26. data/lib/Miyako/API/sprite.rb +771 -752
  27. data/lib/Miyako/API/sprite_animation.rb +490 -481
  28. data/lib/Miyako/API/sprite_list.rb +1135 -0
  29. data/lib/Miyako/API/spriteunit.rb +168 -147
  30. data/lib/Miyako/API/story.rb +350 -300
  31. data/lib/Miyako/API/textbox.rb +770 -725
  32. data/lib/Miyako/API/utility.rb +419 -388
  33. data/lib/Miyako/API/viewport.rb +189 -139
  34. data/lib/Miyako/API/yuki.rb +1226 -996
  35. data/lib/Miyako/EXT/miyako_cairo.rb +62 -62
  36. data/lib/Miyako/EXT/raster_scroll.rb +138 -138
  37. data/lib/Miyako/EXT/slides.rb +157 -157
  38. data/lib/Miyako/miyako.rb +201 -171
  39. data/lib/Miyako/miyako_require_only.rb +35 -0
  40. data/miyako_basicdata.c +590 -590
  41. data/miyako_bitmap.c +1225 -1225
  42. data/miyako_collision.c +403 -403
  43. data/miyako_drawing.c +187 -187
  44. data/miyako_font.c +334 -334
  45. data/miyako_hsv.c +830 -830
  46. data/miyako_input_audio.c +254 -0
  47. data/miyako_layout.c +191 -191
  48. data/miyako_no_katana.c +1078 -1074
  49. data/miyako_sprite2.c +431 -0
  50. data/miyako_transform.c +438 -438
  51. data/miyako_utility.c +288 -288
  52. data/sample/Animation1/m1ku.rb +68 -68
  53. data/sample/Animation2/lex.rb +96 -96
  54. data/sample/Diagram_sample/diagram_sample_yuki2.rb +328 -386
  55. data/sample/Room3/blue.rb +297 -297
  56. data/sample/Room3/ending.rb +180 -180
  57. data/sample/Room3/green.rb +220 -220
  58. data/sample/Room3/main.rb +119 -119
  59. data/sample/Room3/main_component.rb +59 -59
  60. data/sample/Room3/red.rb +227 -227
  61. data/sample/Room3/room3.rb +25 -27
  62. data/sample/Room3/title.rb +184 -184
  63. data/sample/ball_action_sample.rb +204 -204
  64. data/sample/blit_rop.rb +70 -70
  65. data/sample/cairo_sample.rb +25 -25
  66. data/sample/circle_collision_test.rb +66 -66
  67. data/sample/collision_test.rb +33 -33
  68. data/sample/collision_test2.rb +108 -108
  69. data/sample/fixed_map_test/fixed_map_sample.rb +140 -140
  70. data/sample/fixed_map_test/readme.txt +72 -72
  71. data/sample/map_test/chara.rb +58 -58
  72. data/sample/map_test/main_parts.rb +69 -69
  73. data/sample/map_test/main_scene.rb +153 -153
  74. data/sample/map_test/map_manager.rb +75 -75
  75. data/sample/map_test/map_test.rb +23 -23
  76. data/sample/map_test/oasis.rb +71 -71
  77. data/sample/map_test/readme.txt +89 -89
  78. data/sample/map_test/route.rb +157 -157
  79. data/sample/map_test/town.rb +74 -74
  80. data/sample/polygon_test.rb +35 -35
  81. data/sample/rasterscroll.rb +24 -24
  82. data/sample/takahashi.rb +42 -42
  83. data/sample/textbox_sample.rb +189 -189
  84. data/sample/transform.rb +54 -54
  85. data/sample/utility_test.rb +73 -73
  86. data/sample/utility_test2.rb +61 -61
  87. data/sample/utility_test3.rb +64 -64
  88. data/sample/utility_test4.rb +73 -73
  89. data/uninstall_miyako.rb +19 -19
  90. data/win/miyako_no_katana.so +0 -0
  91. metadata +7 -2
@@ -1,388 +1,419 @@
1
- # -*- encoding: utf-8 -*-
2
- =begin
3
- --
4
- Miyako v2.0
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 MiyakoError, "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 MiyakoError, "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 MiyakoError, "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 MiyakoError, "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
- #===小線分を移動させたとき、大線分が範囲内かどうかを判別する
235
- # 移動後の小線分が大線分の範囲内にあるかどうかをtrue/falseで取得する
236
- #_mini_segment_:: 小線分の範囲。[min,max]で構成された2要素の配列
237
- #_big_segment_:: 大線分の範囲。[min,max]で構成された2要素の配列
238
- #_d_:: mini_segmentの移動量
239
- #_flag_:: 大線分の端いっぱいも範囲外に含めるときはtrueを設定する。デフォルトはfalse
240
- #返却値:: 範囲内のときはtrue、範囲外の時はfalseを返す
241
- def Utility.in_bounds?(mini_segment, big_segment, d, flag = false)
242
- nx = mini_segment[0] + d
243
- nx2 = mini_segment[1] + d
244
- nx, nx2 = nx2, nx if nx > nx2
245
- return flag ? (nx >= big_segment[0] && nx2 <= big_segment[1]) : (nx > big_segment[0] && (nx2 - 1) < big_segment[1])
246
- end
247
-
248
- #===小線分を移動させたとき、大線分が範囲内かどうかを判別して、その状態によって値を整数で返す
249
- # 移動後の小線分の範囲が大線分の範囲内のときは0
250
- # マイナス方向で範囲外に出るときは-1、
251
- # プラス方向で出るときは1を返す
252
- #_mini_segment_:: 小線分の範囲。[min,max]で構成された2要素の配列
253
- #_big_segment_:: 大線分の範囲。[min,max]で構成された2要素の配列
254
- #_d_:: mini_segmentの移動量
255
- #_flag_:: 大線分の端いっぱいも範囲外に含めるときはtrueを設定する。デフォルトはfalse
256
- #返却値:: 判別の結果
257
- def Utility.in_bounds_ex?(mini_segment, big_segment, d, flag = false)
258
- nx = mini_segment[0] + d
259
- nx2 = mini_segment[1] + d - 1
260
- nx, nx2 = nx2, nx if nx > nx2
261
- return -1 if (nx < big_segment[0]) || (flag && (nx == big_segment[0]))
262
- return (nx2 > big_segment[1]) || (flag && (nx2 == big_segment[1])) ? 1 : 0
263
- end
264
-
265
- #===移動先が表示範囲内かどうかを判別して、その状態によって値を整数で返す
266
- # 移動後の小線分の範囲が大線分の範囲内のときは0、
267
- # マイナス方向で範囲外に出るときは1、
268
- # プラス方向で出るときは-1を返す
269
- #_mini_segment_:: 小線分の範囲。[min,max]で構成された2要素の配列
270
- #_big_segment_:: 大線分の範囲。[min,max]で構成された2要素の配列
271
- #_d_:: mini_segmentの移動量
272
- #_flag_:: 大線分の端いっぱいも範囲外に含めるときはtrueを設定する。デフォルトはfalse
273
- #返却値:: 判別の結果
274
- def Utility.in_bounds_rev?(mini_segment, big_segment, d, flag = false)
275
- nx = mini_segment[0] + d
276
- nx2 = mini_segment[1] + d - 1
277
- nx, nx2 = nx2, nx if nx > nx2
278
- return 1 if (nx < big_segment[0]) || (flag && (nx == big_segment[0]))
279
- return (nx2 > big_segment[1]) || (flag && (nx2 == big_segment[1])) ? -1 : 0
280
- end
281
-
282
- #===移動先が表示範囲内かどうかを判別して、その状態によって値を整数で返す
283
- # 移動量が0のときは0、
284
- # 移動後の小線分の範囲が大線分の範囲内のときは1、
285
- # 範囲外に出るときは-1を返す
286
- #_mini_segment_:: 小線分の範囲。[min,max]で構成された2要素の配列
287
- #_big_segment_:: 大線分の範囲。[min,max]で構成された2要素の配列
288
- #_d_:: mini_segmentの移動量
289
- #_flag_:: 大線分の端いっぱいも範囲外に含めるときはtrueを設定する。デフォルトはfalse
290
- #返却値:: 判別の結果
291
- def Utility.in_bounds_rev_ex?(mini_segment, big_segment, d, flag = false)
292
- return 0 if d == 0
293
- dir = (d <=> 0)
294
- nx = mini_segment[0] + d
295
- nx2 = mini_segment[1] + d - 1
296
- nx, nx2 = nx2, nx if nx > nx2
297
- return -dir if (nx < big_segment[0]) || (flag && (nx == big_segment[0]))
298
- return (nx2 > big_segment[1]) || (flag && (nx2 == big_segment[1])) ? -dir : dir
299
- end
300
-
301
- #===小線分を移動させたとき、大線分が範囲内かどうかを判別する
302
- # 移動後の小線分が大線分の範囲内にあるかどうかをtrue/falseで取得する
303
- #_mini_pos_:: 小線分の開始点の位置
304
- #_mini_size_:: 小線分の幅。0以上の整数
305
- #_big_pos_:: 大線分の開始点の位置
306
- #_big_size_:: 大線分の幅。1以上の整数
307
- #_d_:: mini_segmentの移動量
308
- #_flag_:: 大線分の端いっぱいも範囲外に含めるときはtrueを設定する。デフォルトはfalse
309
- #返却値:: 範囲内のときはtrue、範囲外の時はfalseを返す
310
- def Utility.in_bounds_by_size?(pos1, size1, pos2, size2, d, flag = false)
311
- raise MiyakoError, "illegal size1! #{size1}" if size1 < 0
312
- raise MiyakoError, "illegal size2! #{size2}" if size2 <= 0
313
- raise MiyakoError, "size1 is more than size2! #{size1}, #{size2}" if size1 > size2
314
- min_x1 = pos1 + d
315
- min_x2 = pos1 + size1 + d
316
- min_x1, min_x2 = min_x2, min_x1 if min_x1 > min_x2
317
- return flag ? (min_x1 >= pos2 && min_x2 <= pos2+size2) : (minx_x1 > pos2 && min_x2 < pos2+size2)
318
- end
319
-
320
- #===小線分を移動させたとき、大線分が範囲内かどうかを判別して、その状態によって値を整数で返す
321
- # 移動後の小線分の範囲が大線分の範囲内のときは0、
322
- # マイナス方向で範囲外に出るときは-1、
323
- # プラス方向で出るときは1を返す
324
- #_mini_pos_:: 小線分の開始点の位置
325
- #_mini_size_:: 小線分の幅。0以上の整数
326
- #_big_pos_:: 大線分の開始点の位置
327
- #_big_size_:: 大線分の幅。1以上の整数
328
- #_d_:: mini_segmentの移動量
329
- #_flag_:: 大線分の端いっぱいも範囲外に含めるときはtrueを設定する。デフォルトはfalse
330
- #返却値:: 判別の結果
331
- def Utility.in_bounds_ex_by_size?(pos1, size1, pos2, size2, d, flag = false)
332
- raise MiyakoError, "illegal size1! #{size1}" if size1 < 0
333
- raise MiyakoError, "illegal size2! #{size2}" if size2 <= 0
334
- raise MiyakoError, "size1 is more than size2! #{size1}, #{size2}" if size1 > size2
335
- min_x1 = pos1 + d
336
- min_x2 = pos1 + size1 + d
337
- min_x1, min_x2 = min_x2, min_x1 if min_x1 > min_x2
338
- return -1 if (min_x1 < pos2) || (flag && (min_x1 == pos2))
339
- return (min_x2 > pos2+size2) || (flag && (min_x2 == pos2+size2)) ? 1 : 0
340
- end
341
-
342
- #===移動先が表示範囲内かどうかを判別して、その状態によって値を整数で返す
343
- # 移動後の小線分の範囲が大線分の範囲内のときは0
344
- # マイナス方向で範囲外に出るときは1、
345
- # プラス方向で出るときは-1を返す
346
- #_mini_pos_:: 小線分の開始点の位置
347
- #_mini_size_:: 小線分の幅。0以上の整数
348
- #_big_pos_:: 大線分の開始点の位置
349
- #_big_size_:: 大線分の幅。1以上の整数
350
- #_d_:: mini_segmentの移動量
351
- #_flag_:: 大線分の端いっぱいも範囲外に含めるときはtrueを設定する。デフォルトはfalse
352
- #返却値:: 判別の結果
353
- def Utility.in_bounds_rev_by_size?(pos1, size1, pos2, size2, d, flag = false)
354
- raise MiyakoError, "illegal size1! #{size1}" if size1 < 0
355
- raise MiyakoError, "illegal size2! #{size2}" if size2 <= 0
356
- raise MiyakoError, "size1 is more than size2! #{size1}, #{size2}" if size1 > size2
357
- min_x1 = pos1 + d
358
- min_x2 = pos1 + size1 + d
359
- min_x1, min_x2 = min_x2, min_x1 if min_x1 > min_x2
360
- return 1 if (min_x1 < pos2) || (flag && (min_x1 == pos2))
361
- return (min_x2 > pos2+size2) || (flag && (min_x2 == pos2+size2)) ? -1 : 0
362
- end
363
-
364
- #===移動先が表示範囲内かどうかを判別して、その状態によって値を整数で返す
365
- # 移動量が0のときは0、
366
- # 移動後の小線分の範囲が大線分の範囲内のときは1、
367
- # 範囲外に出るときは-1を返す
368
- #_mini_pos_:: 小線分の開始点の位置
369
- #_mini_size_:: 小線分の幅。0以上の整数
370
- #_big_pos_:: 大線分の開始点の位置
371
- #_big_size_:: 大線分の幅。1以上の整数
372
- #_d_:: mini_segmentの移動量
373
- #_flag_:: 大線分の端いっぱいも範囲外に含めるときはtrueを設定する。デフォルトはfalse
374
- #返却値:: 判別の結果
375
- def Utility.in_bounds_rev_ex_by_size?(pos1, size1, pos2, size2, d, flag = false)
376
- return 0 if d == 0
377
- raise MiyakoError, "illegal size1! #{size1}" if size1 < 0
378
- raise MiyakoError, "illegal size2! #{size2}" if size2 <= 0
379
- raise MiyakoError, "size1 is more than size2! #{size1}, #{size2}" if size1 > size2
380
- dir = (d <=> 0)
381
- min_x1 = pos1 + d
382
- min_x2 = pos1 + size1 + d
383
- min_x1, min_x2 = min_x2, min_x1 if min_x1 > min_x2
384
- return -dir if (min_x1 < pos2) || (flag && (min_x1 == pos2))
385
- return (min_x2 > pos2+size2) || (flag && (min_x2 == pos2+size2)) ? -dir : dir
386
- end
387
- end
388
- end
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