配列と行列について
Posted: 2014年11月13日(木) 03:26
端末の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;
}