回路で相互インダクタンスが出てきていろいろやってたりする。
まぁしかし、T型等価回路に変換すると-M[H]のインダクタンスが出てきたりするけど、
そんなものは現実にはないわな。
計算の世界ではこれが便利でも、実際に見れないのは残念な話だ。
さて、C#で何かとプログラムを書いています。
最近はC・PHP・Perl・C#といろいろ使いますけど、やっぱり役割は違いますね。
Web以外でPHPは使わないし、Cで書くのは実用的というより実験的なものばっかりだな。
まぁ実用的なものは、PerlかC#ということです。
ここでC#はオブジェクト指向というのが根底にあるんだから、やっぱりオブジェクトを扱いやすいね。
そんなわけでClassの大量製造だ。
さて、今回やってるのは障害物の置かれた座標上で、任意の2点の移動方法を調べるやつ。
ただし移動はX軸方向かY軸方向だけ。
まぁこういうことを考えるのに用意したClassはmapとvectorだ。
vectorというのは非常に重要だ。
C#には標準ではこの手のClassがないのは非常に残念。あったら継承して使うんだけどなぁ…
というわけでxとyに使う変数を用意して、プロパティーを作って、
+,-,*の演算子を定義して、IFormattableを実装しつつToStringを作っておいた。
もし標準でこの手のクラスがあったらここまでは省略できたな。
で、作業を簡単にするためにこんなStaticなメソッドを作った。
(0,5)という移動があったとき、この先に障害物がないか確かめないといけない。
そのためには(0,0)…(0.5)進んだところを確かめないといけない。(0,0)はいらん気もするけど。
移動のベクトルを渡したらその進んで確かめないといけない先を並べた配列をもらえるというもの。
こんなのforループ回せばいいじゃないかと言うかもしれないけど結構な手間だ。
そこでここからもらってこればこれだけでいい。
foreach(vector vc in autoarr(v)){
if(!mymap.check(p+vc)) return false;
}
なんかPerlのforeachの使い方みたいな気もするが、これはこれでありでしょう。
実際(2.3)に対して、(0,0)…(0,3),(1,0)…(2,3)というのを返せるようになってたりと、
有用な点はいろいろある。
まぁこんな道具を用意しておいて、mapのClassに、ルート探索のメソッドを考えながら作っている。
座標も移動も何もかもvectorで混乱しそうになるのは厄介だな。
再帰的にメソッドを呼び出すべきかとかいろいろ考えてるけどな。
最終的にはmapのそのメソッドを動かすだけで、ルートがvector[]でもらえるというのを予想している。
もしかするとファイル読み込みでmapを作成するときに自動的に算出して、結果を保存しておくようにするかもしれんが。
まぁどちらにしてもmapのことを知らない人でも、少しの操作でルートを得ることができる。
いくら苦労して作っても、これを見ないで使えると言うことです。いやはや、カプセル化って恐ろしいですね。
しかし今いろいろ書いてるが、オブジェクトの相互関係でプログラムを表してる気はしないな。
うーん…現在位置のClassでも作ろうかなぁ…そうすればスマートになるか?