配列と行列について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
奥兵

配列と行列について

#1

投稿記事 by 奥兵 » 10年前

端末のXYZ方向に加わった加速度を、北と重力方向を基準にした加速度に換算するメソッドを書きました。
端末の傾きと向いている方角を基準に三角関数で値を求めるようにしたのですが、なんとなく行列を使って求められるような気がします。
ただ行列に関する数学的理解が浅すぎて、できるかどうか、またできるとしてどう書くのか、今のコードより早くなるのかどうかがわかりません。
アドバイスを頂けると幸いです。

コード:

public String maxAbsAccelerationVlue( float[] attitude, float[] linerAccel ){
		
		double xAccel = (
				(Math.cos(attitude[0] * RAD2DEG)//北に対しての角度
				*Math.cos(attitude[2])//ロール
				*linerAccel[0]//端末X方向の加速度
				
				+Math.sin(attitude[0] * RAD2DEG)//北に対しての角度
				*Math.cos(attitude[1])//ピッチ
				*linerAccel[1]//端末Y方向の加速度
		 
				+Math.sin(attitude[0] * RAD2DEG)//北に対しての角度
				*Math.sin(attitude[1])//ピッチ
				*linerAccel[2]//端末Z方向の加速度
				));//ピッチ
		 
		double yAccel = (
				(Math.sin(attitude[0] * RAD2DEG)//北に対しての角度
				*Math.cos(attitude[2])//ロール
				*linerAccel[0]//端末X方向の加速度
				
				+Math.cos(attitude[0] * RAD2DEG)//北に対しての角度
				*Math.cos(attitude[1])//ピッチ
				*linerAccel[1]//端末Y方向の加速度
		 
				+Math.cos(attitude[0] * RAD2DEG)//北に対しての角度
				*Math.sin(attitude[1])//ピッチ
				*linerAccel[2]//端末Z方向の加速度
				));//ピッチ
		 
		double zAccel = (
				(Math.cos(attitude[1])//ピッチ
				*Math.sin(attitude[2])//ロール
				*linerAccel[0]//端末X方向の加速度
				
				+Math.sin(attitude[1])//ピッチ
				*Math.cos(attitude[2])//ロール
				*linerAccel[1]//端末Y方向の加速度
		 
				+Math.cos(attitude[1])//ロール
				*Math.cos(attitude[2])//ピッチ
				*linerAccel[2]//端末Z方向の加速度
				));//ピッチ
		
		if(absXMax < xAccel){ absXMax = (float)xAccel; }
    	if(absYMax < yAccel){ absYMax = (float)yAccel; }
    	if(absZMax < zAccel){ absZMax = (float)zAccel; }
		
		String str = 
			"\nX軸 "+Float.toString(absXMax)
			+"\nY軸 "+Float.toString(absYMax)
			+"\nZ軸 "+Float.toString(absZMax);
		return str;
	}

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 配列と行列について

#2

投稿記事 by softya(ソフト屋) » 10年前

行列は必要に応じで勉強してもらうとして、高速化が必要かどうかでしょうか。ネックとなるほど遅くて1フレームに何回も呼ばれるでしょうか?
と周辺情報。
・APIで行列が使えるのはバージョンの制限も有るみたいですよ。
・ここだけJNI経由でC++で書いちゃえば早くなりますが、そこまでしますか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

奥兵

Re: 配列と行列について

#3

投稿記事 by 奥兵 » 10年前

お返事ありがとうございます。
二次元だと頭の中で想像しやすいのですが三次元になると、まさに次元が違うといったところで、頭がこんがらがってしまいます。
故、三角関数による変換アルゴリズムがあっているのかどうかがかなり不安だったのと、行列で変換すればまとめて値を変換できるうえにあわよくば速くなるのでは?
と思い質問させていただきました。
速度のほうは高頻度で呼ばれますが、ボトルネックになってるとかでは全くありません。

現在実験中ですが、どうやら三角関数のほうのコードも北に対して水平に端末を振ったときにXもYも同じような値が出てしまうのでおかしいような気がします。
なのでもう少し調べて報告させていただきます。

奥兵

Re: 配列と行列について

#4

投稿記事 by 奥兵 » 10年前

解決できたので報告させていただきます。
Math.sin()の引数に直接角度を与えていたのですが、Math.toRadians()に角度を渡して、それを引数として渡すべきところでした。
修正したところ、おおよそ正しいと思われる値が得られるようになりました。
変にAPIのVerで問題を起こしたくないのと、速度を求める必要がそれほどない関数なのでこのまま三角関数で変換します。
アドバイスありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る