記事の案内

がんばったもの memo88.hatenablog.com memo88.hatenablog.com カテゴリ別 Ruby Ruby カテゴリの記事一覧 (2016) Rubyで素朴なFM-indexを書いてみた (2016) Rubyで素朴なSA-IS(suffix array induced sorting)を書いてみた 難しかった (2019) Mrtable: 機械…

RSフリップフロップ

さて、基本的な部品が揃ったところで、 「部品を組み合わせて何か作る」ステージに進みましょう、 まずは組み合わせ回路から……とも考えましたが、もういきなりフリップフロップを作ってしまいます。 というのは、さっさと曳光弾を通してしまいたいからです。…

OR / NOR / XOR

基本的なところでいうと OR がまだ残っています。 作りましょう。 OR スイッチを並列つなぎにすると OR になります。 これまでグリッド線を描画していましたが、 見にくいような気がしてきたため、 コメントアウトして描画を止めてみました。 今作った OR だ…

AND / NAND

さて! ようやく準備が整いました。ここからがお楽しみですよ! AND NOT はすでに作ったので次は AND を作ります。 スイッチを直列つなぎにして equal リレーで切り替え。 NAND NOT と AND ができたということは……NAND が作れます!!!! AND の出力を反転…

回路の選択

早く先に進みたいのですが、今回も主にブログに貼る都合による修正です。 今までの作りだと実行時に 1つの回路だけしか動かすことができませんでしたが、 上の画像のようにドロップダウンで複数の回路から選択して切り替えられるようにしたい。 そこで、次の…

equal リレー

equal リレーを追加します。 not リレーのときとほとんど同じです。 テスト用回路はこう。 動かした様子です。 以下の iframe で実際に動かせます。 音量小さめにしていますが音が出ます。 こちらも同じものです。 https://sonota88.github.io/kairo-gokko/p…

見た目の修正など

先に進む前に見た目に関する修正をここでやっておきます。 今やらなくてもいいものばかりなのですが (実際にプロトタイプの時はどれも後回しにしていました)、 ブログ記事を書く都合による修正と、 ついでなので見た目まわりをいくつか修正します。 ブログ…

状態変更の伝播の過程を見たい

前回は状態更新処理をループさせることで 2段、3段とリレーが連なった場合でも動くようにしました。 前回の回路はうまく動きましたが、そういえば無限ループになる場合はないのでしょうか? あります。 たとえば次の回路では無限ループが発生します。 困った…

リレー 3

いやー、なにはともあれ NOT ゲートが動きましたね。 とにかく動くということが分かったので、ハリボテ部分をまともな形に修正していきます。 現状ではどこがハリボテかというと、リレーによるスイッチへの作用が2段階以上になる次のような回路が正しく動い…

リレー 2

前回は not リレーの表示まで実装しました。 今回は、リレーの通電状態が変わったときに隣のスイッチを切り替える部分を作りましょう。 汎用的なものを目指すのはいったん脇に置いといて、まずはこの回路を動かすことだけを考えて様子を探ります。最初はハリ…

リレー 1

リレーを追加します! リレーとは何か!? 説明しよう! リレーとは電磁石で(つまり電気による制御で)スイッチの ON/OFF を切り替える装置である。 以上。 あとはググッて調べてください。 ググりました? 分かりましたね? では次へ。 equal リレーと not…

ランプ

物理回路と違って導線自体が光って見えるため実用性という意味では必要性は薄めですが、 ランプを追加します。 通電していることがちょっとだけ分かりやすいとか、通電確認したい箇所を強調できるとか、光が灯るのは象徴的でよいとか言えなくもないですが、 …

タッチ操作対応など

スイッチ以外をクリックしたときにエラーになるのを修正 Circuit#find_switch_by_position を修正。 クリックした位置にスイッチがない場合に nil を返すように。 もっと早く直しておけばよかった……。 --- a/circuit.rb +++ b/circuit.rb @@ -328,5 +328,7 @…

Circuitクラスを改めて追加 / リファクタリングなど

test/helper を追加 テストのファイルが 2つに増えたので、共通部分を helper にまとめておきます。 # test/helper.rb require "minitest/autorun" $LOAD_PATH.unshift File.expand_path("..", __dir__) 各テストファイルの require 部分がこうなりました。 …

回路の分割 2

子回路へ分割の実装編です。 修正前はこうなっていたのを、 # class ChildCircuit def self.create(lines, rects) all_plus_poles = ... all_minus_poles = ... all_switches = ... wf_set = to_wire_fragments(lines) all_edges = to_edges(wf_set) ChildCi…

回路の分割 1

