Class: Miyako::Segments

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

Overview

X方向・Y方向線分の区間情報を操作するクラス

本クラスでは、X方向・Y方向2つのSegmentを管理する。 位置変更メソッドを追加

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(*params) ⇒ Segments

矩形情報からSegmentsインスタンスを生成する

入力した情報から、Segment構造体二つを持ったインスタンスを生成する 引数には、Rect構造体、Square構造体、[(x),(y)],[min_x,max_x,min_y,max_y]の形式を持つ

引数を省略したときはすべて0のSegment構造体を持つ また、引数が3つ、5つ以上の時はMiyakoValueError例外が発生する

params

情報を渡す引数(複数可)

返却値

生成したインスタンスを返す



378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
# File 'lib/Miyako/API/struct_segment.rb', line 378

def initialize(*params)
  case params.length
    when 0
      @x = Segment.new(0,0)
      @y = Segment.new(0,0)
    when 1
      pm = params[0]
      if pm.is_a?(Rect)
        @x = Segment.new(pm[0], pm[0] + pm[2] - 1)
        @y = Segment.new(pm[1], pm[1] + pm[3] - 1)
      elsif pm.is_a?(Square) || (pm.is_a?(Array) && pm.length==4)
        @x = Segment.new(pm[0], pm[2])
        @y = Segment.new(pm[1], pm[3])
      else
        @x = Segment.new(pm[0][0],pm[0][1])
        @y = Segment.new(pm[1][0],pm[1][1])
      end
    when 2
      @x = Segment.new(params[0][0],params[0][1])
      @y = Segment.new(params[1][0],params[1][1])
    when 4
      @x = Segment.new(params[0],params[1])
      @y = Segment.new(params[2],params[3])
    else
      raise MiyakoValueError, "illegal params : params is 0,1,2,4! params = #{params.length}"
  end
end

Instance Attribute Details

#xObject (readonly)

x座標の線分を返す

(例)segments = (x:,y:)

segments.x => segment[10,20]
返却値

Segment構造体



352
353
354
# File 'lib/Miyako/API/struct_segment.rb', line 352

def x
  @x
end

#yObject (readonly)

y座標の線分を返す

(例)segment = (x:,y:)

segment.y => segment[100,200]
返却値

Segment構造体



358
359
360
# File 'lib/Miyako/API/struct_segment.rb', line 358

def y
  @y
end

Class Method Details

.create(rect) ⇒ Object

矩形情報からSegmentsインスタンスを生成する

入力した矩形情報(Rect構造体、で表される配列)から、構造体インスタンスを生成する (前バージョンまでの互換性のために残している)

rect

算出に使用する矩形情報

返却値

生成したインスタンスを返す



365
366
367
368
# File 'lib/Miyako/API/struct_segment.rb', line 365

def Segments.create(rect)
  return Segments.new(Segment.new(rect[0], rect[0] + rect[2] - 1),
                      Segment.new(rect[1], rect[1] + rect[3] - 1))
end

Instance Method Details

#[](idx) ⇒ Object

インデックスから対象のSegment構造体を取得する

インデックスの値に対応した 上記以外のインデックスを渡したときはnilを返す Segmentsは以前構造体だったため、互換性のために用意している

idx

Segmentを指すインデックス

返却値

インデックスに対応したSegment構造体(対応していないインデックスの時はnil)



412
413
414
415
416
417
418
419
420
421
# File 'lib/Miyako/API/struct_segment.rb', line 412

def [](idx)
  case idx
    when 0, :x
      return @x
    when 1, :y
      return @y
    else
      return nil
  end
end

#between?(x, y) ⇒ Boolean

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

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

x

x方向の値

y

y方向の値

返却値

x,yが範囲内のときはtrue、範囲外の時はfalseを返す



543
544
545
# File 'lib/Miyako/API/struct_segment.rb', line 543

def between?(x, y)
  in_range?(x, y)
end

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

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

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

idx

判別する方向(xもしくはy)。:x, :y, 0, 1のどれかを渡す。それ以外を渡すと例外が発生する

big_segment

大線分の範囲。で構成された2要素の配列

d

selfの移動量

flag

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

返却値

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

Raises:



581
582
583
584
# File 'lib/Miyako/API/struct_segment.rb', line 581

def in_bounds?(idx, big_segment, d, flag = false)
  raise MiyakoError, "illegal index : #{idx}" unless [0,1,:x,:y].include?(idx)
  return self[idx].in_bounds?(big_segment[idx], d, flag)
end

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

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

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

idx

判別する方向(xもしくはy)。:x, :y, 0, 1のどれかを渡す。それ以外を渡すと例外が発生する

big_segment

大線分の範囲。で構成された2要素の配列

d

selfの移動量

flag

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

返却値

判別の結果

Raises:



595
596
597
598
# File 'lib/Miyako/API/struct_segment.rb', line 595

def in_bounds_ex?(idx, big_segment, d, flag = false)
  raise MiyakoError, "illegal index : #{idx}" unless [0,1,:x,:y].include?(idx)
  return self[idx].in_bounds_ex?(big_segment[idx], d, flag)
end

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

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

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

idx

判別する方向(xもしくはy)。:x, :y, 0, 1のどれかを渡す。それ以外を渡すと例外が発生する

big_segment

大線分の範囲。で構成された2要素の配列

d

selfの移動量

flag

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

返却値

判別の結果

Raises:



609
610
611
612
# File 'lib/Miyako/API/struct_segment.rb', line 609

