#!/usr/bin/perl
#
# トラックログの差を求める
# Nowral
# 99/9/13
#
use Time::Local;
($fa, $fb) = sort @ARGV;
# 読み込み <毎秒で補足
($t0, $x0, $y0, $h0, $na0) = undef;
open(IN, $fa);
while(<IN>){
if(/^T\t/) {
++$na0;
($t1, $x1, $y1, $h1) = &gdec($_);
if(! defined $t0) { ($t0, $ta0) = ($t1-1, $t1); }
($dt, $dx, $dy, $dh) = ($t1-$t0, $x1-$x0, $y1-$y0, $h1-$h0);
for(1..$dt) {
$u = $_ / $dt;
push(@xa, $x0+$u*$dx);
push(@ya, $y0+$u*$dy);
push(@ha, $h0+$u*$dh);
}
($t0, $x0, $y0, $h0) = ($t1, $x1, $y1, $h1);
}
}
$na = $t1 - $ta0;
($t0, $x0, $y0, $h0, $nb0) = undef;
open(IN, $fb);
while(<IN>){
if(/^T\t/) {
++$nb0;
($t1, $x1, $y1, $h1) = &gdec($_);
if(! defined $t0) { ($t0, $tb0) = ($t1-1, $t1); }
($dt, $dx, $dy, $dh) = ($t1-$t0, $x1-$x0, $y1-$y0, $h1-$h0);
for(1..$dt) {
$u = $_ / $dt;
push(@xb, $x0+$u*$dx);
push(@yb, $y0+$u*$dy);
push(@hb, $h0+$u*$dh);
}
($t0, $x0, $y0, $h0) = ($t1, $x1, $y1, $h1);
}
}
$nb = $t1 - $tb0;
close(IN);
if($na>3*$na0 || $nb>3*$nb0) { die "Time interval is too large!\n"; }
# すり合わせ
$newargv = "match.log";
open(OUT, ">$newargv");
&MacPerl'SetFileInfo('ttxt', 'TEXT', $newargv);
$fh = select(OUT);
# A: slide, B: fixed
# fig.1
# 0 $na
# A: +-------------+ ->
# 0 : $nb
# B: +-------+---------+
# - 0 :
# +-$ba-+ :
# 0 +
# +->$ib->+
# $oh $ot
#
# fig.2
# 0 $na
# A: +-------------+ ->
# 0 : $nb
# B: +-----+-----------+
# 0 + :
# +-$ba-+ :
# $ba +
# +->$ib->->->+
# $oh $ot
#
print "dt\ts2av\tno\tds2av\n";
($s1, $s1m, $s2m, $s3m) = undef;
foreach $ba (-$na..$nb) {
$s2 = 0;
$oh = 0>$ba ? 0 : $ba;
$ot = $ba+$na<$nb ? $ba+$na : $nb;
foreach $ib ($oh..$ot) {
$s2 += ($xa[$ib-$ba]-$xb[$ib])**2 + ($ya[$ib-$ba]-$yb[$ib])**2;
}
$no = $ot - $oh + 1;
$s2 /= $no;
if($s3m == -1) { $s3m = $s2; }
if( (! defined $s2m) || ($s2m > $s2) ) {
($s1m, $s2m, $s3m, $bam) = ($s1, $s2, -1, $ba);
}
print join("\t", $ba-$ta0+$tb0, $s2, $no, $s2-$s1), "\n";
$s1 = $s2;
}
#if($s3m == -1) { $s3m = $s2; }
$ba = $bam;
# 出力
$newargv = "match.log2";
open(OUT, ">$newargv");
&MacPerl'SetFileInfo('ttxt', 'TEXT', $newargv);
print "ib\tlata\tlona\tlatb\tlonb\n";
$oh = 0>$ba ? 0 : $ba;
$ot = $ba+$na<$nb ? $ba+$na : $nb;
foreach $ib ($oh..$ot) {
# print join( "\t", (&formd($ta0+$ib-$ba), °2dms($xa[$ib-$ba]), °2dms($ya[$ib-$ba])
# , &formd($tb0+$ib), °2dms($xb[$ib]), °2dms($yb[$ib])) ), "\n";
print join("\t", ($ib, $xa[$ib-$ba], $ya[$ib-$ba], $xb[$ib], $yb[$ib])), "\n";
}
close(OUT);
# 集計
select($fh);
print "\n";
printf "# ログA : %s\n", (split(/:/, $fa))[-1];
printf "# ログA 開始時刻: %s\n", &formd($ta0);
printf "# ログA 終了時刻: %s\n", &formd($ta0+$na);
printf "# ログA データ数: %d (%d)\n", $na+1, $na0;
print "\n";
printf "# ログB : %s\n", (split(/:/, $fb))[-1];
printf "# ログB 開始時刻: %s\n", &formd($tb0);
printf "# ログB 終了時刻: %s\n", &formd($tb0+$nb);
printf "# ログB データ数: %d (%d)\n", $nb+1, $nb0;
print "\n";
$dt = $ba + $tb0 - $ta0 + ($s1m-$s3m) / ($s1m+$s3m-2*$s2m) / 2;
print join("\n",($ba+$tb0-$ta0,$s1m,$s2m,$s3m)),"\n";
if($dt<0) { printf "ログAはログBより %.1f 秒進んでいます。\n", -$dt; }
else { printf "ログAはログBより %.1f 秒遅れています。\n", $dt; }
#&MacPerl'Quit(2);
die "The Unhappy End";
sub gdec {
my($l1) = @_;
my($date, $latd, $lond);
my(@ed) = split(/\t/, $l1);
if($ed[9] ne "DMS") { die "Not DMS !"; }
$ed[4] =~ /(\d+)\/(\d+)\/(\d+)\s+(\d+):(\d+):(\d+)/; # 時刻
$date = timelocal($6, $5, $4, $2, $1-1, $3-1900);
$ed[5] =~ /(\d+)。(\d+)'(\d+\.\d+)"/; # 緯度
$latd = $1 + $2/60 +$3/3600;
$ed[6] =~ /(\d+)。(\d+)'(\d+\.\d+)"/; # 経度
$lond = $1 + $2/60 +$3/3600;
($date, $latd, $lond, $ed[8]);
}
sub formd { # 日付、時刻の表示形式
my($t) = @_;
my($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($t);
# sprintf("%d/%d/%d %d:%02d:%02d",$year+1900,$mon+1,$mday,$hour,$min,$sec);
sprintf("%d:%02d:%02d",$hour,$min,$sec);
}
sub deg2dms {
my($d) = @_;
my($m, $s, $sf);
$sf = int($d*36000 + 0.5);
$s = $sf / 10 % 60;
$m = $sf / 600 % 60;
$d = int($sf/36000);
$sf %= 10;
sprintf("%d。%02d\'%02d\.%d\"", $d, $m, $s, $sf);
}