2020-01-01から1年間の記事一覧
目次ページに戻る / 前 / 次 equal リレーを追加します。 not リレーのときとほとんど同じです。 テスト用回路はこう。 動かした様子です。 以下の iframe で実際に動かせます。 音量小さめにしていますが音が出ます。 こちらも同じものです。 https://sonot…
目次ページに戻る / 前 / 次 先に進む前に見た目に関する修正をここでやっておきます。 今やらなくてもいいものばかりなのですが (実際にプロトタイプの時はどれも後回しにしていました)、 ブログ記事を書く都合による修正と、 ついでなので見た目まわりを…
目次ページに戻る / 前 / 次 前回は状態更新処理をループさせることで 2段、3段とリレーが連なった場合でも動くようにしました。 前回の回路はうまく動きましたが、そういえば無限ループになる場合はないのでしょうか? あります。 たとえば次の回路では無限…
目次ページに戻る / 前 / 次 いやー、なにはともあれ NOT ゲートが動きましたね。 とにかく動くということが分かったので、ハリボテ部分をまともな形に修正していきます。 現状ではどこがハリボテかというと、リレーによるスイッチへの作用が2段階以上になる…
目次ページに戻る / 前 / 次 前回は not リレーの表示まで実装しました。 今回は、リレーの通電状態が変わったときに隣のスイッチを切り替える部分を作りましょう。 汎用的なものを目指すのはいったん脇に置いといて、まずはこの回路を動かすことだけを考え…
目次ページに戻る / 前 / 次 リレーを追加します! リレーとは何か!? 説明しよう! リレーとは電磁石で(つまり電気による制御で)スイッチの ON/OFF を切り替える装置である。 以上。 あとはググッて調べてください。 ググりました? 分かりましたね? で…
目次ページに戻る / 前 / 次 物理回路と違って導線自体が光って見えるため実用性という意味では必要性は薄めですが、 ランプを追加します。 通電していることがちょっとだけ分かりやすいとか、通電確認したい箇所を強調できるとか、光が灯るのは象徴的でよい…
目次ページに戻る / 前 / 次 スイッチ以外をクリックしたときにエラーになるのを修正 Circuit#find_switch_by_position を修正。 クリックした位置にスイッチがない場合に nil を返すように。 もっと早く直しておけばよかった……。 --- a/circuit.rb +++ b/ci…
目次ページに戻る / 前 / 次 test/helper を追加 テストのファイルが 2つに増えたので、共通部分を helper にまとめておきます。 # test/helper.rb require "minitest/autorun" $LOAD_PATH.unshift File.expand_path("..", __dir__) 各テストファイルの requ…
目次ページに戻る / 前 / 次 子回路へ分割の実装編です。 修正前はこうなっていたのを、 # class ChildCircuit def self.create(lines, rects) all_plus_poles = ... all_minus_poles = ... all_switches = ... wf_set = to_wire_fragments(lines) all_edges…
目次ページに戻る / 前 / 次 通電判定の説明で使った図を 2つ並べてみました。 たとえば 1枚の基板上(机の上とかでもいいですが)にこういうふうに並べて配置されている状況を想像してみます。 エッジについて通電判定するためにダイクストラ法を使って最短…
目次ページに戻る / 前 / 次 前回やや強引に通電判定エンジンができたということにしましたので、 アプリケーション本体に組み込みます。 ちゃんと動いてくれるでしょうか? エッジが 1本、 4本以外のときは未対応として例外を投げていましたが、 ここを upd…
目次ページに戻る / 前 / 次 さて、アイデアはアイデアとして、 問題はどうやって経路を辿るかです。 最初は データの整形 3 のときのように辿っていけばええんやろ? と素朴にやってみてたんですがうまくいかず……。 問題に向き合って正攻法でやらないとダメ…
目次ページに戻る / 前 / 次 前回はエッジ 4本の場合の中でも限定的な配線パターンを対象に、それだけをなんとかする通電判定処理を作ってみました。 しかし、あのやり方ではすぐに行き詰まるでしょう。 エッジが 5本でも 100本でも解決できる汎用的な方法は…
目次ページに戻る / 前 / 次 前回はエッジ1本と複数のスイッチのケースまで対応しました。 今回はもう少し複雑なパターンとして、途中で分岐してスイッチが並列になっている回路の通電判定を考えます。 「並列つなぎ」というやつですね。 小学校の理科でやる…
目次ページに戻る / 前 / 次 スイッチが複数ある場合に対応します。 これは全然大した修正じゃないので記事分ける必要なかったですね……。 --- a/circuit.rb +++ b/circuit.rb @@ -264,7 +264,7 @@ class Circuit end def update_edges - is_tuden = Tuden.tu…
目次ページに戻る / 前 / 次 次はもうちょっと複雑なパターンを……と思いましたが、 その前にエッジ 1本の通電判定処理だけ作ってみることにします。 動くものができるとモチベーションも上がるでしょう。 クリックでスイッチだけ状態を更新 スイッチの状態に…
目次ページに戻る / 前 / 次 見た目ばかり整えていても動きません。いいかげん本丸である通電に取り組みましょう。 いきなり難しいところから考えるといきなり手詰まりになってしまうので、 まずは簡単なところから始めます。 電気(回路)の知識に乏しいの…
目次ページに戻る / 前 / 次 導線と電池のプラス極・マイナス極だけでは寂しいですね。とりあえずスイッチを追加しましょうか。 まだ電気を流して回路を動かすことはできないので描画するだけです。 LibreOffice Draw で元データを作ります。 data_01.fodg …
目次ページに戻る / 前 / 次 前の記事に書いた dxopal_sdl.rb を使う形に書き換えます。 ここは上記の記事に書いた通り。 --- a/main.rb +++ b/main.rb @@ -1,4 +1,13 @@ -require 'dxopal' +def browser? + Kernel.const_defined?(:Native) +end + +if brow…
目次ページに戻る / 前 / 次 DXOpal はブラウザで実行できるため、SDL などのネイティブなライブラリが不要で、他の人に見てもらいやすいところが魅力的です。 しかし、実際開発してみるとブラウザで開いてから動き出すまでにそこそこ時間がかかったり、 デ…
目次ページに戻る / 前 / 次 「マウス操作も効果音もまだ必要にはなってない」と前回書きましたが、 せっかく DXOpal にしたのでちょっとだけやっておきます。 マウス とりあえずマウスカーソルの位置(x, y 座標)を取得して、表示に反映させてみます。 ---…
目次ページに戻る / 前 / 次 手っ取り早く可視化したかったので Plumo を使ってきましたが、 Plumo はしょぼいのでマウスで操作したり効果音を出したりできません。 そこで、DXOpal を使って書き直します。 最近 DX 流行ってますしね(それは違うやつ)。 gi…
目次ページに戻る / 前 / 次 分けます。 今の段階でいえば、元データを整形して Unit::Edge や Unit::PlusPole に変換する部分が前処理、 描画部分が実行処理に当たります。 前処理(データの整形)の部分は LibreOffice Draw で編集して元データが変更され…
目次ページに戻る / 前 / 次 PlusPole, MinusPole 放置していた電池のプラス極・マイナス極をいい感じのオブジェクトにしておきます。 Unit::PlusPole Unit::MinusPole これまでは LiboDraw::Rectangle のオブジェクトをそのまま使って矩形を描画していまし…
目次ページに戻る / 前 / 次 今回は十字の部分について考えます。 <before> <after> つながってる十字とつながっていない十字の両方を使いたい場合、すぐに思いつく方法が2つあります。 (1) つなげたくない場合にブリッジを使う (2) 点で指定 (1) ブリッ…
目次ページに戻る / 前 / 次 はい、では WireFragment(以下 WF) の集合をエッジの集合に変換する to_edges メソッドを作っていきます。 LibreOffice Draw で描いた大元のデータはこう。 要素が多いとデバッグが面倒なので少なめにしました。 目標イメージ…
目次ページに戻る / 前 / 次 電気、流したいですね。 流したいので、ここらへんから「電気を流して動かすにはどうすればいいか?」を考えながら進めていきます。 実際に電気を流して回路を動かしたときの動作を想像すると、こんな感じなんじゃないでしょうか…
目次ページに戻る / 前 / 次 適当に描いた直線の部分の重複をなくして整えます。 [before] [after] 上図の [after] のように、隣接するセル間をつなぐ線をひとつの単位として、 (1) 長い線をこの単位になるようにバラす (2) バラした短い線同士を比較して、…
目次ページに戻る / 前 / 次 図形の情報が抽出できたので、抽出結果の確認も兼ねて、もうここで可視化してしまいます。 (Bundler を使って) Plumo をインストールして、 次のように viewer.rb を書いて、 require "plumo" require "./libo_draw" # pixels …