kairo-gokko (16) 通電 7



前回やや強引に通電判定エンジンができたということにしましたので、 アプリケーション本体に組み込みます。 ちゃんと動いてくれるでしょうか?


エッジが 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::EdgeTuden::Node を使っていました。 そのインターフェイスに合わせるためのアダプタ部分が (1) と (3) ですね。


f:id:sonota88:20200308055053p:plain

試しにたくさんの枝分かれとスイッチがあるこんな回路を描いてみました。


さて……



動くでしょうか!?




f:id:sonota88:20200307145544g:plain

それっぽく動いてるように見えます!! 🎉🎉🎉🎉

前回も書いたように通電判定処理はほとんど最適化していませんが、 このくらいの規模なら特に問題ないようです。


以下の iframe で実際に試せます (※マウス操作のできないスマホタブレットは非対応)。

こちらも同じものです。
https://sonota88.github.io/kairo-gokko/pages/16/index.html