わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

gf更新: Top-down numbering optionほか

人間ピラミッドなどの組体操(組立体操を含む)について,荷重計算をRubyで行うプログラム,「gf」を更新しました.最新版とこれまでのバージョンは,以下より参照できます.

7段(55人)ピラミッドの構成法についてで少し書きましたが,今回,各演技者の識別番号をトップダウンにする機能を追加しました.gf.rb実行時のオプションは,-cまたは--descendです.実行例は以下の通りです.

$ ruby lib/gf.rb -v -c
6 persons, total_weight=6, max_load=1.5, max_rate=1.5 (name=3.2, weight=1, load=1.5)
name=1.1, weight=1, load=0, load_rate=0, supporting: , supported by: [2.1~0.5, 2.2~0.5; 3.1, 3.2, 3.3]
name=2.1, weight=1, load=0.5, load_rate=0.5, supporting: [1.1_0.5;], supported by: [3.1~0.5, 3.2~0.5;]
name=2.2, weight=1, load=0.5, load_rate=0.5, supporting: [1.1_0.5;], supported by: [3.2~0.5, 3.3~0.5;]
name=3.1, weight=1, load=0.75, load_rate=0.75, supporting: [2.1_0.75; 1.1], supported by:

name=3.2, weight=1, load=1.5, load_rate=1.5, supporting: [2.1_0.75, 2.2_0.75; 1.1], supported by:
name=3.3, weight=1, load=0.75, load_rate=0.75, supporting: [2.2_0.75; 1.1], supported by:

「name=1.1」から始まる行は,自重は1,荷重は0,荷重÷自重も0,この者が支える者はおらず,この者を直接的に支える者は2.1と2.2で割合は50%ずつ,間接的に支える者は3.1と3.2と3.3,という意味です.
名前の「1.1」は,上から1段目,左から1番目という意味です.これは,俵型の3段の人間ピラミッドですが,三角錐型や,やぐらでも,ドット付き10進記法の最初の数値について,最上位を1とし,下に行くほど値が増える(descending)という書式になります.
このオプションをつけない場合の実行例は,以下の通りです.

$ ruby lib/gf.rb -v
6 persons, total_weight=6, max_load=1.5, max_rate=1.5 (name=1.2, weight=1, load=1.5)
name=1.1, weight=1, load=0.75, load_rate=0.75, supporting: [2.1_0.75; 3.1], supported by:
name=1.2, weight=1, load=1.5, load_rate=1.5, supporting: [2.1_0.75, 2.2_0.75; 3.1], supported by:

name=1.3, weight=1, load=0.75, load_rate=0.75, supporting: [2.2_0.75; 3.1], supported by:
name=2.1, weight=1, load=0.5, load_rate=0.5, supporting: [3.1_0.5;], supported by: [1.1~0.5, 1.2~0.5;]
name=2.2, weight=1, load=0.5, load_rate=0.5, supporting: [3.1_0.5;], supported by: [1.2~0.5, 1.3~0.5;]
name=3.1, weight=1, load=0, load_rate=0, supporting:
, supported by: [2.1~0.5, 2.2~0.5; 1.1, 1.2, 1.3]

こちらの「1.1」は,下から1段目,左から1番目という意味です.俵型の3段の人間ピラミッドですので,1段目は,1.1と1.2と1.3の3人が務めます.
トップダウン/ボトムアップのナンバリングを効率良く行うため,lib/gf/root.rbに,GF::Formation#lvとGF::Formation#lv_sというメソッドを定義しました.メソッドlvは,「下から何段目か」の数値を引数にとり,@opt[:descend]が偽なら引数をそのまま返し,真なら,「上から何段目か」の数値になるよう,計算して戻り値とします.またlv_sは,"1.1.1"といった文字列を入力にとり,@opt[:descend]が偽のときはそのまま,真のときは,先頭の数値を「上から何段目か」の値に変換した文字列を求めて戻り値とします.
以下の修正も行いました.

  • やぐらのnameの値は,5人の場合は「段.番」,7人以上の場合は「段.列.番」で統一しました.これまでは,7人以上は「段.列.番」と「段.番」が混在していました.
  • 実行時の-mオプションで,最適配置を行う場合,最初に「土台」と「上2段」と「残り」に演技者オブジェクトを振り分けていて,これまではその振り分けを,最適配置を行う各メソッドで,別々に記述していましたが,保守性に欠けるので,GF::Formation#partition_memberというメソッドを定義し,これを呼び出すようにしました.
  • READMEを少し書き換えました.

(リリース:2016-05-03 未明)