# this works as a bash include
#
#PRIO 1.1
#COMM Math::GeometNdPoint->cross_prod() in 3D
#COMM - monitor results over a parallelogram of transformations
#
function homogaddr {
  perl -n -e 's/(ARRAY|HASH)\(0x\w{5,8}\)/$1(0x123ABC)/; print' "$@"
}
perl -e '
  use lib shift();  # give include precedence to code directory, perl -I would not work!
  use strict;
  use MainLib::Data;
  use Math::GeometNdPoint;
  use Math::GeometNdTrform;
  my $ndim=3;
  my ($pVec1,$pVec2,$pVecN);
  $pVec1 = Math::GeometNdPoint->new($ndim,[2,0,0])
    or die "Math::GeometNdPoint construction failed";
  $pVec2 = Math::GeometNdPoint->new($ndim,[0,3,0]);
  printf "argument vectors: %s %s\n",
    $pVec1->string(-label=>q(vector)), $pVec2->string(-label=>q(vector));
  $pVecN = $pVec1->cross_prod($pVec2);
  printf "vector cross product: %s\n", $pVecN->string(-label=>q(vector));
  &DataPrint([$pVecN],-NoMyRef=>1,-space=>2);
  printf "argument vectors, control: %s %s\n",
    $pVec1->string(-label=>q(vector)), $pVec2->string(-label=>q(vector));
  print  "-----\n";
  my $pi=3.14159265358979;
  my $pTrf = Math::GeometNdTrform->new_rotate($ndim,0,1,$pi/4);
  $pTrf->append( Math::GeometNdTrform->new_rotate($ndim,1,2,$pi/6) );
  foreach my $pV ($pVec1,$pVec2,$pVecN){ $pV->transform($pTrf) }
  printf "argument vectors: %s %s\n",
    $pVec1->string(-label=>q(vector),-fmtfloat=>q(%.2f)),
    $pVec2->string(-label=>q(vector),-fmtfloat=>q(%.2f));
  my $pVecN2 = $pVec1->cross_prod($pVec2);
  printf "vector cross product, expected: %s\n",
    $pVecN->string(-label=>q(vector),-fmtfloat=>q(%.2f));
  printf "vector cross product: %s\n",
    $pVecN2->string(-label=>q(vector),-fmtfloat=>q(%.2f));
  printf "  amount: %.2f\n", $pVecN2->amount();
  printf "argument vectors, control: %s %s\n",
    $pVec1->string(-label=>q(vector),-fmtfloat=>q(%.2f)),
    $pVec2->string(-label=>q(vector),-fmtfloat=>q(%.2f));
  ' -- "$dircode"  \
| homogaddr
