前回やや強引に通電判定エンジンができたということにしましたので、 アプリケーション本体に組み込みます。 ちゃんと動いてくれるでしょうか?
エッジが 1本、 4本以外のときは未対応として例外を投げていましたが、
ここを update_many_edges()
を呼ぶように変更。
def update_edges case @edges.size when 1 is_tuden = Tuden.tuden?(@switches) @edges[0].update(is_tuden) when 4 update_4_edges() else update_many_edges() # ここ end end
update_many_edges()
はこんな感じ。
def update_many_edges tnodes, pos_nid_map, nid_plus, nid_minus = prepare_tuden_nodes() tedges, eid_edge_map = prepare_tuden_edges(pos_nid_map) Tuden.update( tedges, tnodes, nid_plus, nid_minus ) tedges.each { |tedge| edge = eid_edge_map[tedge.id] edge.update(tedge.on?) } end
(1) エッジID、ノードIDを採番しながら
Unit::Edge
から 通電判定処理用のtedges
,tnodes
を生成 (prepare_tuden_nodes()
,prepare_tuden_edges()
)(2) 通電判定処理を実行
- (3) 判定の結果を
Circuit#edges
に反映させる
という流れです。
Tuden
内では座標について考える必要をなくし、
純粋なグラフのデータとして扱うために
Tuden::Edge
と Tuden::Node
を使っていました。
そのインターフェイスに合わせるためのアダプタ部分が (1) と (3) ですね。
試しにたくさんの枝分かれとスイッチがあるこんな回路を描いてみました。
さて……
動くでしょうか!?
それっぽく動いてるように見えます!! 🎉🎉🎉🎉
前回も書いたように通電判定処理はほとんど最適化していませんが、 このくらいの規模なら特に問題ないようです。
以下の iframe で実際に試せます (※マウス操作のできないスマホ・タブレットは非対応)。
こちらも同じものです。
https://sonota88.github.io/kairo-gokko/pages/16/index.html