2015年10月28日

[C#メモ]モンテカルロ法実験:不規則な図形の面積を求める

ヒューゴー賞2015受賞作品:The Three-Body Problem(三体問題)英語版を読了しました。非常に楽しい経験でした、ぜひ第二部も読みたいと思います。

本のレビューはここで割愛しますが、本のなかに「モンテカルロ法」というアルゴリズムに関する内容がありました。

モンテカルロ法はイレギュラーな形状の面接を求めるのによく使われるそうです。不規則な形状を規則な形状(まる、四角等)の中において、そして、その規則な図形に向けてランダムにボールを投げます。ボールが不規則な図形の中と外に落ちた個数の比例をもって、規則的な形状のトータル面積をベースに、不規則な図形の面積を算出する方法です。

浅い理解かもしれませんが、つまり、「ランダムはある一つの場所に集中することなく、均等だ」ということです。

自分はランダムに対して、数学だけだはなく、哲学的っぽくて、なんか興味があります。モンテカルロ法を勉強・実験するために、小さいプログラムを作りました。こんな感じです:

不規則な図形を四角いキャンバスにおいて、そのキャンバス全体にランダムの点を投げます。
(点を投げるよりは、画像の画素の色を調べることです。)
サンプルの個数とサンプリングする回数が設定されます。以下の例では1000個の点を10回繰り返し、その平均値をとります。この例で、図形の正確な面積=129060画素で、モンテカルロ法で算出された面積=129439画素で、僅差です。
当然、毎回の計算結果が違いますし、おおむねサンプリングの個数が多いほど正確値に近づきます。

MonteCarlo

メインなMethodだけここに貼ります。完全のソースはここからダウンロードしてください。

///<summary>
/// モンテカルロ法によって面積を算出する
/// ランダムに画像から画素をサンプリングして、、その画素の色を調べる
/// 色が付いている画素は図形内、色がついていない画素は図形外
/// そして、図形内外の画素の比例を通じて、図形の面積を推測する
///</summary>
///<param name="bm"></param>
///<returns></returns>
private async Task<int> GetAreaOfImageByRandomDot(Bitmap bm)
{
int total_W = bm.Width;
int total_H = bm.Height;
int total_A = total_H * total_W; //画像のトータル面積(画素数)求める
int countOfSamples = (int)numericUpDown1.Value;
int countOfInside =0; //図形内に落ちたランダムサンプリング画素数
int countOfOutside =0; //図形外に落ちたランダムサンプリング画素数
List<Point> lstUsedPoints =new List<Point>(); //一度サンプリングした画素は二度とピックアップされないように履歴を記録するリストを用意

for (int i =0; i < countOfSamples; i++)
{//サンプリング数に合わせてサンプリング作業を開始
await Task.Run(() =>
{//画面フリーズを防ぐために別Threadで作業する
Random rd =new Random(); //ランダム数発生器
Point pt =new Point();
while (true&& lstUsedPoints.Count < total_A)
{//まだ使われていない画素が見つかるまでにずっと探す。見つかったらWhileを脱出する。
//最初は「見つかるまでずっと探せ!」という意味だったので、
//条件はtrueだけだったが、すべての画素を採ってしまった場合はLoopから脱出できないので、もう一つの条件を付け加えた
//画像内からランダムに画素一つを選ぶ
pt.X = rd.Next(0, total_W);
pt.Y = rd.Next(0, total_H);
if (!lstUsedPoints.Contains(pt))
{//この画素はまだピックアップされていない場合:
Color color = bm.GetPixel(pt.X, pt.Y);//画素の色を調べる
this.picked++;
Graphics g =null;
if (this.checkBox1.Checked)
{
try
{
g =this.pictureBox1.CreateGraphics();
g.FillRectangle(Brushes.Purple, pt.X, pt.Y, 1, 1); //画像に印を記録する
}
catch { }
}
//if (color != Color.FromArgb(255, 255, 255, 255))
if (color.R <250|| color.G <250|| color.B <250)
{//白でない場合図形内
countOfInside++;
//if (g != null) { g.FillRectangle(Brushes.White, pt.X, pt.Y, 1, 1); }

}
else
{//白の場合は図形外
countOfOutside++;
//if (g != null) { g.FillRectangle(Brushes.Red, pt.X, pt.Y, 1, 1); }
}
lstUsedPoints.Add(pt);//すでに調べ済みの画素はリストに記録する
break; //一つの画素を調べることができたらもうWhileから脱出する

}
}
});
if (picked %200==0)
{//ProgressBarの刻みを決める、あまり頻繁に更新してしまうと、遅くなるため
this.progressBar1.Value = picked;
this.lblProg.Text = progressBar1.Value.ToString() +" / "+ progressBar1.Maximum.ToString();
}
}

   //図形内・外の画素の比例で図形の面積(画素数)を推測する
int areaCalc = total_A * countOfInside / countOfSamples;
return areaCalc;

}
posted by _ap at 00:12 | Comment(0) | C# | このブログの読者になる | 更新情報をチェックする

2015年01月25日

Windows 10 すごく便利な新機能:フォーカスなしスクロール

今日はWindows 10 Technical Preview Build 9926を入れてみました。

いろいろ改善点があるみたいですが、今のところ一番感動しているのは:

ウィンドウのフォーカス(焦点)が外れている状態でもスクロールできる!

ことです。

何が便利かというと、たとえば画面左半分をエクセルに右半分をウェブページにした

ときは、それぞれのフォーカスを切り替えずに、マウスのカーソルをその区域におくだけで、スクロールができるのです!

これによってウィンドウのフォーカスを気にせず、不要なクリックも省けます。

OneDriveの改悪に不満がありますが、このような細かい改善は評価します。

最終版の無料配信を楽しみにしています。

posted by _ap at 23:11 | Comment(0) | PC雑記 | このブログの読者になる | 更新情報をチェックする

2014年09月20日

[iPhone 6] 気圧センサー及び「上がった階数」について

iPhone 6は今日到着しました。
新しい「ヘルスケア」アプリでは歩数及び距離のほうがちゃんと表示されますが、「上がった階数という項目がなかなかデータなしのまま。1階と2階の行き来は何回もしてるのにな・・・
この「上がった階数」はiPhone 6に新たに搭載された気圧センサーを使って、高度による些細な気圧の変化で高度の変化を探知する仕組みです。もしかしたら2階は低すぎるからかな?と思ったのですが、毎日山を登るわけでもないから、アップルさんはきっと日常生活でも対応してくれるだろうと信じて、階段を上ったり下りたりテストしました。
結論は:(錯覚かもしれませんが)
iPhoneを手にして画面を見ながら階段を上ったり下がったりするのは計測されにくい。
逆にiPhoneをポケットに入れたままは計測されやすい。

推測ですが、おそらくこの「上がった階数」の計算は気圧だけではなく、ジャイロセンサーも関与しているかと思われます。なぜなら、手で持っているときは人間の脳の調整でiPhone本体の揺れ・振動が少ないからです。
実際、私は昼間に手で持って何回も階段を上りましたが、全然計測されず、先ほど夜にiPhoneをポケットに入れたままで同じ行動したらほぼ毎回計測されてます。
(汗をかいてしまったので、もう1回シャワーを浴びてきます。)
Flights_Climbed

posted by _ap at 22:54 | Comment(2) | iOS/Android | このブログの読者になる | 更新情報をチェックする

[メモ]iPhone 6 の充電ACアダプターの型番について

今日はiPhone 6無事到着しました〜

iPhone_6_Set
早速1点気になることがありましたので、メモしておきます。
それはACアダプターの型番です。まず私が購入したiPhone 4/5/6のACアダプターの型番を表にしました:
(以下、全部ソフトバンクです)

世代容量・色アダプター型番緑のシールの有無出力
iPhone 432G・ブラックA1265あり5V/1A
iPhone 532G・ホワイトA1265あり5V/1A
iPhone 664G・シルバーA1385なし5V/1A


私の購入経験で、今回だけはA1385になります。何が違うかを調べたところ、以下の情報がありました:
1、製造メーカが違うという情報
2、製造メーカが違う及び「満負荷時筐体の最大温度が違う」という情報:
(室温25℃時の大よそ数値)

A126556.5℃
A138545.4℃


なるほど、A1265のほうが少し熱いそうですね。
なお、上記2の情報源によると、A1385のほうが内部レイアウトはもっとシンプルで、組み立てももっと整然としているようです。
まあ、いずれもアップルの正規品なわけで私は違う部屋で両方使うつもりです。

posted by _ap at 22:19 | Comment(0) | iOS/Android | このブログの読者になる | 更新情報をチェックする

2014年09月10日

<iOS 8の新機能> 写真&カメラ アプリ:ここが変わった! (iPhone 5)

こんばんは。 早速iOS 8 GM版にアップしました〜♪
(非常に高い確率で正式版になるバージョンです。)
まだいろいろと体験中ですが、早速写真カメラアプリの変化をまとめてみました。
アップルのホームページでも紹介がありますので、ここでは自分が気になる点だけになります。

◆カメラロールとフォトストリームはどこに?

以下の画像のように「最後に追加した項目」に今使っているデバイスで撮った写真と、同じiCloudアカウントでリンクされているほかのデバイスで撮った写真が全部この中に入ります。
以前のように別々のアルバムに分けられて一目瞭然ではなく、2種類の写真はごちゃ混ぜになります。しかもあまり区別付かないです。
まだ調べているところですが、旧フォトストリームのようにサーバーに1000枚の写真の制限がなくて、5GBのフリースペースいっぱい保存できるそうです。
そして、5GBを全部使いきったらどうなるか、今のところはまだ分かりません。あと、iCloudサーバーにある写真はどのようなルールでデバイスにダ自動ウンロードされるかもまだ理解できていません;;
Picture_Album

先ほど書いてありますように、どの写真がサーバーに保存されているか、どの写真がデバイスに保存されているかは一見では区別が使いようですが、一応以下の方法で判断できます:

Picture_Fav_Comp

つまりローカルにある写真はお気に入りに保存できますが、サーバー側の写真はできません。お気に入りにするために、一度保存する必要があります。

Picture_Save

・保存するボタンです。

◆ゴミ箱が新設されました〜

RecycleBin
「最近削除された項目」が追加されて、間違えた写真を復元することができます。ずっとほっといたら30日後に自動削除されます。

◆写真の編集機能が強化されました〜

フィルター、角度、切り取り等、ずいぶん豊富になった気がします:

Picture_Edit Picture_Edit_Adjust Picture_Edit_tilt Picture_Ratio

 

◆カメラ機能もレベルアップ!

・撮影中に画面をタッチしたら黄色い太陽のマークが出てきて、上下にスライドしたら明るさを調整できます。
Camera_Light

・撮影タイマーが追加されました。 3秒か10秒を選べます。
Camera_Timer

・新たにタイムラプス機能:一定の時間間隔で連続撮影できます。雲の動きの撮影など、いろいろと使えそう。
Camera_Timelaps

以上、 iOS 8の写真とカメラはこんな感じです。2年前のiPhone 5でもアップデートできてうれしいですね!

posted by _ap at 22:41 | Comment(0) | iOS/Android | このブログの読者になる | 更新情報をチェックする

2014年07月09日

[Objective-C/Cocoa学習メモ]delegate/protocolの使い方についてのまとめ

Swiftも出てきたし勉強しようかなと思ってオフィシャルのiBookを読んでみたらさっぱり分からん;;
やっぱり古い(現役の)方のObjective-Cも分からなかったら比較しようがないし、Cocoaという基礎の仕組みをある程度知っておかないと、プログラミング言語だけ勉強しても何を駆使してどんことができるのかが分かりようがありません。
ということでとりあえず現在のObjective-CとCocoaのコンビをある程度勉強しとこうと思って、Aaron Prebleさんの「Cocoa Programming for Mac OS X」という本を読みだしました。iPhoneのプログラミングではなくOS Xを選んだ理由はAppleの開発者アカウントを持ってないから実機でのテストはほぼできないからです。
忘れないうちにメモしておきたいと思います。自分はともかくプロのプログラマを目指してなく、ただの娯楽でやっているつもりなので、理屈が通じていて動作すれば文法等を厳密に考えていません。もし参考にする方がいらっしゃればそこら辺ご注意ください。
今日はdelegateの使い方についていくつかポイントをメモしたいと思います。

1)delegateとprotocolは何なのか
いろんな本にいろんな定義があるので、ここでは自分の理解を自分のことばで記しておきます。
delegateは委託先の人でprotocolはその人が持つべき資格(できること)と理解しています。
たとえば、会社Aが来月の仕事予定を組んでいます。その仕事はパートさんが必要とします。パートさんは来月にならないと募集しませんけど、今はとりあえず「その時になったらパートさんがいる」という前提で予定を組みます。
そのパートさんはdelegateで、そのパートさんができることはprotocolに当てはまります。
この仕組みのおかげで、パートさんが今いなくても予定が組めますし、違うひとになってもできることが一緒なら人が変わっても計画を変えずに済みます。

