FC2ブログ

Reactive Extensions

C#にてイベントを制御する際に「Reactive Extensions」に興味を持ったので調べてみた


【まずはインストール方法】
プロジェクトを右クリック → NuGetパッケージの管理 から Reactive Extensionsを探してInstall


【イベントの扱い方】
Rxでイベントを扱うためにはIObservableオブジェクトの作成が必要
Observableクラスにstaticな生成関数が用意されている
調査してみると
FromEvent
FromEventPattern

の二種類がある

二つの関数を歴史的にみると名前が置き換わってたりしていて結構ややこしい
似たようなことをしてるけどFromEventPatternのほうがすっきり書けることが多い

マウスダウンイベントをIObservableオブジェクトへと変換する場合以下のようになる

Observable.FromEventPattern
var mouseDown = Observable.FromEventPattern(this, "MouseDown");

Observable.FromEvent
var mouseDown = Observable.FromEvent(
h => (s, e) => h(e),
h => this.MouseDown += h,
h => this.MouseDown -= h);



【ドラッグ中に座標表示&離したらCompletedと表示するサンプル】
var mouseDown = Observable.FromEventPattern(this, "MouseDown");
var mouseUp = Observable.FromEventPattern(this, "MouseUp");
Observable.FromEventPattern(this, "MouseMove")
.SkipUntil(mouseDown)
.TakeUntil(mouseUp)
.Finally(() => textBlock.Text = "Completed")
.Repeat()
.Select(e => e.EventArgs.GetPosition(null))//座標を送る
.Subscribe(p => textBlock.Text = string.Format("X: {0}, Y:{1}", p.X, p.Y));
SkipUntil = 引数のIObservableから値が発行されるまで通行禁止
TakeUntil = 引数のIObservableから値が発行されるまで通行許可
Finally = 一連の処理が終わったタイミングで実行される
Repeat = Until系の制御を復活させるために追加(Finallyの後ろじゃないとダメ)

圧倒的にシンプルに書ける・・・ラムダ式との相性も抜群ですな
Doメソッドで目的のタイミングに処理を追加できるので、画面外でもキャプチしていたい場合は以下のようになる
.SkipUntil(mouseDown.Do(_ => this.CaptureMouse()))
.TakeUntil(mouseUp.Do(_ => this.ReleaseMouseCapture()))


【時間制御まわり】
イベントを流す際に時間を制御するものも豊富に用意されている
例)
Delay = 遅れて流す(指定時間経過してから流す)
Throttle = 落ち着いたら流す(指定した時間内に値がなければ値を流す)
Buffer = まとめて流す(指定時間内は値を溜めて最後にまとめて流す)
Timeout = 観測時間にリミットを付ける(指定した時間内に値がなければエラーにする)


【ファイルの更新監視サンプル】
FileSystemWatcherは書き込み時に複数のChangeイベントが発生して制御が面倒
そんなときはRXで解決!
var watcher = new FileSystemWatcher("C:\\", "test.txt") { EnableRaisingEvents = true };
var changed = Observable.FromEventPattern(watcher, "Changed")
.Throttle(TimeSpan.FromSeconds(1))
.Subscribe(_ => hogehoge);
Throttlenにより書き込みが落ち着いた時点でイベントが発行される




Rxはちょっと資料が少ないけれどかなり強力なライブラリなので今後も要チェックかも
日本語資料が少ない中、こちらのサイトにはお世話になりました
感謝感謝

ねよっと。

乗算の計算式

プログラム上での乗算ブレンドの計算式

bg=背景 add=重ねるテクスチャ a=アルファ値
( add - bg ) * a + bg
bg * (1 - a) + add * a とも書ける

ベクトルで考えると忘れないことに気付いた
・・・けどそのことを忘れるのでメモしておいた

ねよっと

SQLの勉強

DBに関する勉強をする機会があったのでSQLの仕組みを忘れないようにざっとメモ。


SELECT 抽出する項目を指定
FROM どこのテーブルを使うか (AS ~で名前を置き換え)
INNER JOIN 他のテーブルがID等で紐付いていて条件に含めたいときに使う ※
WHERE 抽出するものを条件で絞る
AND WHEREだけで条件が書ききれない場合はANDで繋ぐ
ORDER BY 昇順
LIMIT 抽出する数


※WordPressのカスタムフィールドがいい例
INNER JOINはIDが両方のテーブルに存在するものだけ抽出する
JOINしたテーブルにIDが存在しないものも抽出したい場合はLEFT JOIN を使う(NULLが割り当てられる)


WordPressで使うときの例
SELECT p.ID
FROM $wpdb->posts AS p
INNER JOIN $wpdb->postmeta AS meta ON meta.post_id = p.ID AND meta.meta_key = 'カスタムフィールド名'
WHERE p.post_status = 'publish' //公開中だとか~
AND p.post_type = 'post' //投稿の種類で条件を絞ったり
ORDER BY cast(meta.meta_value as unsigned) DESC //カスタムフィールドをCastして昇順の条件にしたり~
LIMIT 5 //5件取り出す


ねよっと。

modoや3dcoatでUV反転

UV反転を行う時の覚書

いろんな方法があるしバージョンによっても解説が違うので検索するといつも混乱するUV反転
最近は使えるテクスチャサイズも増えたし反転したUVを重ねるなんてことも少ないのかもしれないけど・・・


以下自分の方法です


~modo701~
・反転軸を選択
・メニューの「頂点マップ」から「鏡面」を選択してコピー先に新しいUVを作成
・反転したい部分を選択
・UV編集コマンドである「UV位置をコピー」「UV位置を選択に貼り付け」を使いUV間を越えてコピペ



~3D-Coat~
・反転したいUVの塊を選んでCtrl+C
・貼り付けたいUVを選んでCtrl+V

※同じ形をしていないとこの機能は使えない
↑で言うところの塊ってのはUVプレビューウィンドウにある島(英語版だとアイランド)って概念のことです


ねよっと。

三角形の内分点の比率について

三角形の内分点の比率について

適当な三角形ABCの中に適当な点Pがある
このとき、BH:HC と AP:PH について考えてみる 
使う知識は、二つのベクトルの外積のノルムはそのベクトルで作成する平行四辺形の面積と等しいということだけ。
math_1.jpg

まずBH:HCについて考える
この比率は以下の三角形の面積比と等しくなる
math_2.jpg

この比は↓の三角形の比とも等しくなる
math_3.jpg
この三角形は外積を利用して求まるので以下の比であらわせる


このことから  となる




AP:PHについてはパッと見少し分かりにくいけど以下の図形の面積比と同様になる
math_4.jpg
よって  となり

 が導ける
プロフィール

あしゅ

Author:あしゅ
ぷぃぷぃ日常。
いつのまにか雑記ブログに。

カテゴリ
最新記事
検索フォーム
最新コメント
リンク
このブログをリンクに追加する
ブロとも申請フォーム

この人とブロともになる

カウンター