|[[''前の日記''>日記/20070429]]|[[''次の日記''>日記/20070504]]| ~ これは4月30日〜5月2日までの出来事である(24風w)。~ *20070502 設計・実装開始 [#s23535b5] ~ **開発環境インストール [#l9d870f5] ''Visual C# Express''と''Visual C++ Express''をダウンロード・インストールします。~ http://www.microsoft.com/japan/msdn/vstudio/express/default.aspx SQL Server Express サーバはいらないです。~ Webからインストールするんですが、とても時間がかかりました。~ **クラス設計 [#raaa1507] #ref(archg.png,nolink); とりあえず、''お絵かき''では限界があるので、''優良''なのに''無償''で使えるUMLツール''JUDE''を使わせていただくことにします。~ ''無償''で使えるUMLツール''JUDE''を使わせていただくことにします。~ [[&ref(jude_banner0.png,nolink,JUDE);>http://jude.change-vision.com/jude-web/index.html]] ~ ~ サクサク作っていかないと。。(^^;)~ サクサク作っていかないと。~ ~ ***パッケージGraphic.Misawa2D.Parts [#o314ff1b] とっかかりはグラフィックから。1つ1つのグラフィックパーツです。 2Dのパッケージ名は数字からはじめられないので''Misawa2D''で。。。~ .NETのSystem.Drawingと同じクラス名だとまぎらわしいのでPrefix、M2Dを使います。これは某コーディング規約なんですが、ここでは省略します。どっかでとりあげられれば取り上げてみたいと思います。~ .NETのSystem.Drawingと同じクラス名だとまぎらわしいのでPrefix、M2Dを使います。これは某コーディング規約だけど、ここでは省略。~ #ref(class_parts.png,nolink); .NET Frameworkに依存しないように書いてみました。''C#''は''Java''に似ているので、後で''Applet''にも移植してみようという野心があります。JUDEでモデルベースで書いておけば、苦労せずにJavaに持っていけるかなー、と淡い期待があります。~ .NET Frameworkに依存しないように書いてみました。''C#''は''Java''に少し似ているので、後で''Applet''にも移植してみようという野心があります。モデルベースで書いておけば、苦労せずにJavaに持っていけるかな。~ ***パッケージGraphic.Misawa2D.Model [#f4b24920] #ref(class_model.png,nolink); 複数パーツを組み合わせてPathFinderを構成するクラスです。PathFinderの形状は今のところ1つだけです。~ **実装 [#c6c62027] &size(20){''3日かけて、Graphicパッケージ(とその周辺)の0版実装が終わりました。''ふぅ。};~ -''今回の教訓その1:マトリックス演算は''~ Utilクラスの座標変換にはマトリックスを使いますが、これを.NETが持っているものを使うか、自分でマトリックス演算を書くか最後まで悩んだ末、自分で書くことに。なるべく、便利な関数に頼らないようにやろうという方針をかためました。他に移植したいというのが目的です。2Dの場合は2x2のいわゆる行列演算なのでまだ楽です。~ Utilクラスの座標変換にはマトリックスを使いますが、これを.NETが持っているものを使うか、自分でマトリックス演算を書くか最後まで悩んだ末、自分で書くことに。なるべく、便利な関数に頼らないようにやろうという方針をかためました。Javan等、他プラットフォームに移植したいというのがねらいです。2Dの場合は2x2のいわゆる行列演算なのでまだ楽です。~ ~ |(x')=| |(cosθ -sinθ)|(x)| |(y')|~|(sinθ cosθ)|(y)| ~ こんな感じです。~ //位置ベクトルの回転 public static M2DVector RotateVector(M2DVector srcVector, double degree) { double radian = GetRadianByDegree(degree); M2DVector destVector = new M2DVector(); destVector.U = (srcVector.U) * Math.Cos(radian) - (srcVector.V) * Math.Sin(radian); destVector.V = (srcVector.U) * Math.Sin(radian) + (srcVector.V) * Math.Cos(radian); return destVector; } -''今回の教訓その2:プロパティを使うかどうか''~ C#にはCOMの時代よろしくプロパティという概念があります。アクセッサをメソッドを合理的に扱うというものですが、これを使うと便利なんですが、また移植性が。。。これは、まだ結論を出さないことにします。今日のところは使ってしまいました。~ ~ モデルベースといいつつも、コードそのまま流用ももくろんでいるのです。~ ~ こんな感じです。~ public double U { set { this._relativeU = value; } get { return this._relativeU; } } public double V { set { this._relativeV = value; } get { return this._relativeV; } } **実行イメージ [#p30ad351] デフォルメされたパスファインダーが動きました!~ #ref(pathfinder0.gif,nolink); ~ では、もう寝ます。 ~ |[[''前の日記''>日記/20070429]]|[[''次の日記''>日記/20070504]]| ~