【第三弾】iOSアプリ(ゲーム)を作りました

ネコシールドというiPhoneアプリを作りました!
https://itunes.apple.com/app/cat-shield/id725311638?l=ja&ls=1&mt=8

本当はM字開脚した猫をキャラクターとして登場させたかったのですが、
Appleからキャラクターが不適切ということでリジェクトされたという。。。
Ver1.0.0のApp Storeのスクショはその名残です。

iPhoneのアラートビューとアクションシート

IBでレイアウトして作らない系のやつ

アラートビュー

// アラートビューを作成
UIAlertView *alert = [[UIAlertView alloc]
                      initWithTitle:@"タイトル"
                      message:@"実行しますか?"
                      delegate:self
                      cancelButtonTitle:@"Cancel"
                      otherButtonTitles:@"OK", nil];

// アラートビューを表示
[alert show];
/**
 * アラートのボタンが押された時に呼ばれるデリゲート
 */
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
    if (buttonIndex == 1) {
        // ラベルにOKと表示
        myLabel.text = @"OK";
    } else {
        // ラベルにCancelと表示
        myLabel.text = @"Cancel";
    }
}


アクションシート

// アクションシートの作成
UIActionSheet *actionSheet = [[UIActionSheet alloc]
                              initWithTitle:@"タイトル"
                              delegate:self
                              cancelButtonTitle:@"キャンセル"
                              destructiveButtonTitle:@"赤いやつ"
                              otherButtonTitles:@"普通のやつ1", @"普通のやつ2", nil];

// アクションシートの表示
[actionSheet showInView:self.view];
/**
 * アクションシートのボタンが押された時に呼ばれるデリゲート
 */
- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex
{
    switch (buttonIndex) {
        case 0:
            myLabel.text = @"赤いやつ";
            break;
            
        case 1:
            myLabel.text = @"普通のやつ1";
            break;
            
        case 2:
            myLabel.text = @"普通のやつ2";
            break;
            
        default:
            break;
    }
}

イングロリアス・バスターズを見てみた

いつもは観賞メーターに感想を書くのですが、長すぎて書ききれなかったのでここに書いておきます。

イングロリアス・バスターズ
まず最初にこの素晴らしい映画を撮ったクエンティン・タランティーノ監督に謝罪の意を表明したい。この映画を見るまで最近のタランティーノは才能が枯渇したよねー。と申しておりました。殴られた記憶もろくにないくせに申し訳ございませんでした。

さて、イングロリアス・バスターズは「ナチスに家族を殺されたユダヤ系の少女」と「ドイツ占領下のパリに潜入し、ナチスの軍人を始末する部隊"バスターズ"」の2つの軸を持つ群像劇である。
この映画からテーマを読み取ることは難しい。(あるいは無いのかもしれない。)
なぜならばイングロリアス・バスターズナチス・ドイツを題材にしているが、いわゆる「戦争映画」の下敷きを敷いていない一風変わった構成になっているからだ。
主人公の一人であるショシャナ(メラニー・ロラン)に焦点を当てれば復讐劇であるが、もう一人の主人公であるアルド・レイン中尉(ブラピ)に焦点を当てるとまた違ったジャンルとなる。そしてこの映画は悲劇でもなければ喜劇でもない。

だかといってイングロリアス・バスターズは決して中途半端な作品ではない。まだ見ていない人のためにネタバレは差し控えるが、ストーリーが練り込まれており、映画としての「見せ方」も素晴らしい。そして登場人物の粋な言葉のキャッチボールは涎モノである。いや、お見事。

私はタランティーノ作品の中ではパルプ・フィクションが最も好きだ。今まで見た映画の中でBEST10を決めるとしたら、その中にパルプ・フィクションは必ず入れる。
このイングロリアス・バスターズパルプ・フィクションに勝るとも劣らない傑作である。

以前使用していたC言語のシンプルな拡張数学ライブラリ

以前使用していたC/C++用の拡張数学ライブラリ(といってもかなりシンプルですが)を公開します。
コードはANSI-Cで書いています。幾何学系が多めですが、行列演算等は(他のライブラリを使用していたため)サポートしていません。
ベクトルは配列で表現しています。

ソース
https://github.com/kojo-sugita/mathex.h

サポートしている機能

