ikarosの作業場

飛行機の設計もできる系のCshaper。「なおこの記事は個人的見解であり、所属する組織の意見とは一切関係がありません」と書かざるを得なくなった悲しみを知れ

UIElementsをタッチ操作をする(Windows UI/Windows Store Apps向け)

今日は物理シミュに関連すること。いろいろ忙しいので手短に行きます。ご了承ください
物理シミュなんで物体を生成したのち動かしたりする動作が必要となります
Tappedイベントなどを用いて一つ一つ動きを定義することもできますが、今回はWindowsに標準搭載されている
Manipulation系の機能を使いたいと思います

今日は動きだけ実装してみましょう

        private TranslateTransform _translation;
        public MainPage()
        {
            this.InitializeComponent();
            this._translation = new TranslateTransform();

            //動かすUIElement
            TextBlock test = new TextBlock();
            test.Text = "test";
            test.Margin = new Thickness(200, 200, 0, 0);


            test.RenderTransform = this._translation;
            test.ManipulationMode = ManipulationModes.All;
            //イベントを追加
            test.ManipulationDelta += test_ManipulationDelta;
            MainGrid.Children.Add(test);
        }

        private void test_ManipulationDelta(object sender, ManipulationDeltaRoutedEventArgs e)
        {
            this._translation.X = e.Delta.Translation.X;
            this._translation.Y = e.Delta.Translation.Y;
        }

ManipulationDeltaはクリックしたりタッチしたりして動かす時に動作するイベントです。
今回は物体の動きを制御するRenderTransformのX,Yをそのイベント内で動かすことで慣性が載った直観的な・スムーズな動きが可能になります。
また複数のUIElementsを動かす時はその数に応じたTranslateTransform変数が必要となります。

アルゴリズム入門:不変条件

さて一週間ぶりの投稿
今回は前回もちらっと出てきた残酷模試から題材をとりました。

残酷模試の数学の問題でこんな問題が出ました
(筆者の方で一部改変・抜粋しております)

(nとkは1以上の正の整数とする)
n枚の表と裏の区別があるカードが存在する。そのカードを最初にすべて表にして並べ、
k回目の操作ではk枚のカードを任意に選んで裏に返すという操作を続けていくとする。
nが4で割ったとき1・2で余る数の時、n回目の操作の後すべてのカードが表にならないことを証明せよ

まともに考えると大変そうですね

さて、すべてが表になるということはすべてのカードをひっくり返す回数が偶数回であったということですね?
これに対しn=4m+1(mは整数)とおくと、n回目の操作終了後までにカードをひっくり返す回数というのはシグマ計算から
(2m+1)(4m+1)回なのでそうひっくり返す回数は奇数になるわけでございます
したがってすべてのカードは表にならないということなのです。
同様にしてnが4で割ったとき2余る数の時も証明することができます。

このような考え方はしばしば計算機科学においても通用する理屈であるわけです。
そこで今回の「すべてのカードが表になるためにはすべてのカードのひっくり返した数が偶数でなくてはならない」
というような条件のことを不変条件というわけなのです

数学的に有名なところを見ると「ケーニヒスベルグの橋の問題」などが有名でしょう
f:id:ikarostech:20150606202448p:plain
上の図形の通路を二回通ることなくすべての通路を通れるかという問題ですが
一筆書きにおいては「通路が奇数個のびる青い点が2つ以上あってはいけない」という不変条件より
この橋の問題は解けないことがわかります(不変条件の証明は省きます)

ではこれがプログラミングに何の役に立つの?というあなた!
このパズルが解けるか解けないかを吟味するには不変条件なしではきついと思いますよ?
でないと解決できないパズルを生成してしまうことだってあるのです

この15パズル(空欄に数字が移動していくあれ)は解けるか

f:id:ikarostech:20150606204142p:plain

当サイトのソースコード及びその他の情報は個人・商用問わず自由に使っていただいてかかまいませんが、当サイトの情報が元で発生したいかなる結果・不利益については責任を負いかねますのでご了承ください