libvec.pl
author A.M. Thurnherr <athurnherr@yahoo.com>
Sat, 22 Feb 2014 10:58:58 +0000
changeset 5 7d6e11d484ec
parent 3 55a8c407d38e
child 6 b965580e8782
permissions -rw-r--r--
.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     1
#======================================================================
5
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
     2
#                    L I B V E C . P L 
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     3
#                    doc: Sat Mar 20 12:50:32 1999
5
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
     4
#                    dlm: Wed Nov 27 23:46:31 2013
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     5
#                    (c) 1999 A.M. Thurnherr
5
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
     6
#                    uE-Info: 36 53 NIL 0 0 70 2 2 4 NIL ofnI
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     7
#======================================================================
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     8
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     9
# HISTORY:
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    10
#	Mar 20, 1999: - created for ANTS_2.1 (no more c-code)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    11
#	May 27, 1999: - added polar/cartesian conversions
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    12
#	Sep 18, 1999: - argument typechecking
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    13
#	Dec 10, 1999: - vel_u(), vel_v(), vel_dir(), vel_mag()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    14
#	Mar 07, 2000: - proj(), deg(), rad()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    15
#	Apr 18, 2002: - area()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    16
#	Jan  6, 2003: - changed dist() output to meters
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    17
#	Jan 16, 2003: - renamed vel_vel() to vel_speed()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    18
#	Sep  3, 2003: - dir_bias()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    19
#	May 13, 2004: - BUG: had fogotten to adapt area() to new dist()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    20
#	May 21, 2004: - forced zero distance on &dist() if lat/lon does
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    21
#				    not change (avoid roundoff error)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    22
#	Jun 22, 2004: - added GMTdeg(), dir()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    23
#	Nov 11, 2004: - BUG: roundoff test in dist() was done before
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    24
#					     conversion to numbers
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    25
#   Jul  1, 2006: - Version 3.3 [HISTORY]
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    26
#   Jul 24, 2006: - modified to use equal()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    27
#	Nov 16, 2006: - added degmin()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    28
#	Dec 19, 2007: - addapted vel_speed(), vel_dir() to new &antsFunUsage()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    29
#				  - same routines now return nan on nan input
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    30
#	Jan 15, 2007: - BUG: vel_dir() was broken
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    31
#	Jun 14, 2009: - added p_vel()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    32
#	Nov  5, 2009: - added angle(); vel_bias() => angle_diff()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    33
#	Apr 22, 2010: - added angle_ts()
2
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents: 0
diff changeset
    34
#	Jun  5, 2012: - added &closestPointOnStraightLine()
3
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 2
diff changeset
    35
#	Jun 11, 2012: - addeed $t output to &closestPointOnStraightLine()
5
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
    36