関数概要
Summation総和を計算する
SumOfSquares平方和を計算する
SumOfProduct積和を計算する
Average平均値を計算する
Variance分散を計算する
UnbiasedVariance不偏分散を計算する
Covariance共分散を計算する
StdDev標準偏差を計算する
Max最大値を求める
MaxInt最大値を求める(int型配列)
Min最小値を求める
MinInt最小値を求める(int型配列)
MaxMin最大値と最小値を求める
Factorial階乗を計算する
Permutation順列組み合わせの総数を計算する
Combination組み合わせの総数を計算する
Distance2点間の距離を求める
DivideInternally2D2点p1,p2からなる線分をm:nに内分する点を求める (2次元)
DivideExternally2D2点p1,p2からなる線分をm:nに外分する点を求める (2次元)
Triangle_CenterOfGravity3点p1,p2,p3からなる三角形の重心を求める (2次元)
ToVecto2点を結ぶベクトルを求める
VectorSumベクトルの和を求める
VectorDifferenceベクトルの差を求める
Normベクトルの長さ(ノルム)を計算する
InnerProductベクトルの内積を計算する
IncludedAngle2つのベクトルのなす角を計算する
UnitVector単位ベクトルを求める
NormalVector3D3次元の法線ベクトルを求める
CrossProduct3D3次元ベクトルの外積を計算する
VectorSimilarity2つのベクトルの類似度を計算する
NormalizedVectorDistance正規化距離を計算する
IsDepthOnLine3D3次元空間上の点p1と点p2を結ぶ直線上に点pが存在するかを判定する
CalculatePlane3D3次元平面を作成する
CalculatePlane3D_Using3Depths3点から3次元平面を作成する
ToLineCanonicalForm直線の方程式を標準形から一般形に変形する
ToPlaneCanonicalForm平面の方程式を標準形から一般形に変形する
ToPlaneGenericForm平面の方程式を一般形から標準形に変形する
DistanceLineToDepth点と直線との距離を返す
DistancePlaneToDepth点と平面との距離を返す
IsCorrectPlane2つのベクトルからなる平面がよい平面かを判定する
Arg第1象限から第4象限までの偏角を求める
ZenithAngle天頂角を求める
Sigmoidシグモイド関数を計算する
pi円周率を求める
to_deg弧度法表記を度数法表記に変換する
to_rad度数法表記を弧度法表記に変換する
logn任意の整数を底とする対数を計算する
cbrt_newtonニュートン法で立方根を近似する
frac除算を計算する


バグがあったらごめんなさい。使用する際は自己責任でお願いします。
もっと複雑なことをしたい場合はGSLがおすすめ。

HTML5+JavaScriptで画像処理 ハーフトーニング

HTML5JavaScriptでハーフトーニングをしてみました.

実行ページ
http://jstap.web.fc2.com/test/html5/halftoning/halftoning.html
※ 濃度パターン法は低速なので注意してください.

ソース
http://github.com/kojo-sugita/Halftoning

ハーフトーニングとは多値階調を持つ画像を2値(あるいは少ない階調)で表現する方法のことである.
マンガのスクリーントーンやモノクロプリンタで出力された画像などがまさにソレで点の密疎で濃淡を表現する.
今回実装した手法は以下の3通り.いずれも基本的な手法である.


濃度パターン法 (density pattern method)
画像の1画素に対して複数画素からなる2値表現のパターンを割り当てて濃淡を表現する手法.
例えば1画素を4×4のパターンを割り当てると擬似的に17階調の表現ができる(下記図参照).

割り当てる濃度パターンを4×4,現画像をN×M画素とすると出力画像は4N×4M画素になる.

実行結果

※ 前述のとおり画像サイズが大きくなるため一部抜粋


ディザ法 (tither method)
ディザパターンと呼ばれるN×Nの行列を用意しておく.
ディザパターンの値と現画像の各画素の輝度値を比較し,その大小関係でその画素を白にするか黒にするかを決定する.

1. 画像をN×N画素(ディザパターンのサイズ)のブロックに分割する
2. ブロック内の各画素がディザパターン内の対応画素値×16 + 8以上なら白,未満なら黒を割り当てる

実行結果


誤差拡散法 (error diffusion method)
ある画素の輝度値と,その画素を2値化した値との誤差を周辺画素に分散させ,誤差をキャンセルするように未処理画素の輝度値を修正しながら2値化していく手法.

fを対象画素の輝度値,gを出力画素の輝度値とする.

1. 誤差eを以下のように決定する.
 f > 128 のとき・・・g = 255
 f <= 128 のとき・・・g = 0
 e = f - g

2. 誤差eを周辺画素に分散させる.
 f'(x + 1, y) = f(x + 1, y) + (5/16)e
 f'(x - 1, y + 1) = (x - 1, y + 1) + (3/16)e
 f'(x, y + 1) = f(x, y + 1) + (5/16)e
 f'(x + 1, y + 1) = f(x + 1, y + 1) + (3/16)e

実行結果

誤差拡散法が一番それっぽい結果になっていることが分かる.