#!/usr/bin/perl
#
# 差分
# Nowral
# 99/9/6
#
#時間間隔
use Time::Local;
# 定数
$pi = 4 * atan2(1,1); # 円周率
$rd = $pi / 180; # radian / degree
# 前段
open(A, $ARGV[0]) || die "Open A Failed :$!";
($ta0, $xa0, $ya0, $ha0) = &getg(*A);
($ta1, $xa1, $ya1, $ha1) = &getg(*A);
open(B, $ARGV[1]) || die "Open B Failed :$!";
($tb0, $xb0, $yb0, $hb0) = &getg(*B);
($tb1, $xb1, $yb1, $hb1) = &getg(*B);
$newargv = $ARGV[0] . ".dif";
open(OUT, ">$newargv");
&MacPerl'SetFileInfo('ttxt', 'TEXT', $newargv);
$fh = select(OUT); # 前の出力先を記憶
print "#時刻\t緯度[m]\t経度[m]\t高度[m]\t距離[m]\n";
undef($n, $sdx, $sdy, $sdh, $sr2, $t0);
undef($rmax, $rmin, $amax, $amin);
# ループ
while( ! (eof(A) || eof(B)) ) {
undef $u;
if($ta0>=$tb0 && $ta0<$tb1) {
$ts = &formd($ta0);
if(! defined $t0) { $t0 = $ta0; }
$t1 = $ta0 - $t0;
$u = ($tb1-$ta0) / ($tb1-$tb0);
$dx = $xa0 - $u*$xb0 - (1-$u)*$xb1;
$dy = $ya0 - $u*$yb0 - (1-$u)*$yb1;
$dh = $ha0 - $u*$hb0 - (1-$u)*$hb1;
}
elsif($tb0>$ta0 && $tb0<$ta1) {
$ts = &formd($tb0);
if(! defined $t0) { $t0 = $tb0; }
$t1 = $tb0 - $t0;
$u = ($ta1-$tb0) / ($ta1-$ta0);
$dx = $u*$xa0 + (1-$u)*$xa1 - $xb0;
$dy = $u*$ya0 + (1-$u)*$ya1 - $yb0;
$dh = $u*$ha0 + (1-$u)*$ha1 - $hb0;
}
if(defined $u) {
++$n;
# printf "%4d\t", $n;
# 距離
$r = sqrt($dx*$dx + $dy*$dy); # 高度抜き
# $r = sqrt($dx*$dx + $dy*$dy + $dh*$dh); # 高度入り
if($r>$rmax || ! defined $rmax) { $rmax = $r; }
if($r<$rmin || ! defined $rmin) { $rmin = $r; }
$sdx += $dx;
$sdy += $dy;
$sdh += $dh;
$sr2 += $r * $r;
printf "%s\t%.0f\t%.0f\t%.0f\t%.1f", $ts, $dx, $dy, $dh, $r;
# printf "%5d\t%.0f\t%.0f\t%.0f\t%.2f", $t1, $dx, $dy, $dh, $r;
# 方位
if($r) {
$a = 450 - atan2($dx,$dy)/$rd; # 北から東回り
if($a>=360) { $a -= 360; } # modを使うと整数にされてしまう
if($a>$amax || ! defined $amax) { $amax = $a; }
if($a<$amin || ! defined $amin) { $amin = $a; }
printf "\t%.0f", $a;
}
print "\n";
}
if($ta1<=$tb1) { # スライド
($ta0, $xa0, $ya0, $ha0) = ($ta1, $xa1, $ya1, $ha1);
($ta1, $xa1, $ya1, $ha1) = &getg(*A);
}
else {
($tb0, $xb0, $yb0, $hb0) = ($tb1, $xb1, $yb1, $hb1);
($tb1, $xb1, $yb1, $hb1) = &getg(*B);
}
}
$rav = sqrt($sdx*$sdx + $sdy*$sdy + $sdh*$sdh) / $n;
$rer = sqrt( ($sr2 - $n*$rav*$rav) / ($n-1) );
$aav = 450 - atan2($sdx,$sdy)/$rd; # 北から東回り
if($aav>=360) { $aav -= 360; }
#$aer = atan2($rer, sqrt($rav*$rav-$rer*$rer)) / $rd;
$aer = atan2($rer, $rav) / $rd;
close(A);
close(B);
close(OUT);
select($fh);
# 集計
print "\n";
printf "# データ数 : %d\n", $n;
printf "# 平均間隔 : %.1f ± %.2f [m]\n", $rav, $rer/sqrt($n);
printf "# 1点の誤差: ± %.1f [m]\n", $rer;
printf "# 最大間隔 : %.1f [m]\n", $rmax;
printf "# 最小間隔 : %.1f [m]\n", $rmin;
print "\n";
printf "# 平均角度 : %.1f [度]\n", $aav;
printf "# 1点の誤差: ± %.1f [度]\n", $aer;
printf "# 最大角度 : %.0f [度]\n", $amax;
printf "# 最小角度 : %.0f [度]\n", $amin;
#&MacPerl'Quit(2);
die "The Unhappy End";
sub getg { # GPSy拡張形式の読み込み
local(*IN) = @_;
undef $_;
$_ = <IN> until /^T\t/;
my(@ed) = split("\t");
if($ed[9] ne "UTM") { die "$ed[9] Not UTM!\n"; }
$ed[4] =~ /(\d+)\/(\d+)\/19(\d+)\s+(\d+):(\d+):(\d+)/;
(timelocal($6,$5,$4,$2,$1-1,$3), $ed[5], $ed[6], $ed[8]);
}
sub formd { # 日付、時刻の表示形式
my($t) = @_;
my($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($t);
sprintf("%4d/%02d/%02d %02d:%02d:%02d",$year+1900,$mon+1,$mday,$hour,$min,$sec);
}
sub avcalc { # 平均、誤差
my($s,$s2,$n) =@_;
# ( $s/$n , sqrt(($s2-$s*$s/$n)/($n-1)) ); # 1点の誤差
( $s/$n , sqrt(($s2-$s*$s/$n)/$n/($n-1)) ); # 平均の誤差
}