頭と尻尾はくれてやる!

iOSアプリなどの開発日記です


定点での傾きが決まってる場合のn次曲線近似を最小二乗法で求める(2)

頭と尻尾はくれてやる! / 定点での傾きが決まってる場合のn次曲線近似を最小二乗法で求める(1)
↑この続きね。

上のポストの最後の式の左側はどんな式になるのかもうちょっと計算してみるよ。
どれもTl x Tmなので任意のlとmについて考えると次のようになる。

式1


次に右辺側も計算を進めてみる。

式2

ここまで計算しておけばあとは普通の最小二乗法の計算手順と似たようなもんだよね。まあ行列の計算をガウスジョルダン法などでやった後でp0とp1を求める必要があったりするけど。

スムーズにつながる二つの近似曲線

↑その結果の一例。”わかりやすい”のを持ってきたよ(関係ない点も表示してるけどスルーしてね)。
二つの近似曲線は色を変えてて、継ぎ目が一応スムーズになってる、、、んだろうね、一応。
ただ、継ぎ目近傍ではいいんだろうけど、少し離れるとなんか不自然、俺が欲しい近似曲線はこれじゃない感が出てくるんだよ。

つまり、、、この方法はボツ!

最近はいろいろやってみたけどだめだった、というのが多いなあ、、、orz
スポンサーサイト






UIBarButtonItemからUIButtonは取得できる?

ナビゲーションバーの左右にボタンを設置したい時ってあるじゃない。
よくあるのはこんな流れだと思うんだけどさ。
{
    UIButton *button = [UIButton buttonWithType:100];
    [button addTarget:self action:@selector(closeButtonTappedHandler) forControlEvents:UIControlEventTouchUpInside];
    [button setTitle:@"Close" forState:UIControlStateNormal];
    
    UIBarButtonItem *barButtonItem = [[[UIBarButtonItem alloc] initWithCustomView:button] autorelease];
    self.navigationItem.rightBarButtonItem = barButtonItem;
}
ナビゲーションバーのボタン

↑こんな感じでナビゲーションバーにボタン表示できるよね。

ここでbarButtonItemがわかっている場合(インスタンスなりプロパティなりしてるとか)そこからUIButtonオブジェクトへの参照を得たい場合にどうするんだろう?と思ってさ。
なんとなくUIBarButtonItemのリファレンスを見ればbuttonプロパティなんてありそうなもんだけどないんだよね。

あるのはcustomViewってプロパティ。リファレンスを見ると
customView
A custom view representing the item.
@property(nonatomic, retain) UIView *customView
↑このようにUIViewとして得られるんだけど、このポインタを確認してみる。
{
    NSLog(@"button = [%p]",button);
    NSLog(@"barButtonItem.customView=[%p]",barButtonItem.customView);
}
↑さっきのコードに追加。

ポインタ比較結果

↑すると結果は同じなんだよね。
ってことでキャストすればUIButtonオブジェクトとして使える。めでたし、めでたし。


UIScrollViewのサブビューを拡大した後におかしくなる

UIScrollViewを使えばビューを拡大させたりするのが簡単に実装できるよね。
こんな感じでscrollViewに拡大させることができるsubViewをのせることにする。
{
    //set scrollView
    UIScrollView *scrollView = [[[UIScrollView alloc] initWithFrame:(CGRect){0,0,320,320}] autorelease];
    scrollView.backgroundColor = [UIColor scrollViewTexturedBackgroundColor];
    scrollView.delegate = self;
    scrollView.maximumZoomScale = 10.0f;
    scrollView.contentSize = (CGSize){3000 , 3000};
    [self.view addSubview:scrollView];
    
    //set sub view
    UIImage *image = [UIImage imageNamed:@"image.png"];
    subView = [[[UIImageView alloc] initWithImage:image] autorelease];
    subView.frame = (CGRect){10,10,300,300};
    [scrollView addSubview:subView];

    //check scrollView.contentSize
    NSLog(@"contentSize.width=%.1f , contentSize.height=%.1f", scrollView.contentSize.width , scrollView.contentSize.height);
}

