ボタンを押したらメッセージボックスが表示されるだけの単純なものです。 Visual Studio を使わずに、コマンドラインで MSBuild を使って XAML Windows アプリケーションを作りたい場合の雛形にどうぞ。
C# でもやってるんですけど( 「ラインアート」 )、 僕は GUI 開発環境の提供されているプログラミング言語を新しく覚えるたびにラインアートを作っています。 (比較とか勉強のため、とりあえず作る。)
(でも、「スクリーンセーバーっていったらラインアート」ってのも、 もうだいぶ昔の話ですが。 最近は 3D テキストか Windows ロゴ? まあ、Windows の出荷時のデフォルト設定で、 「スクリーンセーバーを使用しない」にするだけで、 全世界で消費される電力がかなり減るって言うような話を聞いたこともあるんですが。)
で、コードなしの Loose XAML だけでラインアートを作れそうな感じがしたんでやってみました。
バブルチャートの3次元版、ようするに、 値に応じた大きさのバブルを3次元に表示するプログラムが欲しかったので作ったもの。 現状の WPF の System.Windows.Media.Media3D では、三角メッシュしか使えないみたいなので、 バブルは球状じゃなくて正8面体で妥協。
今回使った機能は、以下のような感じ。
ソースファイル(zip形式書庫) … テスト用に、球面上のランダムな位置にランダムな大きさの正8面体を200個ほど配置したもの。
XAML ファイル … コードビハインドなしの、XAML のみ。固定位置に同じサイズの正8面体を6つ配置したもの。(セキュリティ権限上、ブラウザ中で直接実行付加。一度ローカルに保存してください。)
後輩に、「任意に与えられた点を全て囲む面積最小の長方形を求めたいんですが」と言われてノリで作ったもの。 せっかくだからサンプルプログラムとして公開。
「全点囲む最小の長方形」は以下の条件を満たしてそう。
なので、以下のような処理で「全点囲む最小の長方形」を計算可能。
1 は、Graham 走査という有名なアルゴリズムがあるのでそれを利用。 2 は、向きが決まっていれば、辺から点までの距離が法線との内積で求まるので、 面積最小の長方形は簡単に求まる。
↑のアルゴリズムの確認のために、 以下のような GUI プログラムを作成。
GUI の作成には Windows Presentation Foundation を使用。 点や凸包は、 System.Windows.Shapes 名前空間内の、 Ellipse や Polyline を使用。
ちなみに、最初プログラムを作った目的は、 求めたい長方形が本当に凸包に接してるのか、証明するのが面倒だし、 総当りで試してみようというものです。 (長方形を0.01ラジアン刻みとかで回転させて、 その向きの面積最小の長方形を総当りで求めて、 最小のものを選択。)
その後、後輩が調べてきた所によると、 「全点囲む最小の長方形」はやっぱり凸包の辺に接してるみたい。 証明の書かれた論文あり↓
あと、凸包を囲う長方形の求め方、 もっと効率いい方法がありそう↓
最小二乗法でフィッティングできるようなデータ列が2種類異常混ざっているような場合に、 n 本の回帰直線を求めるプログラム。
注: 画面コピーは結構うまく行った例。 実際にうまく行くかどうかはデータ列次第です。 混ざってるのが2種類(回帰直線2本)くらいなら割とうまく行きますが、 6本でここまでうまく行くことはそう多くない。 あと、回帰直線を何本くらい使えばうまくクラスタリングできるかを自動計算したりという機能はないです。
クラスタリングと最小二乗法を組み合わせで実装しています。
要するに、 回帰直線をクラスタ重心と考えて、
の2つの処理を反復。
でも、クラスタ重心が点の場合と比べると、局所解に陥りやすいみたいです。 それを解決するような研究報告例あり↓。
乾 健太郎,金子 俊一,五十嵐 悟: “LMedSクラスタリングに基づく複数直線のロバスト回帰,” Technical report of IEICE. PRMU, Vol.99, No.449(19991119) pp. 81-86.
せっかく Orcas(Visual Studio の次期バージョンのコードネーム)の新β版が出たことだし (2007/4末)、 なにか WPF を使ったプログラミングをしてみたくて作ったもの。
ちょうど最近、 「力学」 の辺りを更新していたことだし、 3次元空間中の曲面上の物体の運動をシミュレーションして、 Viewport3D を使って3次元表示するプログラムを作ってみた。 (参考: 「曲面上の運動」 。)
Orcas で作ったので、Visual Studio 2005 だとコンパイルが通らないかも。 多分、using System.Linq とかをコメントアウトするくらいでコンパイルできると思いますが。
ソリューション内にいくつかのプロジェクトがあって、 数値計算がらみは MyMath プロジェクト中にまとめています。
拘束面の式(
x(u, v)=1.5 v cos u
とか)だけ与えれば、
とか、
ハミルトニアンやその導関数は自動的に計算してくれるものを作りました。
∂x ∂u
そのために、 以下のような感じで使える Lambda 計算的なライブラリを作りました。 (MyMath.Lambda 名前空間内。)
Variable u = new Variable("u"); Variable v = new Variable("v"); Function x = 1.5 * v Function.Cos(u); Function x_u = x.Differentiate(u); double uu = 0.1; double vv = 2; double xx = x_u.GetValue(u.Set(uu), v.Set(vv));
ただ、あまり賢くはないです。
(u * v) / u が約分されて v になってくれたりはしないので、
分母の値が小さくなりすぎて精度が落ちることがしばしばあります。
あと、分母分子が共に 0 になって、結果が NaN になることもたまにあります。
4次のルンゲクッタ法を使ってハミルトンの微分方程式を解いています。 (MyMath.DifferentialEquation 名前空間内。)
数値計算結果を3次元的に表示するユーザコントロールを作りました。 (Plot3D プロジェクト。)
Viewport3D(参考: 「3次元モデル」 )を使って、 拘束面と物体を表示します。
拘束面の裏面も見えるようにするために、 面と物体を回転させています。 コントロール上を右クリックすると、回転を一時停止・再開できます。 また、左クリックで、カメラの向きをある程度変化させることができます。
実例として、下図に示すようなプログラムを作りました。
この実行画面の例では、 拘束面の方程式を
ポテンシャルを φ = z として物体の運動をシミュレーションしています。
ちなみに、Lambda 計算の精度の問題で、 時々数値計算結果がおかしくなることがあります。 というか、拘束面の式にあまりに複雑なものを指定すると、 すぐにおかしくなります。 まあ、実用目的じゃなくてデモ用だと思ってご容赦ください。