|[[''前の日記''>日記/20070502]]|[[''次の日記''>日記/20070505]]| ~ *20070504 設計実装中 [#j6f71131] **Genericは便利です。[#i6f1cd0b] ちまたではGeneric医薬品が何かと話題ですが、C#でもGenericタイプが使えるようになりました。Javaよりやや遅れて。。コレクションでその恩恵にあやかることができます。~ C#でもGenericタイプが使えるようになりました。Javaよりやや遅れて。コレクションでは、わかりやすく、その恩恵にあやかることができます。~ private List<M2DVertex> _lstVertex; 型パラメータとしてM2DVertexを指定しますので、このListはM2DVertex用のリストということになります。いちいちキャストしなくて済むのでとっても便利な機能です。~ ただ非ジェネリックなリストが''ArrayList''で、ジェネリックなリストが''List''っていうのがしっくりきません。。。なぜなら、Javaでは''List''は''ArrayList''のインタフェースクラスなので。''GenericArrayList''というネーミングにすればよかったのに、と思いましたが。 型パラメータとしてM2DVertexを指定しますので、このListはM2DVertex用のリストということになります。いちいちキャストしなくて済むのでとっても便利な機能。~ ただ非ジェネリックなリストが''ArrayList''で、ジェネリックなリストが''List''っていうのがしっくこない。 Javaでは''List''は''ArrayList''のインタフェースクラスなので。''GenericArrayList''というネーミングにすればよかったのでは? ~ **クラス設計 [#c253d9ee] ***パッケージEtrobo.Simulator [#ue97f90e] パスファインダー、コース、論理的なモーターなどを設計します。~ #ref(class_sim1.png,nolink); と最初はこうしましたが、~ 無意味に一般化してもしょうがないので、下のような''妥協版''とすることにします。またSensorは分け合って独立事象にしました。~ 無意味に一般化してもしょうがないので、下のような''現実案''とすることにします。またSensorは分け合って独立事象にしました。~ #ref(class_sim2.png,nolink); あとでC++用にさらにWrapperをかぶせる予定なので、あまりしつこい設計にしたくないというのが今回の''妥協''の理由です。~ あとでC++用にさらにWrapperをかぶせる予定なので、あまりしつこい設計にしたくないというのが今回の''現実案''の理由です。~ ~ ***パッケージEtrobo.Kinematics [#k0b4a923] さらに、パスファインダーの動作を計算する運動学用(切り替え可能)のクラスを追加しました。切り替え可能ですが現状ではAggregateではなくNavigate扱いにしておきます。設計をややこしくしたくないので、物理計算を切り替えたいときはこのクラスのサブクラスをつくっていって、PathFinderからつかうときは、クラス名そのものを書き換えることにします。~ ModelBaseの''Model''は物理モデルを意識しています。 #ref(class_sim3.png,nolink); **実装 [#ab702ca6] ***親のコンストラクタでdelegate使うのはあり? [#o481f310] delegateを使って。トリッキーな継承をやってみました。~ 従来のC++とかだと、オブジェクトを作ってから、メソッドの関数ポインタを取得してきて、それを使用側であてがって使ったりしたところが、''delegate''と親クラスをあらわす''base''の柔軟性により1つにまとめて書くことができました。なんとなく地雷を踏んでいるようで怪しげなコードではあります。。~ 従来のC++とかだと、オブジェクトを作ってから、メソッドの関数ポインタを取得してきて、それを使用側であてがって使ったりしたところが、''delegate''と親クラスをあらわす''base''の柔軟性により1つにまとめて書くことができました。なんとなく地雷を踏んでいるようで怪しげなコードかも。。~ ''Motor.cs''~ using System; using System.Collections.Generic; using System.Text; namespace Misawat.Etrobo.Simulator { public class Motor { //SetMotorSpeedメソッドのデリゲート変数 SetMotorSpeed _func_SetMotorSpeed; //回転方向 1:正転 -1:逆転 int _direction = 1; //回転速度 int _speed = 0; public Motor(SetMotorSpeed func_SetMotorSpeed) { _func_SetMotorSpeed = func_SetMotorSpeed; } public void Foward(int speed) { _speed = speed; _direction = 1; _func_SetMotorSpeed((double)(_direction * _speed)); } public void Reverse(int speed) { _speed = speed; _direction = -1; _func_SetMotorSpeed((double)(_direction * _speed)); } public void Speed(int speed) { _speed = speed; _func_SetMotorSpeed((double)(_direction * _speed)); } public void Brake() { //TBD } public void Off() { //TBD } } } ''SteeringMotor.cs''~ using System; using System.Collections.Generic; using System.Text; namespace Misawat.Etrobo.Simulator { public class SteeringMotor : Motor { public SteeringMotor(PathFinder pathFinder) : base(pathFinder.SetSteeringMotorSpeed) { } } } ~ ~ ***Graphic.Misawa2D.Partsを振り返る [#uf125374] 昨日実装したところの修正をかけていて、クラス図の修正をしてみました。~ #ref(class_parts2.png,nolink); グラフィックパーツはそれぞれ子要素をもっています。1つのモデルをくみ上げるときには複数のグラフィックパーツの親子関係を設定してツリーを作っていきます。~ つまり、再帰的にツリーを構成していく部分(''build()'')を''compositeパターン''として実現しているので、昨日のクラス図に少し補足をいれておきました。~ **実行イメージ [#zeb40298] 赤い点が旋回中心、円が定常円旋回軌道です。~ ステアリングの角度に対して定常円旋回計算式は正常に動作したようです。~ 最後はステアリングの限界舵角を超えているので、旋回円は無効です。~ #ref(ani_radius.gif,nolink); ~ 明日は、コースとのインタラクションをやります。おやすみなさい。~ ~ |[[''前の日記''>日記/20070502]]|[[''次の日記''>日記/20070505]]| ~