通電判定の説明で使った図を 2つ並べてみました。 たとえば 1枚の基板上(机の上とかでもいいですが)にこういうふうに並べて配置されている状況を想像してみます。 エッジについて通電判定するためにダイクストラ法を使って最短距離を求めることにしました…

通電 7

前回やや強引に通電判定エンジンができたということにしましたので、 アプリケーション本体に組み込みます。 ちゃんと動いてくれるでしょうか? エッジが 1本、 4本以外のときは未対応として例外を投げていましたが、 ここを update_many_edges() を呼ぶよう…

通電 6

さて、アイデアはアイデアとして、 問題はどうやって経路を辿るかです。 最初は データの整形 3 のときのように辿っていけばええんやろ? と素朴にやってみてたんですがうまくいかず……。 問題に向き合って正攻法でやらないとダメっぽい、 真面目に経路探索し…

通電 5

前回はエッジ 4本の場合の中でも限定的な配線パターンを対象に、それだけをなんとかする通電判定処理を作ってみました。 しかし、あのやり方ではすぐに行き詰まるでしょう。 エッジが 5本でも 100本でも解決できる汎用的な方法はないのでしょうか。 ふわふわ…

通電 4

前回はエッジ1本と複数のスイッチのケースまで対応しました。 今回はもう少し複雑なパターンとして、途中で分岐してスイッチが並列になっている回路の通電判定を考えます。 「並列つなぎ」というやつですね。 小学校の理科でやるレベルのものですから、さす…

通電 3

スイッチが複数ある場合に対応します。 これは全然大した修正じゃないので記事分ける必要なかったですね……。 --- a/circuit.rb +++ b/circuit.rb @@ -264,7 +264,7 @@ class Circuit end def update_edges - is_tuden = Tuden.tuden?(@switches[0]) + is_tud…

通電 2

次はもうちょっと複雑なパターンを……と思いましたが、 その前にエッジ 1本の通電判定処理だけ作ってみることにします。 動くものができるとモチベーションも上がるでしょう。 クリックでスイッチだけ状態を更新 スイッチの状態に応じてエッジの通電状態を更…

通電 1

見た目ばかり整えていても動きません。いいかげん本丸である通電に取り組みましょう。 いきなり難しいところから考えるといきなり手詰まりになってしまうので、 まずは簡単なところから始めます。 電気(回路)の知識に乏しいのと、こういうプログラムを作る…

スイッチを追加

導線と電池のプラス極・マイナス極だけでは寂しいですね。とりあえずスイッチを追加しましょうか。 まだ電気を流して回路を動かすことはできないので描画するだけです。 LibreOffice Draw で元データを作ります。 data_01.fodg の 4 ページ目を追加。 sw と…

dxopal_sdl.rb を使う

前の記事に書いた dxopal_sdl.rb を使う形に書き換えます。 ここは上記の記事に書いた通り。 --- a/main.rb +++ b/main.rb @@ -1,4 +1,13 @@ -require 'dxopal' +def browser? + Kernel.const_defined?(:Native) +end + +if browser? + require "dxopal" +el…

Ruby/SDLを使ってDXOpalをエミュレートする(自分が必要な部分だけ適当に)

DXOpal はブラウザで実行できるため、SDL などのネイティブなライブラリが不要で、他の人に見せやすいところが魅力的です。 しかし、実際開発してみるとブラウザで開いてから動き出すまでにそこそこ時間がかかったり、 デバッグまわりの勝手に慣れていなかっ…

マウスと効果音

「マウス操作も効果音もまだ必要にはなってない」と前回書きましたが、 せっかく DXOpal にしたのでちょっとだけやっておきます。 マウス とりあえずマウスカーソルの位置(x, y 座標)を取得して、表示に反映させてみます。 --- a/main.rb +++ b/main.rb @@…

描画部分をDXOpalに交換

手っ取り早く可視化したかったので Plumo を使ってきましたが、 Plumo はしょぼいのでマウスで操作したり効果音を出したりできません。 そこで、DXOpal を使って書き直します。 最近 DX 流行ってますしね(それは違うやつ)。 github.com まあ、マウス操作も…

前処理と実行に分ける

分けます。 今の段階でいえば、元データを整形して Unit::Edge や Unit::PlusPole に変換する部分が前処理、 描画部分が実行処理に当たります。 前処理(データの整形)の部分は LibreOffice Draw で編集して元データが変更されたときに 1回だけ動けばよい。…

Circuit, View

PlusPole, MinusPole 放置していた電池のプラス極・マイナス極をいい感じのオブジェクトにしておきます。 Unit::PlusPole Unit::MinusPole これまでは LiboDraw::Rectangle のオブジェクトをそのまま使って矩形を描画していましたが、 一度プラス極・マイナ…