Class: Miyako::SegmentStruct

Inherits:
Struct
  • Object
show all
Defined in:
lib/Miyako/API/struct_segment.rb

Overview

線分の区間情報のための構造体クラス

位置変更メソッドを追加

Instance Method Summary collapse

Instance Method Details

#*(other) ⇒ Object

インスタンスのかけ算

もう一方が整数のとき、x,yにotherを掛けたものを返す Point構造体や配列など、[]メソッドがつかえるもののとき、x,y同士を掛けたものを返す それ以外の時は例外が発生する 自分自身の値は変わらない

other

整数もしくはPoint構造体

返却値

Point構造体



179
180
181
182
183
184
185
186
187
188
189
190
191
# File 'lib/Miyako/API/struct_segment.rb', line 179

def *(other)
  ret = self.dup
  if other.kind_of?(Numeric)
    ret[0] *= other
    ret[1] *= other
  elsif other.methods.include?(:[])
    ret[0] *= other[0]
    ret[1] *= other[1]
  else
    raise MiyakoError, "this parameter cannot access!"
  end
  ret
end

#+(other) ⇒ Object

インスタンスの足し算

もう一方が整数のとき、x,yにotherを足したものを返す Point構造体や配列など、[]メソッドがつかえるもののとき、x,y同士を足したものを返す それ以外の時は例外が発生する 自分自身の値は変わらない

other

整数もしくはPoint構造体

返却値

Point構造体



137
138
139
140
141
142
143
144
145
146
147
148
149
# File 'lib/Miyako/API/struct_segment.rb', line 137

def +(other)
  ret = self.dup
  if other.kind_of?(Numeric)
    ret[0] += other
    ret[1] += other
  elsif other.methods.include?(:[])
    ret[0] += other[0]
    ret[1] += other[1]
  else
    raise MiyakoError, "this parameter cannot access!"
  end
  ret
end

#-(other) ⇒ Object

インスタンスの引き算

もう一方が整数のとき、x,yからotherを引いたものを返す Point構造体や配列など、[]メソッドがつかえるもののとき、x,y同士を引いたものを返す それ以外の時は例外が発生する 自分自身の値は変わらない

other

整数もしくはPoint構造体

返却値

Point構造体



158
159
160
161
162
163
164
165
166
167
168
169
170
# File 'lib/Miyako/API/struct_segment.rb', line 158

def -(other)
  ret = self.dup
  if other.kind_of?(Numeric)
    ret[0] -= other
    ret[1] -= other
  elsif other.methods.include?(:[])
    ret[0] -= other[0]
    ret[1] -= other[1]
  else
    raise MiyakoError, "this parameter cannot access!"
  end
  ret
end

#/(other) ⇒ Object

インスタンスの割り算

もう一方が整数のとき、x,yからotherを割ったものを返す Point構造体や配列など、[]メソッドがつかえるもののとき、x,y同士を割ったものを返す それ以外の時は例外が発生する 自分自身の値は変わらない

other

整数もしくはPoint構造体

返却値

Point構造体



200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
# File 'lib/Miyako/API/struct_segment.rb', line 200

def /(other)
  ret = self.dup
  if other.kind_of?(Numeric)
    raise MiyakoValueError, "0 div!" if other == 0
    ret[0] /= other
    ret[1] /= other
  elsif other.methods.include?(:[])
    raise MiyakoValueError, "0 div!" if (other[0] == 0 || other[1] == 0)
    ret[0] /= other[0]
    ret[1] /= other[1]
  else
    raise MiyakoError, "this parameter cannot access!"
  end
  ret
end

#between?(v) ⇒ Boolean

値が線分の範囲内かどうかを判別する

値がminとmaxの値の範囲内にあるかどうかを判別する。範囲内にあればtrueを返す 値がminもしくはmaxに等しいときもtrueを返す

v

判別する値

返却値

範囲内のときはtrue、範囲外の時はfalseを返す

Returns:

  • (Boolean)


32
33
34
# File 'lib/Miyako/API/struct_segment.rb', line 32

def between?(other)
  return self[0] >= other[0] && self[1] <= other[1]
end

#collision?(other) ⇒ Boolean

レシーバがotherの範囲と重なっているかどうかを求める

最小数・最大数のどちらかがotherの範囲内かどうかを確認する

other

比較対象の線分

返却値

最小値・最大値のどちらかがotherの範囲内ならばtrueを返す

Returns:

  • (Boolean)


48
49
50
# File 'lib/Miyako/API/struct_segment.rb', line 48

def collision?(other)
  return (self[0] >= other[0] && self[0] <= other[1]) || (self[1] >= other[0] && self[1] <= other[1])
end

#covers?(other) ⇒ Boolean

otherがレシーバの範囲内かどうかを求める

最小数・最大数ともにotherの範囲外かどうかを確認する

other

比較対象の線分

返却値

最小値・最大値ともにotherの範囲外ならばtrueを返す

Returns:

  • (Boolean)


40
41
42
# File 'lib/Miyako/API/struct_segment.rb', line 40