#	Nov 27, 2013: - added &angle_pos(), mag_heading()
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    37
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    38
require "$ANTS/libPOSIX.pl";	# acos()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    39
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    40
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    41
# &rad()							calc radians
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    42
# &deg()							calc degrees
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    43
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    44
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    45
$PI = 3.14159265358979;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    46
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    47
sub rad(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    48
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    49
	my($d) = &antsFunUsage(1,"f","<deg>",@_);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    50
	return $d/180 * $PI;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    51
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    52
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    53
sub deg(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    54
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    55
	my($r) = &antsFunUsage(1,"f","<rad>",@_);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    56
	return $r/$PI * 180;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    57
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    58
	
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    59
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    60
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    61
# &proj(from_x,from_y,onto_unit_x,onto_unit_y)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    62
#									project vector onto another
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    63
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    64
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    65
# to transform CM velocity components u/v to along/across mean l/c:
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    66
#   - mean dir d = &vel_dir(<u>,<v>); with <.> indicating ensemble avg
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    67
#	- l = proj(u,v,sin(rad(d)),cos(rad(d))); NEW: l = p_vel(d[,u,v])
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    68
#	- c = -proj(u,v,-cos(rad(d)),sin(rad(d)));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    69
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    70
sub proj(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    71
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    72
	my($fx,$fy,$oux,$ouy) =
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    73
		&antsFunUsage(4,"ffff","<from_x> <from_y> " .
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    74
							   "<onto_unit_x> <onto_unit_y>",@_);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    75
	return $fx*$oux + $fy*$ouy;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    76
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    77
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    78
{ my(@fc);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    79
	sub p_vel(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    80
	{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    81
		my($u,$v,$d) = &antsFunUsage(3,'..f','[u, v,] dir',\@fc,'u','v',undef,@_);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    82
		return nan unless numbersp($d,$u,$v);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    83
		return proj($u,$v,sin(rad($d)),cos(rad($d)));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    84
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    85
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    86
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    87
		
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    88
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    89
# &polar_r(x,y),&vel_vel(u,v)		calc polar radius, velocity
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    90
# &polar_phi(x,y),&vel_dir(u,v)		calc polar degrees cclockwise from
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    91
#									horiz (phi) OR clockwise from N (dir)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    92
# &cartesian_x(r,phi),&vel_u(m,dir)	calc x and u from polar coords
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    93
# &cartesian_y(r,phi),&vel_v(m,dir)	calc y and v from polar coords
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    94
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    95
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    96
sub polar_r(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    97
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    98
	my($x,$y) = &antsFunUsage(2,"ff","<x> <y>",@_);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    99
	return sqrt($x*$x+$y*$y);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   100
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   101
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   102
{ my(@fc);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   103
	sub vel_speed(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   104
	{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   105
		my($u,$v) = &antsFunUsage(2,'..','[u, v]',\@fc,'u','v',@_); # . allows for nans
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   106
		return nan unless numbersp($u,$v);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   107
		return sqrt($u*$u+$v*$v);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   108
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   109
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   110
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   111
sub polar_phi(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   112
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   113
	my($x,$y) = &antsFunUsage(2,"ff","<x> <y>",@_);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   114
	return 180 / $PI * atan2($y,$x);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   115
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   116
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   117
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   118
{ my(@fc);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   119
	sub vel_dir(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   120
	{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   121
		my($u,$v) = &antsFunUsage(2,'..','[u, v]',\@fc,'u','v',@_); # . allows for nans
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   122
		return nan unless numbersp($u,$v);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   123
		my($dir) = 180 / $PI * atan2($u,$v);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   124
		return ($dir >= 0) ? $dir : $dir+360;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   125
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   126
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   127
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   128
sub cartesian_x(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   129
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   130
	my($r,$phi) = &antsFunUsage(2,"ff","<r> <phi>",@_);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   131
	return $r * cos($PI*$phi/180);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   132
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   133
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   134
sub vel_u(@) { return &cartesian_x($_[0],90-$_[1]); }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   135
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   136
sub cartesian_y(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   137
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   138
	my($r,$phi) = &antsFunUsage(2,"ff","<r> <phi>",@_);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   139
	return $r * sin($PI*$phi/180);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   140
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   141
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   142
sub vel_v(@) { return &cartesian_y($_[0],90-$_[1]); }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   143
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   144
#----------------------------------------------------------------------
5
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   145
# magnetic heading from magnetometer; losely based on info found on-line;
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   146
#   note that mag_x = mag_y = 0 is singularity
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   147
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   148
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   149
sub mag_heading($$)
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   150
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   151
    if    ($_[1] != 0) { return 270 - deg(atan2($_[0],$_[1])); }
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   152
    elsif ($_[0] < 0)  { return 180; }
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   153
    else               { return 0; }
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   154
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   155
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   156
#----------------------------------------------------------------------
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   157
# &angle(val)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   158
#	return angle in range [-180,180]
5
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   159
# &angle_pos(val)
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   160
#	return angle in range [0,360]
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   161
# &angle_diff(ref_dir,dir)
5
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   162
#	return rotation between two angles in range [-180,180]
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   163
# &rotation_ts(dir)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   164
#	return time series of rotation
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   165
# &angle_ts(dir)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   166
#	return time series of angle without "wrap-around jumps"
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   167
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   168
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   169
sub angle(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   170
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   171
	my($val) = &antsFunUsage(1,"f","<val>",@_);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   172
	$val += 360 while ($val < -180);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   173
	$val -= 360 while ($val > 180);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   174
	return $val;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   175
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   176
5
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   177
sub angle_pos(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   178
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   179
	my($val) = angle(@_);
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   180
	return ($val < 0) ? 360+$val : $val;
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   181
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   182
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   183
sub angle_diff(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   184
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   185
	my($m,$s) = &antsFunUsage(2,"ff","<minuend> <subtrahend>",@_);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   186
	return angle($m-$s);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   187
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   188
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   189
{ my($last_in);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   190
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   191
  sub rotation_ts(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   192
  {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   193
	my($a) = &antsFunUsage(1,"f","<angle>",@_);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   194
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   195
	my($rot) = defined($last_in) ? angle_diff($a,$last_in) : nan;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   196
	$last_in = $a;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   197
	return $rot;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   198
  }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   199
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   200
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   201
{ my($last_in,$last_out);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   202
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   203
  sub angle_ts(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   204
  {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   205
	my($a) = &antsFunUsage(1,"f","<angle>",@_);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   206
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   207
	$last_out = $last_in = $a
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   208
		unless (defined($last_in));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   209
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   210
	$last_out += angle_diff($a,$last_in);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   211
	$last_in = $a;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   212
	return $last_out;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   213
  }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   214
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   215
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   216
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   217
# &ddeg(deg),&GMTdeg(deg)				convert degree formats
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   218
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   219
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   220
sub ddeg(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   221
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   222
	my($deg) = &antsFunUsage(1,"","<degrees in GMT format>",@_);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   223
	my($d,$m,$s) = split(':',$deg);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   224
	return ($d>=0) ? $d+$m/60+$s/3600
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   225
				   : $d-$m/60-$s/3600;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   226
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   227
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   228
# NB: without roundoff code, results are as follows:
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   229
#		abc -Lvec 'GMTdeg(ddeg("10:11"))' -> 10:11:8.52651e-13
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   230
#		abc -Lvec 'GMTdeg(ddeg("10:10"))' -> 10:9:60
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   231
sub GMTdeg(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   232
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   233
	my($deg) = &antsFunUsage(1,"f","<degrees>",@_);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   234
	my($sgn); if ($deg < 0) { $sgn = '-'; $deg *= -1; }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   235
	my($min) = 60*($deg-int($deg));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   236
	my($sec) = 60*($min-int($min));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   237
	$sec=0,$min++ if equal($sec,60);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   238
	$sec=0        if equal($sec,0);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   239
	return sprintf("$sgn%d:%d:%g",int($deg),int($min),$sec);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   240
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   241
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   242
sub degmin(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   243
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   244
	my($deg) = &antsFunUsage(1,"f","<degrees>",@_);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   245
	my($sgn); if ($deg < 0) { $sgn = '-'; $deg *= -1; }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   246
	my($min) = 60*($deg-int($deg));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   247
	$min=0 if equal($min,0);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   248
	return sprintf("$sgn%d:%04.1f",int($deg),$min);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   249
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   250
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   251
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   252
# &dist(lat1,lon1,lat2,lon2)	distance on globe (in m)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   253
# &dist12(...)					ditto but with deg/min/sec separate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   254
# &dir(lat1,lon1,lat2,lon2)		direction btw two points
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   255
# &area(gmt_region)				approximate area
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   256
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   257
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   258
sub dist(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   259
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   260
	my($lat1,$lon1,$lat2,$lon2) =
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   261
		&antsFunUsage(4,"","lat1 lon1 lat2 lon2",@_);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   262
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   263
	$lat1 = &ddeg($lat1);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   264
	$lat2 = &ddeg($lat2);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   265
	$lon1 = &ddeg($lon1);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   266
	$lon2 = &ddeg($lon2);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   267
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   268
	return 0 if ($lat1 == $lat2 && $lon1 == $lon2);	# avoid roundoff
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   269
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   270
	$radius = 6378139; 					# const
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   271
	$pi = 3.14159265358979;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   272
	$d2r = $pi/180.0;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   273
	
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   274
	$ct1 = cos($d2r*$lat1);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   275
	$st1 = sin($d2r*$lat1);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   276
	$cp1 = cos($d2r*$lon1);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   277
	$sp1 = sin($d2r*$lon1);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   278
	$ct2 = cos($d2r*$lat2);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   279
	$st2 = sin($d2r*$lat2);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   280
	$cp2 = cos($d2r*$lon2);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   281
	$sp2 = sin($d2r*$lon2);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   282
	
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   283
	$cosine = $ct1*$cp1*$ct2*$cp2 + $ct1*$sp1*$ct2*$sp2 + $st1*$st2;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   284
	if ($cosine > 1.0) { $cosine = 1.0; }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   285
	if ($cosine < -1.0) { $cosine = -1.0; }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   286
	
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   287
	return $radius * acos($cosine);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   288
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   289
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   290
sub dist12(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   291
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   292
	my($la1d,$la1m,$la1s,$lo1d,$lo1m,$lo1s,
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   293
	   $la2d,$la2m,$la2s,$lo2d,$lo2m,$lo2s) =
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   294
		&antsFunUsage(12,"ffffffffffff","lat1 m s lon1 m s lat2 m s lon2 m s",@_);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   295
	return dist(
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   296
		($la1d>=0)?$la1d+$la1m/60+$la1s/3600 : $la1d-$la1m/60-$la1s/3600,
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   297
		($lo1d>=0)?$lo1d+$lo1m/60+$lo1s/3600 : $lo1d-$lo1m/60-$lo1s/3600,
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   298
		($la2d>=0)?$la2d+$la2m/60+$la2s/3600 : $la2d-$la2m/60-$la2s/3600,
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   299
		($lo2d>=0)?$lo2d+$lo2m/60+$lo2s/3600 : $lo2d-$lo2m/60-$lo2s/3600
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   300
	);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   301
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   302
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   303
sub dir(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   304
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   305
	my($lat1,$lon1,$lat2,$lon2) =
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   306
		&antsFunUsage(4,"","lat1 lon1 lat2 lon2",@_);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   307
	my($dx) = dist(($lat1+$lat2)/2,$lon1,($lat1+$lat2)/2,$lon2);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   308
	$dx *= -1 if ($lon2 < $lon1);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   309
	my($dy) = dist($lat1,($lon1+$lon2)/2,$lat2,($lon1+$lon2)/2);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   310
	$dy *= -1 if ($lat2 < $lat1);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   311
	return ($dx == 0 && $dy == 0) ? nan : vel_dir($dx,$dy);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   312
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   313
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   314
sub area(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   315
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   316
	my($R) = &antsFunUsage(1,"",'<"W/E/S/N">',@_);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   317
	my($W,$E,$S,$N) = split('/',$R);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   318
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   319
	return (&dist($S,$W,$S,$E) + &dist($N,$W,$N,$E)) / 2 *
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   320
		   (&dist($S,$W,$N,$W) + &dist($S,$E,$N,$E)) / 2;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   321
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   322
2
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents: 0
diff changeset
   323
#----------------------------------------------------------------------
3
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 2
diff changeset
   324
# ($lat,$lon,$t) = &closestPointOnStraightLine(lat,lon,lat1,lonA,lat2,lon2)
2
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents: 0
diff changeset
   325
#	- determine point on line segment from <lat1,lonA> to <lat2,lon2> that
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents: 0
diff changeset
   326
#	  is closest to target point <lat,lon>
3
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 2
diff changeset
   327
#	- $t [0-1] output indicates where along the line segment the closest
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 2
diff changeset
   328
#	  point lies
2
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents: 0
diff changeset
   329
#   - http://stackoverflow.com/questions/3120357/get-closest-point-to-a-line
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents: 0
diff changeset
   330
#	- NOT DONE IN PLANAR GEOMETRY => USE ONLY IN SMALL DOMAINS
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents: 0
diff changeset
   331
#----------------------------------------------------------------------
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents: 0
diff changeset
   332
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents: 0
diff changeset
   333
sub closestPointOnStraightLine(@)
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents: 0
diff changeset
   334
{
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents: 0
diff changeset
   335
	my($latP,$lonP,$latA,$lonA,$latB,$lonB) =
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents: 0
diff changeset
   336
		&antsFunUsage(6,'ffffff','pnt_lat, pnt_lon, lne_latA, lne_lonA, lne_latB, lne_lonB',@_);
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents: 0
diff changeset
   337
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents: 0
diff changeset
   338
	my($ABlon) = $lonB - $lonA; my($ABlat) = $latB - $latA; 
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents: 0
diff changeset
   339
	my($APlon) = $lonP - $lonA; my($APlat) = $latP - $latA;
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents: 0
diff changeset
   340
	my($t) = ($APlon*$ABlon + $APlat*$ABlat) / ($ABlon**2 + $ABlat**2);
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents: 0
diff changeset
   341
	return (undef,undef) unless ($t>=0 && $t<=1);
3
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 2
diff changeset
   342
	return ($latA + $t*$ABlat,$lonA + $t*$ABlon, $t);
2
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents: 0
diff changeset
   343
}
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents: 0
diff changeset
   344
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   345
1;