//UIScrollViewDelegate Protocol method
-(UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView
{
    return subView;
}
↓最初はこんなのが
UIScrollViewテスト
↓移動したり
UIScrollView移動
↓拡大できるようになる。
UIScrollView拡大
たいしたコードじゃないのにあれだけでピンチで拡大とかできるんだからスゴいよね。

問題はこの後に縮小して最初の大きさにしたら、移動できなくなるんだ(iOS 6.1.3)。
あと、拡大時に画像の端っこが表示されずにすーっと戻ってしまうとかね。

なんでだ?と思って確認すると、画像を拡大した時にscrollView.contentSizeが書き換えられてるみたいなんだよ。
-(void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale
{
    NSLog(@"scale=%f , contentSize.width=%.1f , contentSize.height=%.1f",scale , scrollView.contentSize.width , scrollView.contentSize.height);
}
↑これもUIScrollViewDelegate Protocolのメソッドで拡大や縮小が終わった時点でコールされる。
ここでチェックしてみると、、、

scrollView.contentSizeのチェック
↑書き換えられてて、最初の値と違ってる。値をみると、どうやら拡大すると scale x 元のサイズ でcontentSizeが上書きされてるみたい。

結局このメソッド内で自分が設定したい値に設定し直すことで意図通りにすることができたよ。


ZipArchiveでうまくビルドできなかった原因

iOSで使えるファイルを圧縮するライブラリを探していたら
ZipArchive ziparchive - An Objective C class for zip/unzip on iPhone and Mac OSX - Google Project Hosting
SSZipArchive soffes/ssziparchive · GitHub
あたりが出てくるんだ(派生したっぽいのも出てきてもう何がなんだかってなりそう)。

いろいろと使ってみたって記事があるので同じようにしてみたんだけど、どちらもうまくいかないんだ。
ZipArchiveでうまくいかないからSSZipArchiveでも試してみたんだけどね。

ビルド時のエラーメッセージ

NSObject.hやNSObjCRunTime.hにExpected identifier or '('とか
Apple LLVM compiler 4.2 Errorとか。
Xcodeはとにかくたくさんのエラーを吐き出してビルドしてくれない。エラーの部分を見ても何が悪いのかもわからないんだ。

必要だとされるライブラリを変えてみたり、ファイルの追加方法を変えてみたり。
検索して同じような不具合出てる人を探して解決方法を調べたりしたんだけど、どうやってもうまくいかない。
単純にライブラリーが古くてarmv7じゃだめとかそういうのかな、とか思ったけどそういうのだとたいてい検索したら出てくるはずなんだけど、さっぱり出てこないところをみると見当違いなんだろう、、、

苦し紛れに新たにプロジェクトを新規作成してテストしてみたら、、、すんなり動いたんだ!!!

最初にうまくいかなかったのはテスト専用のプロジェクト内でテストしてた時なんだ。それじゃあ違いは何よ?って不要なコードやら追加してるファイルやらを消していってようやくたどり着いた結果は、、、

-Prefix.pchファイル内で某ファイルをインポートしてからなんだ。
#import "Categories.h"
ここに汎用性のある自作カテゴリ(もちろんObjective-C)をインポートするよう記述してたんだよ。これを消せばうまく動いてくれる。
つまり、ここに記述した内容は各ファイルをコンパイルする時に付けられるわけだけど、CやC++のファイルにも付けていたってことか。
それじゃあってことで、元のテスト専用プロジェクトの-Prefix.pchファイル内での記述をこのようにif内に移動させてみたら意図通り動いてくれた。
#ifdef __OBJC__
    #import < UIKit/UIKit.h >
    #import < Foundation/Foundation.h >
    #import "Categories.h"
#endif

//#import "Categories.h"
元々 #ifdef __OBJC__ とかあったのはそういうためだったのね。
あまりにも間抜けすぎて検索してもこういうトラブルではまる人が見つからなかったのかな、、、?

結局これを修正すればZipArchiveもSSZipArchiveも動いてくれたよ。


クラスの説明図などもXcodeで管理する

処理の流れがややこしいクラス群を作った時に、それがどういう流れで処理してるのかをメモしたい時ってあるじゃない?
どういうオブジェクトをどこで持ってるのか、どこでどういうチェックしてどういうエラーをどこへ返すのかとかそういうのね。
ヘッダーファイルにコメントだけで書くのが困難な場合。

そういうのをどうやってメモするのがベストなのかはわからないんだけど、最近気に入ってやっているのがiDrawのファイルをXcodeに追加しておく、という方法。
通常のファイル追加と同じようにAdd Files to …で追加して、Xcode内に置いた方をオリジナルにする。
あ、別にiDrawじゃなくてもいいと思うよ、試してないけど。

追加するとクラスのファイルに並んでリンクが表示される。

XcodeでiDrawファイルを表示

↑それをクリックするとiDrawのファイルでも表示してくれる(ちょっと画質がイマイチだったりするけど)。

原図がどこにあるかがおのずと決まるので、どこにあるのか探さなくてもいいし。この方法で統一すればそもそもそういう説明用のファイルがあるのかないのかも一目瞭然になる。

Xcodeで説明用ファイルを右クリック→'Open with External Editor'とすればiDrawが起動してくれるから、内容を修正や追加も簡単にできる。

クラスの説明図だけじゃなくて、App Storeに申請する時の文言をメモしたテキストファイルなんかも同じように管理しようかな、とかも考えているんだ。まあそのくらいあっちこっちに置いてるってことなんだけど。ああ、整理整頓大事だねえ。




Copyright ©頭と尻尾はくれてやる!. Powered by FC2 Blog. Template by eriraha.