libvec.pl
changeset 6 b965580e8782
parent 5 7d6e11d484ec
child 11 56799f01321a
equal deleted inserted replaced
5:7d6e11d484ec 6:b965580e8782
     1 #======================================================================
     1 #======================================================================
     2 #                    L I B V E C . P L 
     2 #                    L I B V E C . P L 
     3 #                    doc: Sat Mar 20 12:50:32 1999
     3 #                    doc: Sat Mar 20 12:50:32 1999
     4 #                    dlm: Wed Nov 27 23:46:31 2013
     4 #                    dlm: Wed May 21 21:26:22 2014
     5 #                    (c) 1999 A.M. Thurnherr
     5 #                    (c) 1999 A.M. Thurnherr
     6 #                    uE-Info: 36 53 NIL 0 0 70 2 2 4 NIL ofnI
     6 #                    uE-Info: 39 0 NIL 0 0 70 2 2 4 NIL ofnI
     7 #======================================================================
     7 #======================================================================
     8 
     8 
     9 # HISTORY:
     9 # HISTORY:
    10 #	Mar 20, 1999: - created for ANTS_2.1 (no more c-code)
    10 #	Mar 20, 1999: - created for ANTS_2.1 (no more c-code)
    11 #	May 27, 1999: - added polar/cartesian conversions
    11 #	May 27, 1999: - added polar/cartesian conversions
    32 #	Nov  5, 2009: - added angle(); vel_bias() => angle_diff()
    32 #	Nov  5, 2009: - added angle(); vel_bias() => angle_diff()
    33 #	Apr 22, 2010: - added angle_ts()
    33 #	Apr 22, 2010: - added angle_ts()
    34 #	Jun  5, 2012: - added &closestPointOnStraightLine()
    34 #	Jun  5, 2012: - added &closestPointOnStraightLine()
    35 #	Jun 11, 2012: - addeed $t output to &closestPointOnStraightLine()
    35 #	Jun 11, 2012: - addeed $t output to &closestPointOnStraightLine()
    36 #	Nov 27, 2013: - added &angle_pos(), mag_heading()
    36 #	Nov 27, 2013: - added &angle_pos(), mag_heading()
       
    37 #	Mar  3, 2014: - made deg(), rad() handle nans
       
    38 #	Mar  4, 2014: - made some angle funs handle nans
    37 
    39 
    38 require "$ANTS/libPOSIX.pl";	# acos()
    40 require "$ANTS/libPOSIX.pl";	# acos()
    39 
    41 
    40 #----------------------------------------------------------------------
    42 #----------------------------------------------------------------------
    41 # &rad()							calc radians
    43 # &rad()							calc radians
    44 
    46 
    45 $PI = 3.14159265358979;
    47 $PI = 3.14159265358979;
    46 
    48 
    47 sub rad(@)
    49 sub rad(@)
    48 {
    50 {
    49 	my($d) = &antsFunUsage(1,"f","<deg>",@_);
    51 	my($d) = &antsFunUsage(1,".","<deg>",@_);
    50 	return $d/180 * $PI;
    52 	return numberp($d) ? $d/180 * $PI : nan;
    51 }
    53 }
    52 
    54 
    53 sub deg(@)
    55 sub deg(@)
    54 {
    56 {
    55 	my($r) = &antsFunUsage(1,"f","<rad>",@_);
    57 	my($r) = &antsFunUsage(1,".","<rad>",@_);
    56 	return $r/$PI * 180;
    58 	return numberp($r) ? $r/$PI * 180 : nan;
    57 }
    59 }
    58 	
    60 	
    59 
    61 
    60 #----------------------------------------------------------------------
    62 #----------------------------------------------------------------------
    61 # &proj(from_x,from_y,onto_unit_x,onto_unit_y)
    63 # &proj(from_x,from_y,onto_unit_x,onto_unit_y)
   166 #	return time series of angle without "wrap-around jumps"
   168 #	return time series of angle without "wrap-around jumps"
   167 #----------------------------------------------------------------------
   169 #----------------------------------------------------------------------
   168 
   170 
   169 sub angle(@)
   171 sub angle(@)
   170 {
   172 {
   171 	my($val) = &antsFunUsage(1,"f","<val>",@_);
   173 	my($val) = &antsFunUsage(1,".","<val>",@_);
       
   174 	return nan unless numberp($val);
   172 	$val += 360 while ($val < -180);
   175 	$val += 360 while ($val < -180);
   173 	$val -= 360 while ($val > 180);
   176 	$val -= 360 while ($val > 180);
   174 	return $val;
   177 	return $val;
   175 }
   178 }
   176 
   179 
   177 sub angle_pos(@)
   180 sub angle_pos(@)
   178 {
   181 {
   179 	my($val) = angle(@_);
   182 	my($val) = angle(@_);
       
   183 	return nan unless numberp($val);
   180 	return ($val < 0) ? 360+$val : $val;
   184 	return ($val < 0) ? 360+$val : $val;
   181 }
   185 }
   182 
   186 
   183 sub angle_diff(@)
   187 sub angle_diff(@)
   184 {
   188 {
   185 	my($m,$s) = &antsFunUsage(2,"ff","<minuend> <subtrahend>",@_);
   189 	my($m,$s) = &antsFunUsage(2,"..","<minuend> <subtrahend>",@_);
       
   190 	return nan unless numbersp($m,$s);
   186 	return angle($m-$s);
   191 	return angle($m-$s);
   187 }
   192 }
   188 
   193 
   189 { my($last_in);
   194 { my($last_in);
   190 
   195