[system] / trunk / pg / macros / parserVectorUtils.pl Repository: Repository Listing bbplugincoursesdistsnplrochestersystemwww

# Annotation of /trunk/pg/macros/parserVectorUtils.pl

 1 : dpvc 2729 ##################################################################### 2 : # 3 : # Some utility routines that are useful in vector problems 4 : # 5 : 6 : sub _parserVectorUtils_init {}; # don't reload this file 7 : 8 : ################################################## 9 : 10 : # 11 : # formats a vector name (should be used in math mode) 12 : # 13 : # Vectors will be in bold italics in HTML modes, and 14 : # will be overlined in TeX modes. (Bold italic could also work in 15 : # TeX modes, but the low resolution on screen made it less easy 16 : # to distinguish the difference between bold and regular letters.) 17 : # 18 : sub Overline { 19 : my $v = shift; 20 : my$HTML = ''.$v.''; 21 : MODES( 22 : TeX => "\\overline{$v}", 23 : HTML => $HTML, 24 : HTML_tth => '\begin{rawhtml}'.$HTML.'\end{rawhtml}', 25 : HTML_dpng => "\\overline{$v}", 26 : ); 27 : } 28 : 29 : # 30 : # This gets a bold letter in TeX as well as HTML modes. 31 : # Although \boldsymbol{} works fine on screen in latex2html mode, 32 : # the PDF file produces non-bold letters. I haven't been able to 33 : # track this down, so used \mathbf{} in TeX mode, which produces 34 : # roman bold, not math-italic bold. 35 : # 36 : sub BoldMath { 37 : my$v = shift; 38 : my $HTML = ''.$v.''; 39 : MODES( 40 : TeX => "\\boldsymbol{$v}", # doesn't seem to work in TeX mode 41 : # TeX => "\\mathbf{$v}", # gives non-italic bold in TeX mode 42 : Latex2HTML => "\\boldsymbol{$v}", 43 : HTML =>$HTML, 44 : HTML_tth => '\begin{rawhtml}'.$HTML.'\end{rawhtml}', 45 : HTML_dpng => "\\boldsymbol{$v}", 46 : ); 47 : } 48 : 49 : # 50 : # Grad sumbol 51 : # 52 : $GRAD = '\nabla '; 53 : 54 : # 55 : # Create a non-zero point with the given number of coordinates 56 : # with the given random range (which defaults to (-5,5,1)). 57 : # 58 : # non_zero_point(n,a,b,c) 59 : # 60 : sub non_zero_point { 61 : my$n = shift; my $k =$n; my @v = (); 62 : my $a = shift || -5; my$b = shift || $a + 10; my$c = shift || 1; 63 : while ($k--) {push(@v,random($a,$b,$c))} 64 : if (norm(Point(@v)) == 0) {$v[random(0,$n-1,1)] = non_zero_random($a,$b,$c)} 65 : return Point(@v); 66 : } 67 : sub non_zero_point2D {non_zero_point(2,@_)} 68 : sub non_zero_point3D {non_zero_point(3,@_)} 69 : 70 : # 71 : # Same but for Vectors 72 : # 73 : sub non_zero_vector {Vector(non_zero_point(@_))} 74 : sub non_zero_vector2D {non_zero_vector(2,@_)} 75 : sub non_zero_vector3D {non_zero_vector(3,@_)} 76 : 77 : # 78 : # Form the vector-parametric form for a line given its point and vector 79 : # 80 : # Usage: Line(P,V); or Line(P,V,'t'); 81 : # 82 : # where P is the point and V the direction vector for the line, and 83 : # t is the variable to use (default is 't'). 84 : # 85 : # Ex: Line([1,-3],[2,1]) produces Vector("1+2t","-3+t"). 86 : # Ex: Line(Point(1,-3),Vector(2,1)) produces Vector("1+2t","-3+t"). 87 : # 88 : sub Line { 89 : my @p = Point(shift)->value; my @v = Vector(shift)->value; 90 : my$t = shift; $t = 't' unless$t; $t = Formula($t); 91 : my @coords = (); 92 : die "Dimensions of point and vector don't match" unless $#p ==$#v; 93 : foreach my $i (0..$#p) {push(@coords,($p[$i]+$v[$i]*$t)->reduce)} 94 : return Vector(@coords); 95 : } 96 : 97 : # 98 : # Creates a displayable string for a plane given its 99 : # normal vector and a point on the plane. (Better to use 100 : # the ImplicitPlane class from parserImplicitPlane.pl). 101 : # 102 : dpvc 2933 # Usage: Plane(P,N); 103 : dpvc 2729 # 104 : sub Plane { 105 : dpvc 2933 my$P = Point(shift); my $N = Vector(shift); my @N =$N->value; 106 : dpvc 2729 my $xyz = shift;$xyz = ['x','y','z'] unless defined($xyz); 107 : die "Number of variables doesn't match dimension of normal vector" 108 : dpvc 2933 unless scalar(@N) == scalar(@{$xyz}); 109 : dpvc 2729 my @terms = (); 110 : dpvc 2933 foreach my $i (0..$#N) {push(@terms,$N[$i]->TeX.$xyz->[$i])} 111 : dpvc 2729 Formula(join(' + ',@terms))->reduce->TeX . " = " . ($N.$P)->TeX; 112 : } 113 : 114 : 1;