#####################################################################
#
# Some utility routines that are useful in vector problems
#
sub _parserVectorUtils_init {}; # don't reload this file
##################################################
#
# formats a vector name (should be used in math mode)
#
# Vectors will be in bold italics in HTML modes, and
# will be overlined in TeX modes. (Bold italic could also work in
# TeX modes, but the low resolution on screen made it less easy
# to distinguish the difference between bold and regular letters.)
#
sub Overline {
my $v = shift;
my $HTML = ''.$v.'';
MODES(
TeX => "\\overline{$v}",
HTML => $HTML,
HTML_tth => '\begin{rawhtml}'.$HTML.'\end{rawhtml}',
HTML_dpng => "\\overline{$v}",
);
}
#
# This gets a bold letter in TeX as well as HTML modes.
# Although \boldsymbol{} works fine on screen in latex2html mode,
# the PDF file produces non-bold letters. I haven't been able to
# track this down, so used \mathbf{} in TeX mode, which produces
# roman bold, not math-italic bold.
#
sub BoldMath {
my $v = shift;
my $HTML = ''.$v.'';
MODES(
TeX => "\\boldsymbol{$v}", # doesn't seem to work in TeX mode
# TeX => "\\mathbf{$v}", # gives non-italic bold in TeX mode
Latex2HTML => "\\boldsymbol{$v}",
HTML => $HTML,
HTML_tth => '\begin{rawhtml}'.$HTML.'\end{rawhtml}',
HTML_dpng => "\\boldsymbol{$v}",
);
}
#
# Grad sumbol
#
$GRAD = '\nabla ';
#
# Create a non-zero point with the given number of coordinates
# with the given random range (which defaults to (-5,5,1)).
#
# non_zero_point(n,a,b,c)
#
sub non_zero_point {
my $n = shift; my $k = $n; my @v = ();
my $a = shift || -5; my $b = shift || $a + 10; my $c = shift || 1;
while ($k--) {push(@v,random($a,$b,$c))}
if (norm(Point(@v)) == 0) {$v[random(0,$n-1,1)] = non_zero_random($a,$b,$c)}
return Point(@v);
}
sub non_zero_point2D {non_zero_point(2,@_)}
sub non_zero_point3D {non_zero_point(3,@_)}
#
# Same but for Vectors
#
sub non_zero_vector {Vector(non_zero_point(@_))}
sub non_zero_vector2D {non_zero_vector(2,@_)}
sub non_zero_vector3D {non_zero_vector(3,@_)}
#
# Form the vector-parametric form for a line given its point and vector
#
# Usage: Line(P,V); or Line(P,V,'t');
#
# where P is the point and V the direction vector for the line, and
# t is the variable to use (default is 't').
#
# Ex: Line([1,-3],[2,1]) produces Vector("1+2t","-3+t").
# Ex: Line(Point(1,-3),Vector(2,1)) produces Vector("1+2t","-3+t").
#
sub Line {
my @p = Point(shift)->value; my @v = Vector(shift)->value;
my $t = shift; $t = 't' unless $t; $t = Formula($t);
my @coords = ();
die "Dimensions of point and vector don't match" unless $#p == $#v;
foreach my $i (0..$#p) {push(@coords,($p[$i]+$v[$i]*$t)->reduce)}
return Vector(@coords);
}
#
# Creates a displayable string for a plane given its
# normal vector and a point on the plane. (Better to use
# the ImplicitPlane class from parserImplicitPlane.pl).
#
# Usage: Plane(P,N);
#
sub Plane {
my $P = Point(shift); my $N = Vector(shift); my @N = $N->value;
my $xyz = shift; $xyz = ['x','y','z'] unless defined($xyz);
die "Number of variables doesn't match dimension of normal vector"
unless scalar(@N) == scalar(@{$xyz});
my @terms = ();
foreach my $i (0..$#N) {push(@terms,$N[$i]->TeX.$xyz->[$i])}
Formula(join(' + ',@terms))->reduce->TeX . " = " . ($N.$P)->TeX;
}
1;