#!/usr/bin/perl
# 以下は変更する必要なし
#-----------------------------------------------------------------------------
#
# log2vec3 (version  $Id: eodv,v 1.4 2007/05/22 02:22:33 Exp $) 
#
# logをvec3にする算出
# 
# Usage:
# > log2vec3.pl hogehoge.csv 
#
# options:
#         特に無し
#
# example:
# log2vec3.pl hogehoge.csv                                #(1)
#
#-----------------------------------------------------------------------------
use Math::Trig;

# Libraries
$cnt	= -2;	# ヘッダ行分指定する
$row0	= 1;	# SATTIME
$row1 	= 104;	# 要求トルクベクトル
$row2 	= 105;	
$row3 	= 106;
$row4 	= 204;	# 地磁場ベクトル
$row5 	= 205;	
$row6 	= 206;	
$row7 	= 189;	# LLHベクトル
$row8 	= 190;	# lon,lat,hei
$row9 	= 191;	

$wtime	= 0.1;	# ウェイト時間[sec]
$xx1	= 0;
$yy1	= 0;
$zz1	= 0;
$xx2	= 0;
$yy2	= 0;
$zz2	= 0;
$absxyz1= 0;
$absxyz2= 0;
$sattime= 0;
$angle	= 0;

#-----------------------------------------------------------------------------
# Code begin
#-----------------------------------------------------------------------------
($opt) = @ARGV; 
if ($opt eq "-h") 
{
    &show_usage();
    exit;
}

# オプションがない場合
#-----------------------------------------------------------------------------
if ($#ARGV == -1)
{
	print "Error:ファイル名を指定してください\n";
}

# オプションが１つある場合
#-----------------------------------------------------------------------------
if ($#ARGV == 0)
{
	# 対象ファイルのオープン
	open(IN,"<$ARGV[0]") || die "Error: can't open $ARGV[0]\n";
		@line = <IN>;
	close(IN);
	
	# gnuplot スクリプトヘッダ出力
	print "set term png\n\n";
	print "set xrange[-1:1]\n";	
	print "set yrange[-1:1]\n";	
	print "set zrange[-1:1]\n";	

	foreach (@line)
	{
		# ヘッダ情報を飛ばす
		#-----------------------------------------------------------------------------
		if ($cnt < 0){$cnt++; next;}
		
		# 要求トルクベクトル
		#-----------------------------------------------------------------------------
		$xx1	= (split(/\,/,$_))[$row1-1];
		$yy1	= (split(/\,/,$_))[$row2-1];
		$zz1	= (split(/\,/,$_))[$row3-1];

		$absxyz1= sqrt($xx1*$xx1+$yy1*$yy1+$zz1*$zz1);
		if($absxyz1 != 0)
		{
			$xx1 = $xx1 / $absxyz1;
			$yy1 = $yy1 / $absxyz1;
			$zz1 = $zz1 / $absxyz1;
		}
		$disp = sprintf("set arrow from  0,0,0  to %e,%e,%e lw 2 lt 1\n",$xx1,$yy1,$zz1);
		print $disp;

		# 地磁場ベクトル
		#-----------------------------------------------------------------------------
		$xx2	= (split(/\,/,$_))[$row4-1];
		$yy2	= (split(/\,/,$_))[$row5-1];
		$zz2	= (split(/\,/,$_))[$row6-1];

		$absxyz2= sqrt($xx2*$xx2+$yy2*$yy2+$zz2*$zz2);
		if($absxyz2 != 0)
		{
			$xx2 = $xx2 / $absxyz2;
			$yy2 = $yy2 / $absxyz2;
			$zz2 = $zz2 / $absxyz2;
		}
		$disp = sprintf("set arrow from  0,0,0  to %e,%e,%e lw 2 lt 3\n",$xx2,$yy2,$zz2);
		print $disp;
		
		# ダミープロット
		#-----------------------------------------------------------------------------
		$sattime = (split(/\,/,$_))[$row0-1];
		$disp = sprintf("set output \"%05d.png\"\n",$sattime);
		print $disp;
		
		# 内積角計算
		#-----------------------------------------------------------------------------
		if($absxyz1 != 0 && $absxyz2 != 0)
		{
			$angle = acos(($xx1*$xx2 +$yy1*$yy2 + $zz1*$zz2)/(sqrt($xx1*$xx1+$yy1*$yy1+$zz1*$zz1)*sqrt($xx2*$xx2+$yy2*$yy2+$zz2*$zz2)))*180/3.141592;
		}
		
		# LLHベクトル
		#-----------------------------------------------------------------------------
		$xx2	= (split(/\,/,$_))[$row7-1];
		$yy2	= (split(/\,/,$_))[$row8-1];
		$zz2	= (split(/\,/,$_))[$row9-1];
		
		# 値プロット
		#-----------------------------------------------------------------------------
		$disp = sprintf("sp \"sample.dat\" ti \"time[sec] = %4.2f\",",$sattime);	print $disp;
		$disp = sprintf("\"sample.dat\" ti \"angle[deg] = %4.2f\",",$angle);		print $disp;
		$disp = sprintf("\"sample.dat\" ti \"Lon[deg] = %4.2f\",",$xx2*180/3.141592);	print $disp;
		$disp = sprintf("\"sample.dat\" ti \"Lat[deg] = %4.2f\"\n",$yy2*180/3.141592);	print $disp;
		
		# pause時間
		#-----------------------------------------------------------------------------
		#$disp = sprintf("pause %f\n",$wtime);
		#print $disp;
		
		# 古いvecをクリア
		#-----------------------------------------------------------------------------
		print "unset arrow\n\n";
		
		# インクリメント処理
		#-----------------------------------------------------------------------------
		$cnt++;
	}
	
	# ヘッダ出力
	$disp = sprintf("\n");
	print $disp;
}

# オプションが２つある場合
#-----------------------------------------------------------------------------
if ($#ARGV == 1)
{

}
exit;

#-----------------------------------------------------------------------------
# Sub code begin
#-----------------------------------------------------------------------------
sub show_usage()
{
  print "Usage:\n";
  print "> eodv [-h]\n";
  print "\n";
  print "options:\n";
  print "         -h : 利用方法を提示する\n";
  print "      -make : Level-2を更新する\n";
  print "\n";
  print "example:\n";
  print "eodv -h                         #(1) HELP\n";
}