def covers?(other)
  return self[0] <= other[0] && self[1] >= other[1]
end

#in_bounds?(big_segment, d, flag = false) ⇒ Boolean

小線分を移動させたとき、大線分が範囲内かどうかを判別する

移動後の小線分が大線分の範囲内にあるかどうかをtrue/falseで取得する

big_segment

大線分の範囲。Segment構造体、もしくはで構成された配列

d

selfの移動量

flag

大線分の端いっぱいも範囲外に含めるときはtrueを設定する。デフォルトはfalse

返却値

範囲内のときはtrue、範囲外の時はfalseを返す

Returns:

  • (Boolean)


283
284
285
286
287
288
289
290
# File 'lib/Miyako/API/struct_segment.rb', line 283

def in_bounds?(big_segment, d, flag = false)
  nx = self[0] + d
  nx2 = self[1] + d
  nx, nx2 = nx2, nx if nx > nx2
  return flag ?
         (nx >= big_segment[0] && nx2 <= big_segment[1]) :
         (nx > big_segment[0] && (nx2 - 1) < big_segment[1])
end

#in_bounds_ex?(big_segment, d, flag = false) ⇒ Boolean

小線分を移動させたとき、大線分が範囲内かどうかを判別して、その状態によって値を整数で返す

移動後の小線分の範囲が大線分の範囲内のときは0、 マイナス方向で範囲外に出るときは-1、 プラス方向で出るときは1を返す

big_segment

大線分の範囲。Segment構造体、もしくはで構成された配列

d

selfの移動量

flag

大線分の端いっぱいも範囲外に含めるときはtrueを設定する。デフォルトはfalse

返却値

判別の結果

Returns:

  • (Boolean)


300
301
302
303
304
305
306
# File 'lib/Miyako/API/struct_segment.rb', line 300

def in_bounds_ex?(big_segment, d, flag = false)
  nx = self[0] + d
  nx2 = self[1] + d - 1
  nx, nx2 = nx2, nx if nx > nx2
  return -1 if (nx < big_segment[0]) || (flag && (nx == big_segment[0]))
  return (nx2 > big_segment[1]) || (flag && (nx2 == big_segment[1])) ? 1 : 0
end

#in_bounds_rev?(big_segment, d, flag = false) ⇒ Boolean

移動先が表示範囲内かどうかを判別して、その状態によって値を整数で返す

移動後の小線分の範囲が大線分の範囲内のときは0、 マイナス方向で範囲外に出るときは1、 プラス方向で出るときは-1を返す

big_segment

大線分の範囲。Segment構造体、もしくはで構成された配列

d

selfの移動量

flag

大線分の端いっぱいも範囲外に含めるときはtrueを設定する。デフォルトはfalse

返却値

判別の結果

Returns:

  • (Boolean)


316
317
318
319
320
321
322
# File 'lib/Miyako/API/struct_segment.rb', line 316

def in_bounds_rev?(big_segment, d, flag = false)
  nx = self[0] + d
  nx2 = self[1] + d - 1
  nx, nx2 = nx2, nx if nx > nx2
  return 1 if (nx < big_segment[0]) || (flag && (nx == big_segment[0]))
  return (nx2 > big_segment[1]) || (flag && (nx2 == big_segment[1])) ? -1 : 0
end

#in_bounds_rev_ex?(big_segment, d, flag = false) ⇒ Boolean

移動先が表示範囲内かどうかを判別して、その状態によって値を整数で返す

移動量が0のときは0、 移動後の小線分の範囲が大線分の範囲内のときは1、 範囲外に出るときは-1を返す

big_segment

大線分の範囲。Segment構造体、もしくはで構成された配列

d

selfの移動量

flag

大線分の端いっぱいも範囲外に含めるときはtrueを設定する。デフォルトはfalse

返却値

判別の結果

Returns:

  • (Boolean)


332
333
334
335
336
337
338
339
340
# File 'lib/Miyako/API/struct_segment.rb', line 332

def in_bounds_rev_ex?(big_segment, d, flag = false)
  return 0 if d == 0
  dir = (d <=> 0)
  nx = self[0] + d
  nx2 = self[1] + d - 1
  nx, nx2 = nx2, nx if nx > nx2
  return -dir if (nx < big_segment[0]) || (flag && (nx == big_segment[0]))
  return (nx2 > big_segment[1]) || (flag && (nx2 == big_segment[1])) ? -dir : dir
end

#in_edge?(v) ⇒ Boolean

値が線分の端かどうかを判別する

値がminもしくはmaxと等しければtrueを返す

v

判別する値

返却値

vがminもしくはmaxと等しければtrue、それ以外の時はfalseを返す

Returns:

  • (Boolean)


257
258
259
# File 'lib/Miyako/API/struct_segment.rb', line 257

def in_edge?(v)
  v == self[0] || v == self[1]
end

#in_range?(v) ⇒ Boolean

値が線分の範囲内かどうかを判別する

値がminとmaxの値の範囲内にあるかどうかを判別する。範囲内にあればtrueを返す 値がminもしくはmaxに等しいときもtrueを返す