続きを読む
posted by _ap at 22:55 | Comment(0) | Objective-C/xcode/Cocoa | このブログの読者になる | 更新情報をチェックする

2014年05月21日

[アンドロイド]超朗報〜 ESファイルエクスプローラーOTGサポートキタ〜!(Root不要、無料)

Nexus 7(2013)をつけてみたらGoogle Playからアプリ更新の通知がきました。
久しぶりにESファイルエクスプローラーでないか、と、さらに更新履歴を見てみたら、

V3.1.4

-Support OTG devices(FAT32, no root required)

-Mount device when needed

-Support backup system apps

おおお、すげぇ〜 待望のOTGデバイスのサポートが来た〜〜、しかもrootも不要? もしかしたら読み込み専用とか?と半信半疑に早速使ってみました。
結果としては:
1、確かにルート化は不要、FAT32のみサポート、USBフラッシュメモリーでもSDカードリーダーでもOK
2、USBデバイスが接続されたらちゃんと教えてくれる
3、USBデバイスはフォルダーとして表示される
4、フォルダーの作成、ファイルのコピー、貼り付け、移動、削除等、内蔵メモリと同様に操作可能
OTGケーブルをずいぶん前に買いましたけど、ずっと出番がなくて、やっと使えるようになります。無料なのにここまでしてくれて大変ありがたいです。
ESファイルエクスプローラーさん、ありがとうございます。
Google Playからダウンロードできます:
https://play.google.com/store/apps/details?id=com.estrongs.android.pop&feature=related_apps
以下はスクリーンショットです:

ES_USB_Firsttime

ES_USB_SidebarES_USB_label

 

ES_USB_optr

posted by _ap at 23:10 | Comment(0) | iOS/Android | このブログの読者になる | 更新情報をチェックする