#!perl -w -I..
#______________________________________________________________________
# Symbolic algebra: Invariants of the ellipse.
# PhilipRBrenan@yahoo.com, 2004, Perl License.
#______________________________________________________________________
use Math::Algebra::Symbols;
use Test::More tests => 5;
#______________________________________________________________________
# Focus trip == 2R.
#______________________________________________________________________
{my ($i, $R, $f, $x) = symbols(qw(i R f x));
my $y = sqrt($R*$R-$f*$f - $x*$x +$f*$f*$x*$x / ($R*$R)); # Ellipse: rr=RR-ff
my $a = $x+$i*$y - $f; # Vector from Focus to locus
my $b = $x+$i*$y + $f; # Vector from other Focus to locus
ok(abs($a) + abs($b) == 2*$R, 'Focus trip is constant 2R');
}
#______________________________________________________________________
# Angle of incidence equals angle of reflection via dot product with
# normal to tangent vector.
#______________________________________________________________________
{my ($i, $R, $f, $x) = symbols(qw(i R f x));
my $r = sqrt($R*$R - $f*$f); # Minor radius
my $y = sqrt($r*$r - $x*$x +$f*$f*$x*$x / ($R*$R)); # Ellipse
my $p = $x + $i * $y; # x,y point on locus of ellipse
my $s = $x*$r*$r + $i*$y*$R*$R; # Normal to tangent at locus
my $a = $p - $f; # Vector from Focus to locus
my $b = $p + $f; # Vector from other Focus to locus
my $c = $a * abs($b); # Make each focus vector the same length
my $d = $b * abs($a); # so that dot or cross will measure angle
my $A = $c^$s; # Angle of Reflection vs
my $B = $d^$s; # Angle of Incidence
ok($A == $B, "Angle of incidence equals angle of reflection via dot product with normal to tangent");
}
#______________________________________________________________________
# Angle of incidence equals angle of reflection via dot product with
# tangent vector using optimized substitutions.
# NB: -B due to anti-symmetry of cos(x) at x==pi/2
#______________________________________________________________________
{my ($i, $R, $f, $x) = symbols(qw(i R f x));
my $r = sqrt($R*$R - $f*$f); # Minor radius
my $y = sqrt($r*$r - $x*$x +$f*$f*$x*$x / ($R*$R)); # Ellipse
my $p = $x + $i * $y; # x,y point on locus of ellipse
my $s = $i*$x*$r*$r - $y*$R*$R; # Tangent at locus
my $a = $p - $f; # Vector from Focus to locus
my $b = $p + $f; # Vector from other Focus to locus
my $c = $a * abs($b); # Make each focus vector the same length
my $d = $b * abs($a); # so that dot or cross will measure angle
my $A = $c ^ $s; # Angle of Reflection vs
my $B = $d ^ $s; # Angle of Incidence
ok($A == -$B, "Angle of incidence equals angle of reflection via dot product with tangent");
}
#______________________________________________________________________
# Angle of incidence equals angle of reflection via cross product with
# normal to tangent vector.
#______________________________________________________________________
{my ($i, $R, $f, $x) = symbols(qw(i R f x));
my $r = sqrt($R*$R - $f*$f); # Minor radius
my $y = sqrt($r*$r - $x*$x +$f*$f*$x*$x / ($R*$R)); # Ellipse
my $p = $x + $i * $y; # x,y point on locus of ellipse
my $s = $x*$r*$r + $y*$R*$R*$i; # Normal to tangent at locus
my $a = $p - $f; # Vector from Focus to locus
my $b = $p + $f; # Vector from other Focus to locus
my $c = $a * abs($b); # Make each focus vector the same length
my $d = $b * abs($a); # so that dot or cross will measure angle
my $A = $c x $s; # Angle of Reflection vs
my $B = $d x $s; # Angle of Incidence
ok($A == $B, "Angle of incidence equals angle of reflection via cross product with normal to tangent");
}
#______________________________________________________________________
# Angle of incidence equals angle of reflection via cross product with
# tangent vector.
#______________________________________________________________________
{my ($i, $R, $f, $x) = symbols(qw(i R f x));
my $r = sqrt($R*$R - $f*$f); # Focus
my $y = sqrt($r*$r - $x*$x +$f*$f*$x*$x / ($R*$R)); # Ellipse
my $p = $x + $i * $y; # x,y point on locus of ellipse
my $s = $i*($x*$r*$r + $y*$R*$R*$i); # Normal to tangent at locus
my $a = $p - $f; # Vector from Focus to locus
my $b = $p + $f; # Vector from other Focus to locus
my $c = $a * abs($b); # Make each focus vector the same length
my $d = $b * abs($a); # so that dot or cross will measure angle
my $A = $c x $s; # Angle of Reflection vs
my $B = $d x $s; # Angle of Incidence
ok($A == $B, "Angle of incidence equals angle of reflection via cross product with tangent");
}
syntax highlighted by Code2HTML, v. 0.9.1