v

判別する値

返却値

範囲内のときはtrue、範囲外の時はfalseを返す

Returns:

  • (Boolean)


240
241
242
# File 'lib/Miyako/API/struct_segment.rb', line 240

def in_range?(v)
  v >= self[0] && v <= self[1]
end

#max?(v) ⇒ Boolean

値が最大値かどうかを判別する

値がmaxと等しければtrueを返す

v

判別する値

返却値

vがmaxと等しければtrue、それ以外の時はfalseを返す

Returns:

  • (Boolean)


273
274
275
# File 'lib/Miyako/API/struct_segment.rb', line 273

def max?(v)
  v == self[1]
end

#min?(v) ⇒ Boolean

値が最小値かどうかを判別する

値がminと等しければtrueを返す

v

判別する値

返却値

vがminと等しければtrue、それ以外の時はfalseを返す

Returns:

  • (Boolean)


265
266
267
# File 'lib/Miyako/API/struct_segment.rb', line 265

def min?(v)
  v == self[0]
end

#move(d) ⇒ Object

位置を変更したインスタンスを返す(変化量を指定)

引数で指定したぶん移動させたときの位置を新しくインスタンスを生成して返す 自分自身の値は変わらない

d

移動量

返却値

自分自身の複製を更新したインスタンス



82
83
84
# File 'lib/Miyako/API/struct_segment.rb', line 82

def move(d)
  return self.dup.move!(d)
end

#move!(d) ⇒ Object

位置を変更する(変化量を指定)

d

移動量

返却値

自分自身を返す



62
63
64
65
66
# File 'lib/Miyako/API/struct_segment.rb', line 62

def move!(d)
  self[0] += d
  self[1] += d
  return self
end

#move_to(v) ⇒ Object

位置を変更したインスタンスを返す(位置指定)

引数で指定したぶん移動させたときの位置を新しくインスタンスを生成して返す 自分自身の値は変わらない

v

移動先位置。単位はピクセル

返却値

自分自身の複製を更新したインスタンス



91
92
93
# File 'lib/Miyako/API/struct_segment.rb', line 91

def move_to(v)
  return self.dup.move_to!(v)
end

#move_to!(v) ⇒ Object

位置を変更する(位置指定)

v

移動先位置。単位はピクセル

返却値

自分自身を返す



71
72
73
74
75
# File 'lib/Miyako/API/struct_segment.rb', line 71

def move_to!(v)
  self[1] = self[1] - self[0] + v
  self[0] = v
  return self
end

#reset!(min, max) ⇒ Object

線分情報を変更する

minとmaxを一緒に更新する min>maxのときは、それぞれの値を入れ替える

min

線分の最小値

max

線分の最大値

返却値

自分自身



222
223
224
225
226
# File 'lib/Miyako/API/struct_segment.rb', line 222

def reset!(min, max) #:nodoc:
  self[0], self[1] = min, max
  self[0], self[1] = self[1], self[0] if self[0] > self[1]
  self
end

#resize(d) ⇒ Object

サイズを変更したインスタンスを返す(変化量を指定)

引数で指定したぶん変えたときの大きさを新しくインスタンスを生成して返す 自分自身の値は変わらない

d

変更量。単位はピクセル

返却値

自分自身の複製を更新したインスタンス



117
118
119
# File 'lib/Miyako/API/struct_segment.rb', line 117

def resize(d)
  self.dup.resize!(d)
end

#resize!(d) ⇒ Object

幅を変更する(変化量を指定)

d

変更量。単位はピクセル

返却値

自分自身を返す



98
99
100
101
# File 'lib/Miyako/API/struct_segment.rb', line 98

def resize!(d)
  self[1] += d
  return self
end

#resize_to(v) ⇒ Object

サイズを変更したインスタンスを返す

引数で指定したぶん変えたときの大きさを新しくインスタンスを生成して返す 自分自身の値は変わらない

v

変更後の幅。単位はピクセル

返却値

自分自身の複製を更新したインスタンス



126
127
128
# File 'lib/Miyako/API/struct_segment.rb', line 126

def resize_to(v)
  self.dup.resize_to!(v)
end

#resize_to!(v) ⇒ Object

幅を変更する

ブロックを渡したとき、ブロックの評価した結果、偽になったときは移動させた値を元に戻す

v

変更後の幅。単位はピクセル

返却値

自分自身を返す



107
108
109
110
# File 'lib/Miyako/API/struct_segment.rb', line 107

def resize_to!(v)
  self[1] = self[0] + v - 1
  return self
end

#sizeObject

線分の大きさを求める

max - min + 1 の値を求めて返す

返却値

線分の大きさ



55
56
57
# File 'lib/Miyako/API/struct_segment.rb', line 55

def size
  self[1] - self[0] + 1
end

#to_aryObject

線分情報を配列に変換する

[min, max]の配列を生成して返す。

返却値

生成した配列



231
232
233
# File 'lib/Miyako/API/struct_segment.rb', line 231

def to_ary
  [self[0], self[1]]
end