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

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

返却値

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



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

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構造体



356
357
358
# File 'lib/Miyako/API/struct_segment.rb', line 356

def x
  @x
end

#yObject (readonly)

y座標の線分を返す

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

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

Segment構造体



362
363
364
# File 'lib/Miyako/API/struct_segment.rb', line 362

def y
  @y
end

Class Method Details

.create(rect) ⇒ Object

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

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

rect

算出に使用する矩形情報

返却値

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



369
370
371
372
# File 'lib/Miyako/API/struct_segment.rb', line 369

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)



416
417
418
419
420
421
422
423
424
425
# File 'lib/Miyako/API/struct_segment.rb', line 416

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を返す

Returns:

  • (Boolean)


547
548
549
# File 'lib/Miyako/API/struct_segment.rb', line 547

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を返す

Returns:

  • (Boolean)

Raises:



585
586
587
588
# File 'lib/Miyako/API/struct_segment.rb', line 585

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

返却値

判別の結果

Returns:

  • (Boolean)

Raises:



599
600
601
602
# File 'lib/Miyako/API/struct_segment.rb', line 599

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

返却値

判別の結果

Returns:

  • (Boolean)

Raises:



613
614
615
616
# File 'lib/Miyako/API/struct_segment.rb', line 613

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

返却値

判別の結果

Returns:

  • (Boolean)

Raises:



627
628
629
630
# File 'lib/Miyako/API/struct_segment.rb', line 627

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を返す

Returns:

  • (Boolean)


556
557
558
# File 'lib/Miyako/API/struct_segment.rb', line 556

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を返す

Returns:

  • (Boolean)


537
538
539
# File 'lib/Miyako/API/struct_segment.rb', line 537

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を返す

Returns:

  • (Boolean)


574
575
576
# File 'lib/Miyako/API/struct_segment.rb', line 574

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を返す

Returns:

  • (Boolean)


565
566
567
# File 'lib/Miyako/API/struct_segment.rb', line 565

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

#move(dx, dy) ⇒ Object

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

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

dx

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

dy

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

返却値

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



455
456
457
# File 'lib/Miyako/API/struct_segment.rb', line 455

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

#move!(dx, dy) ⇒ Object

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

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

dx

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

dy

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

返却値

自分自身を返す



432
433
434
435
436
# File 'lib/Miyako/API/struct_segment.rb', line 432

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

#move_to(x, y) ⇒ Object

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

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

x

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

y

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

返却値

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



465
466
467
# File 'lib/Miyako/API/struct_segment.rb', line 465

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

#move_to!(x, y) ⇒ Object

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

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

x

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

y

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

返却値

自分自身を返す



443
444
445
446
447
# File 'lib/Miyako/API/struct_segment.rb', line 443

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方向の線分の最大値

返却値

自分自身



519
520
521
522
# File 'lib/Miyako/API/struct_segment.rb', line 519

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

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

返却値

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



497
498
499
# File 'lib/Miyako/API/struct_segment.rb', line 497

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

#resize!(dw, dh) ⇒ Object

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

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

dw

幅変更。単位はピクセル

dh

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

返却値

自分自身を返す



474
475
476
477
478
# File 'lib/Miyako/API/struct_segment.rb', line 474

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

#resize_to(w, h) ⇒ Object

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

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

w

幅変更。単位はピクセル

h

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

返却値

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



507
508
509
# File 'lib/Miyako/API/struct_segment.rb', line 507

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

#resize_to!(w, h) ⇒ Object

サイズを変更する

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

w

幅変更。単位はピクセル

h

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

返却値

自分自身を返す



485
486
487
488
489
# File 'lib/Miyako/API/struct_segment.rb', line 485

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

#to_aryObject

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

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

返却値

生成した配列



527
528
529
# File 'lib/Miyako/API/struct_segment.rb', line 527

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