def in_bounds_rev?(idx, big_segment, d, flag = false)
  raise MiyakoError, "illegal index : #{idx}" unless [0,1,:x,:y].include?(idx)
  return self[idx].in_bounds_rev?(big_segment[idx], d, flag)
end

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

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

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

idx

判別する方向(xもしくはy)。:x, :y, 0, 1のどれかを渡す。それ以外を渡すと例外が発生する

big_segment

大線分の範囲。で構成された2要素の配列

d

selfの移動量

flag

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

返却値

判別の結果

Raises:



623
624
625
626
# File 'lib/Miyako/API/struct_segment.rb', line 623

def in_bounds_rev_ex?(idx, big_segment, d, flag = false)
  raise MiyakoError, "illegal index : #{idx}" unless [0,1,:x,:y].include?(idx)
  return self[idx].in_bounds_rev_ex?(big_segment[idx], d, flag)
end

#in_edge?(x, y) ⇒ Boolean

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

x,yの値がともにminもしくはmaxと等しければtrueを返す

x

x方向の値

y

y方向の値

返却値

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



552
553
554
# File 'lib/Miyako/API/struct_segment.rb', line 552

def in_edge?(x, y)
  @x.in_edge?(x) && @y.in_edge?(y)
end

#in_range?(x, y) ⇒ Boolean

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

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

x

x方向の値

y

y方向の値

返却値

x,yが範囲内のときはtrue、範囲外の時はfalseを返す



533
534
535
# File 'lib/Miyako/API/struct_segment.rb', line 533

def in_range?(x, y)
  @x.in_range?(x) && @y.in_range?(y)
end

#max?(x, y) ⇒ Boolean

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

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

x

x方向の値

y

y方向の値

返却値

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



570
571
572
# File 'lib/Miyako/API/struct_segment.rb', line 570

def max?(x, y)
  @x.max?(x) && @y.max?(y)
end

#min?(x, y) ⇒ Boolean

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

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

x

x方向の値

y

y方向の値

返却値

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



561
562
563
# File 'lib/Miyako/API/struct_segment.rb', line 561

def min?(x, y)
  @x.min?(x) && @y.min?(y)
end

#move(dx, dy) ⇒ Object

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

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

dx

移動量(x方向)。単位はピクセル

dy

移動量(y方向)。単位はピクセル

返却値

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



451
452
453
# File 'lib/Miyako/API/struct_segment.rb', line 451

def move(dx, dy)
  self.dup.move!(dx, dy)
end

#move!(dx, dy) ⇒ Object

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

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

dx

移動量(x方向)。単位はピクセル

dy

移動量(y方向)。単位はピクセル

返却値

自分自身を返す



428
429
430
431
432
# File 'lib/Miyako/API/struct_segment.rb', line 428

def move!(dx, dy)
  @x.move!(dx)
  @y.move!(dy)
  return self
end

#move_to(x, y) ⇒ Object

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

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

x

移動先位置(x方向)。単位はピクセル

y

移動先位置(y方向)。単位はピクセル

返却値

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



461
462
463
# File 'lib/Miyako/API/struct_segment.rb', line 461

def move_to(x, y)
  self.dup.move_to!(x, y)
end

#move_to!(x, y) ⇒ Object

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

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

x

移動先位置(x方向)。単位はピクセル

y

移動先位置(y方向)。単位はピクセル

返却値

自分自身を返す



439
440
441
442
443
# File 'lib/Miyako/API/struct_segment.rb', line 439

def move_to!(x, y)
  @x.move_to!(x)
  @y.move_to!(y)
  return self
end

#reset!(min_x, max_x, min_y, max_y) ⇒ Object

線分情報を変更する

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

min_x

x方向の線分の最小値

max_x

x方向の線分の最大値

min_y

y方向の線分の最小値

max_y

y方向の線分の最大値

返却値

自分自身



515
516
517
518
# File 'lib/Miyako/API/struct_segment.rb', line 515

def reset!(min_x, max_x, min_y, max_y) #:nodoc:
  @x.reset!(min_x, max_x)
  @y.reset!(min_y, max_y)
end

#resize(dw, dh) ⇒ Object

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

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

dw

幅変更。単位はピクセル

dh

高さ変更。単位はピクセル

返却値

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



493
494
495
# File 'lib/Miyako/API/struct_segment.rb', line 493

def resize(dw, dh)
  self.dup.resize!(dw,dh)
end

#resize!(dw, dh) ⇒ Object

サイズを変更する(変化量を指定)

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

dw

幅変更。単位はピクセル

dh

高さ変更。単位はピクセル

返却値

自分自身を返す



470
471
472
473
474
# File 'lib/Miyako/API/struct_segment.rb', line 470

def resize!(dw, dh)
  @x.resize!(dw)
  @y.resize!(dh)
  return self
end

#resize_to(w, h) ⇒ Object

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

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

w

幅変更。単位はピクセル

h

高さ変更。単位はピクセル

返却値

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



503
504
505
# File 'lib/Miyako/API/struct_segment.rb', line 503

def resize_to(w, h)
  self.dup.resize_to!(w,h)
end

#resize_to!(w, h) ⇒ Object

サイズを変更する

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

w

幅変更。単位はピクセル

h

高さ変更。単位はピクセル

返却値

自分自身を返す



481
482
483
484
485
# File 'lib/Miyako/API/struct_segment.rb', line 481

def resize_to!(w, h)
  @x.resize_to!(w)
  @y.resize_to!(h)
  return self
end

#to_aryObject

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

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

返却値

生成した配列



523
524
525
# File 'lib/Miyako/API/struct_segment.rb', line 523

def to_ary
  [@x.to_ary, @y.to_ary]
end