| 1 | 1 <html> | 
|  | 2 <head> | 
|  | 3 <title>MayaChemTools:Code:Vector.pm</title> | 
|  | 4 <meta http-equiv="content-type" content="text/html;charset=utf-8"> | 
|  | 5 <link rel="stylesheet" type="text/css" href="../../../css/MayaChemToolsCode.css"> | 
|  | 6 </head> | 
|  | 7 <body leftmargin="20" rightmargin="20" topmargin="10" bottommargin="10"> | 
|  | 8 <br/> | 
|  | 9 <center> | 
|  | 10 <a href="http://www.mayachemtools.org" title="MayaChemTools Home"><img src="../../../images/MayaChemToolsLogo.gif" border="0" alt="MayaChemTools"></a> | 
|  | 11 </center> | 
|  | 12 <br/> | 
|  | 13 <pre> | 
|  | 14 <a name="package-Vector-"></a>   1 <span class="k">package </span><span class="i">Vector</span><span class="sc">;</span> | 
|  | 15    2 <span class="c">#</span> | 
|  | 16    3 <span class="c"># $RCSfile: Vector.pm,v $</span> | 
|  | 17    4 <span class="c"># $Date: 2015/02/28 20:47:30 $</span> | 
|  | 18    5 <span class="c"># $Revision: 1.34 $</span> | 
|  | 19    6 <span class="c">#</span> | 
|  | 20    7 <span class="c"># Author: Manish Sud <msud@san.rr.com></span> | 
|  | 21    8 <span class="c">#</span> | 
|  | 22    9 <span class="c"># Copyright (C) 2015 Manish Sud. All rights reserved.</span> | 
|  | 23   10 <span class="c">#</span> | 
|  | 24   11 <span class="c"># This file is part of MayaChemTools.</span> | 
|  | 25   12 <span class="c">#</span> | 
|  | 26   13 <span class="c"># MayaChemTools is free software; you can redistribute it and/or modify it under</span> | 
|  | 27   14 <span class="c"># the terms of the GNU Lesser General Public License as published by the Free</span> | 
|  | 28   15 <span class="c"># Software Foundation; either version 3 of the License, or (at your option) any</span> | 
|  | 29   16 <span class="c"># later version.</span> | 
|  | 30   17 <span class="c">#</span> | 
|  | 31   18 <span class="c"># MayaChemTools is distributed in the hope that it will be useful, but without</span> | 
|  | 32   19 <span class="c"># any warranty; without even the implied warranty of merchantability of fitness</span> | 
|  | 33   20 <span class="c"># for a particular purpose.  See the GNU Lesser General Public License for more</span> | 
|  | 34   21 <span class="c"># details.</span> | 
|  | 35   22 <span class="c">#</span> | 
|  | 36   23 <span class="c"># You should have received a copy of the GNU Lesser General Public License</span> | 
|  | 37   24 <span class="c"># along with MayaChemTools; if not, see <http://www.gnu.org/licenses/> or</span> | 
|  | 38   25 <span class="c"># write to the Free Software Foundation Inc., 59 Temple Place, Suite 330,</span> | 
|  | 39   26 <span class="c"># Boston, MA, 02111-1307, USA.</span> | 
|  | 40   27 <span class="c">#</span> | 
|  | 41   28 | 
|  | 42   29 <span class="k">use</span> <span class="w">strict</span><span class="sc">;</span> | 
|  | 43   30 <span class="k">use</span> <span class="w">Carp</span><span class="sc">;</span> | 
|  | 44   31 <span class="k">use</span> <span class="w">Exporter</span><span class="sc">;</span> | 
|  | 45   32 <span class="k">use</span> <span class="w">Scalar::Util</span> <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 46   33 <span class="k">use</span> <span class="w">StatisticsUtil</span> <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 47   34 | 
|  | 48   35 <span class="k">use</span> <span class="w">vars</span> <span class="q">qw(@ISA @EXPORT @EXPORT_OK %EXPORT_TAGS)</span><span class="sc">;</span> | 
|  | 49   36 | 
|  | 50   37 <span class="i">@ISA</span> = <span class="q">qw(Exporter)</span><span class="sc">;</span> | 
|  | 51   38 <span class="i">@EXPORT</span> = <span class="q">qw(IsVector UnitXVector UnitYVector UnitZVector UnitVector ZeroVector)</span><span class="sc">;</span> | 
|  | 52   39 <span class="i">@EXPORT_OK</span> = <span class="q">qw(SetValuePrintFormat)</span><span class="sc">;</span> | 
|  | 53   40 | 
|  | 54   41 <span class="i">%EXPORT_TAGS</span> = <span class="s">(</span> | 
|  | 55   42                 <span class="w">all</span>  <span class="cm">=></span> <span class="s">[</span><span class="i">@EXPORT</span><span class="cm">,</span> <span class="i">@EXPORT_OK</span><span class="s">]</span> | 
|  | 56   43                <span class="s">)</span><span class="sc">;</span> | 
|  | 57   44 | 
|  | 58   45 <span class="c"># Setup class variables...</span> | 
|  | 59   46 <span class="k">my</span><span class="s">(</span><span class="i">$ClassName</span><span class="cm">,</span> <span class="i">$ValueFormat</span><span class="s">)</span><span class="sc">;</span> | 
|  | 60   47 <span class="i">_InitializeClass</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 61   48 | 
|  | 62   49 <span class="c">#</span> | 
|  | 63   50 <span class="c"># Using the following explicity overloaded operators, Perl automatically generates methods</span> | 
|  | 64   51 <span class="c"># for operations with no explicitly defined methods. Autogenerated methods are possible for</span> | 
|  | 65   52 <span class="c"># these operators:</span> | 
|  | 66   53 <span class="c">#</span> | 
|  | 67   54 <span class="c">#    o Arithmetic operators: += -= *= /= **= %= ++ -- x= .=</span> | 
|  | 68   55 <span class="c">#    o Increment and decrement: ++ --</span> | 
|  | 69   56 <span class="c">#</span> | 
|  | 70   57 <span class="c"># 'fallback' is set to 'false' to raise exception for all other operators.</span> | 
|  | 71   58 <span class="c">#</span> | 
|  | 72   59 <span class="k">use</span> <span class="w">overload</span> <span class="q">'""'</span> <span class="cm">=></span> <span class="q">'StringifyVector'</span><span class="cm">,</span> | 
|  | 73   60 | 
|  | 74   61   <span class="q">'0+'</span> <span class="cm">=></span> <span class="q">'_NumifyVector'</span><span class="cm">,</span> | 
|  | 75   62 | 
|  | 76   63   <span class="q">'@{}'</span> <span class="cm">=></span> <span class="q">'_VectorToArrayOperator'</span><span class="cm">,</span> | 
|  | 77   64 | 
|  | 78   65   <span class="q">'+'</span> <span class="cm">=></span> <span class="q">'_VectorAdditionOperator'</span><span class="cm">,</span> | 
|  | 79   66   <span class="q">'-'</span> <span class="cm">=></span> <span class="q">'_VectorSubtractionOperator'</span><span class="cm">,</span> | 
|  | 80   67   <span class="q">'*'</span> <span class="cm">=></span> <span class="q">'_VectorMultiplicationOperator'</span><span class="cm">,</span> | 
|  | 81   68   <span class="q">'/'</span> <span class="cm">=></span> <span class="q">'_VectorDivisionOperator'</span><span class="cm">,</span> | 
|  | 82   69   <span class="q">'**'</span> <span class="cm">=></span> <span class="q">'_VectorExponentiationOperator'</span><span class="cm">,</span> | 
|  | 83   70   <span class="q">'%'</span> <span class="cm">=></span> <span class="q">'_VectorModulusOperator'</span><span class="cm">,</span> | 
|  | 84   71 | 
|  | 85   72   <span class="q">'x'</span> <span class="cm">=></span> <span class="q">'_VectorCrossProductOperator'</span><span class="cm">,</span> | 
|  | 86   73   <span class="q">'.'</span> <span class="cm">=></span> <span class="q">'_VectorDotProductOperator'</span><span class="cm">,</span> | 
|  | 87   74 | 
|  | 88   75   <span class="q">'bool'</span> <span class="cm">=></span> <span class="q">'_VectorBooleanOperator'</span><span class="cm">,</span> | 
|  | 89   76   <span class="q">'!'</span> <span class="cm">=></span> <span class="q">'_VectorNotBooleanOperator'</span><span class="cm">,</span> | 
|  | 90   77 | 
|  | 91   78   <span class="q">'=='</span> <span class="cm">=></span> <span class="q">'_VectorEqualOperator'</span><span class="cm">,</span> | 
|  | 92   79   <span class="q">'!='</span> <span class="cm">=></span> <span class="q">'_VectorNotEqualOperator'</span><span class="cm">,</span> | 
|  | 93   80   <span class="q">'<'</span> <span class="cm">=></span> <span class="q">'_VectorLessThanOperator'</span><span class="cm">,</span> | 
|  | 94   81   <span class="q">'<='</span> <span class="cm">=></span> <span class="q">'_VectorLessThanEqualOperator'</span><span class="cm">,</span> | 
|  | 95   82   <span class="q">'>'</span> <span class="cm">=></span> <span class="q">'_VectorGreatarThanOperator'</span><span class="cm">,</span> | 
|  | 96   83   <span class="q">'>='</span> <span class="cm">=></span> <span class="q">'_VectorGreatarThanEqualOperator'</span><span class="cm">,</span> | 
|  | 97   84 | 
|  | 98   85   <span class="q">'neg'</span> <span class="cm">=></span> <span class="q">'_VectorNegativeValueOperator'</span><span class="cm">,</span> | 
|  | 99   86 | 
|  | 100   87   <span class="q">'abs'</span> <span class="cm">=></span> <span class="q">'_VectorAbsoluteValueOperator'</span><span class="cm">,</span> | 
|  | 101   88   <span class="q">'exp'</span> <span class="cm">=></span> <span class="q">'_VectorExpNaturalBaseOperator'</span><span class="cm">,</span> | 
|  | 102   89   <span class="q">'log'</span> <span class="cm">=></span> <span class="q">'_VectorLogNaturalBaseOperator'</span><span class="cm">,</span> | 
|  | 103   90   <span class="q">'sqrt'</span> <span class="cm">=></span> <span class="q">'_VectorSquareRootOperator'</span><span class="cm">,</span> | 
|  | 104   91   <span class="q">'cos'</span> <span class="cm">=></span> <span class="q">'_VectorCosineOperator'</span><span class="cm">,</span> | 
|  | 105   92   <span class="q">'sin'</span> <span class="cm">=></span> <span class="q">'_VectorSineOperator'</span><span class="cm">,</span> | 
|  | 106   93 | 
|  | 107   94   <span class="q">'fallback'</span> <span class="cm">=></span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 108   95 | 
|  | 109   96 <span class="c"># Class constructor...</span> | 
|  | 110 <a name="new-"></a>  97 <span class="k">sub </span><span class="m">new</span> <span class="s">{</span> | 
|  | 111   98   <span class="k">my</span><span class="s">(</span><span class="i">$Class</span><span class="cm">,</span> <span class="i">@Values</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 112   99 | 
|  | 113  100   <span class="c"># Initialize object...</span> | 
|  | 114  101   <span class="k">my</span> <span class="i">$This</span> = <span class="s">{</span><span class="s">}</span><span class="sc">;</span> | 
|  | 115  102   <span class="k">bless</span> <span class="i">$This</span><span class="cm">,</span> <span class="k">ref</span><span class="s">(</span><span class="i">$Class</span><span class="s">)</span> || <span class="i">$Class</span><span class="sc">;</span> | 
|  | 116  103   <span class="i">$This</span><span class="i">->_InitializeVector</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 117  104 | 
|  | 118  105   <span class="i">$This</span><span class="i">->_AddValues</span><span class="s">(</span><span class="i">@Values</span><span class="s">)</span><span class="sc">;</span> | 
|  | 119  106 | 
|  | 120  107   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 121  108 <span class="s">}</span> | 
|  | 122  109 | 
|  | 123  110 <span class="c"># Initialize object data...</span> | 
|  | 124  111 <span class="c">#</span> | 
|  | 125 <a name="_InitializeVector-"></a> 112 <span class="k">sub </span><span class="m">_InitializeVector</span> <span class="s">{</span> | 
|  | 126  113   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 127  114 | 
|  | 128  115   <span class="i">@</span>{<span class="i">$This</span>->{<span class="w">Values</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 129  116 <span class="s">}</span> | 
|  | 130  117 | 
|  | 131  118 <span class="c"># Initialize class ...</span> | 
|  | 132 <a name="_InitializeClass-"></a> 119 <span class="k">sub </span><span class="m">_InitializeClass</span> <span class="s">{</span> | 
|  | 133  120   <span class="c">#Class name...</span> | 
|  | 134  121   <span class="i">$ClassName</span> = <span class="w">__PACKAGE__</span><span class="sc">;</span> | 
|  | 135  122 | 
|  | 136  123   <span class="c"># Print format for vector values...</span> | 
|  | 137  124   <span class="i">$ValueFormat</span> = <span class="q">"%g"</span><span class="sc">;</span> | 
|  | 138  125 <span class="s">}</span> | 
|  | 139  126 | 
|  | 140  127 <span class="c"># Initialize vector values using:</span> | 
|  | 141  128 <span class="c">#    o List of values</span> | 
|  | 142  129 <span class="c">#    o Reference to an list of values</span> | 
|  | 143  130 <span class="c">#    o Another vector object</span> | 
|  | 144  131 <span class="c">#</span> | 
|  | 145 <a name="_AddValues-"></a> 132 <span class="k">sub </span><span class="m">_AddValues</span> <span class="s">{</span> | 
|  | 146  133   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">@Values</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 147  134 | 
|  | 148  135   <span class="k">if</span> <span class="s">(</span>!<span class="i">@Values</span><span class="s">)</span> <span class="s">{</span> | 
|  | 149  136     <span class="k">return</span><span class="sc">;</span> | 
|  | 150  137   <span class="s">}</span> | 
|  | 151  138 | 
|  | 152  139   <span class="c"># Set vector values...</span> | 
|  | 153  140   <span class="k">my</span><span class="s">(</span><span class="i">$FirstValue</span><span class="cm">,</span> <span class="i">$TypeOfFirstValue</span><span class="s">)</span><span class="sc">;</span> | 
|  | 154  141   <span class="i">$FirstValue</span> = <span class="i">$Values</span>[<span class="n">0</span>]<span class="sc">;</span> | 
|  | 155  142   <span class="i">$TypeOfFirstValue</span> = <span class="k">ref</span> <span class="i">$FirstValue</span><span class="sc">;</span> | 
|  | 156  143   <span class="k">if</span> <span class="s">(</span><span class="i">$TypeOfFirstValue</span> =~ <span class="q">/^(SCALAR|HASH|CODE|REF|GLOB)/</span><span class="s">)</span> <span class="s">{</span> | 
|  | 157  144     <span class="w">croak</span> <span class="q">"Error: ${ClassName}->_AddValues: Trying to add values to vector object with a reference to unsupported value format..."</span><span class="sc">;</span> | 
|  | 158  145   <span class="s">}</span> | 
|  | 159  146 | 
|  | 160  147   <span class="k">if</span> <span class="s">(</span><span class="i">_IsVector</span><span class="s">(</span><span class="i">$FirstValue</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 161  148     <span class="c"># Initialize using Vector...</span> | 
|  | 162  149     <span class="k">push</span> <span class="i">@</span>{<span class="i">$This</span>->{<span class="w">Values</span>}}<span class="cm">,</span> <span class="i">@</span>{<span class="i">$FirstValue</span>->{<span class="w">Values</span>}}<span class="sc">;</span> | 
|  | 163  150   <span class="s">}</span> | 
|  | 164  151   <span class="k">elsif</span> <span class="s">(</span><span class="i">$TypeOfFirstValue</span> =~ <span class="q">/^ARRAY/</span><span class="s">)</span> <span class="s">{</span> | 
|  | 165  152     <span class="c"># Initialize using array refernce...</span> | 
|  | 166  153     <span class="k">push</span> <span class="i">@</span>{<span class="i">$This</span>->{<span class="w">Values</span>}}<span class="cm">,</span> <span class="i">@</span>{<span class="i">$FirstValue</span>}<span class="sc">;</span> | 
|  | 167  154   <span class="s">}</span> | 
|  | 168  155   <span class="k">else</span> <span class="s">{</span> | 
|  | 169  156     <span class="c"># It's a list of values...</span> | 
|  | 170  157     <span class="k">push</span> <span class="i">@</span>{<span class="i">$This</span>->{<span class="w">Values</span>}}<span class="cm">,</span> <span class="i">@Values</span><span class="sc">;</span> | 
|  | 171  158   <span class="s">}</span> | 
|  | 172  159 <span class="s">}</span> | 
|  | 173  160 | 
|  | 174  161 <span class="c"># Add values to a vector using a vector, reference to an array or an array...</span> | 
|  | 175 <a name="AddValues-"></a> 162 <span class="k">sub </span><span class="m">AddValues</span> <span class="s">{</span> | 
|  | 176  163   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">@Values</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 177  164 | 
|  | 178  165   <span class="i">$This</span><span class="i">->_AddValues</span><span class="s">(</span><span class="i">@Values</span><span class="s">)</span><span class="sc">;</span> | 
|  | 179  166 | 
|  | 180  167   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 181  168 <span class="s">}</span> | 
|  | 182  169 | 
|  | 183  170 <span class="c"># Copy vector...</span> | 
|  | 184 <a name="Copy-"></a> 171 <span class="k">sub </span><span class="m">Copy</span> <span class="s">{</span> | 
|  | 185  172   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 186  173   <span class="k">my</span><span class="s">(</span><span class="i">$Vector</span><span class="s">)</span><span class="sc">;</span> | 
|  | 187  174 | 
|  | 188  175   <span class="c"># Copy vector values...</span> | 
|  | 189  176   <span class="i">$Vector</span> = <span class="s">(</span><span class="k">ref</span> <span class="i">$This</span><span class="s">)</span><span class="i">->new</span><span class="s">(</span>\<span class="i">@</span>{<span class="i">$This</span>->{<span class="w">Values</span>}}<span class="s">)</span><span class="sc">;</span> | 
|  | 190  177 | 
|  | 191  178   <span class="c"># Copy value format for stringification...</span> | 
|  | 192  179   <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$This</span>->{<span class="w">ValueFormat</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 193  180     <span class="i">$Vector</span>->{<span class="w">ValueFormat</span>} = <span class="i">$This</span>->{<span class="w">ValueFormat</span>}<span class="sc">;</span> | 
|  | 194  181   <span class="s">}</span> | 
|  | 195  182   <span class="k">return</span> <span class="i">$Vector</span><span class="sc">;</span> | 
|  | 196  183 <span class="s">}</span> | 
|  | 197  184 | 
|  | 198  185 <span class="c"># Get 3D vector length...</span> | 
|  | 199 <a name="GetLength-"></a> 186 <span class="k">sub </span><span class="m">GetLength</span> <span class="s">{</span> | 
|  | 200  187   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 201  188 | 
|  | 202  189   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span><span class="i">->GetSize</span><span class="s">(</span><span class="s">)</span> != <span class="n">3</span><span class="s">)</span> <span class="s">{</span> | 
|  | 203  190     <span class="w">croak</span> <span class="q">"Error: ${ClassName}->GetGetLength: Object must be a 3D vector..."</span><span class="sc">;</span> | 
|  | 204  191   <span class="s">}</span> | 
|  | 205  192   <span class="k">my</span><span class="s">(</span><span class="i">$Length</span><span class="cm">,</span> <span class="i">$DotProduct</span><span class="s">)</span><span class="sc">;</span> | 
|  | 206  193   <span class="i">$DotProduct</span> = <span class="i">$This</span> . <span class="i">$This</span><span class="sc">;</span> | 
|  | 207  194   <span class="i">$Length</span> = <span class="k">sqrt</span> <span class="i">$DotProduct</span><span class="sc">;</span> | 
|  | 208  195 | 
|  | 209  196   <span class="k">return</span> <span class="i">$Length</span><span class="sc">;</span> | 
|  | 210  197 <span class="s">}</span> | 
|  | 211  198 | 
|  | 212  199 <span class="c"># Length of a 3D vector by another name...</span> | 
|  | 213 <a name="GetMagnitude-"></a> 200 <span class="k">sub </span><span class="m">GetMagnitude</span> <span class="s">{</span> | 
|  | 214  201   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 215  202   <span class="k">return</span> <span class="i">$This</span><span class="i">->GetLength</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 216  203 <span class="s">}</span> | 
|  | 217  204 | 
|  | 218  205 <span class="c"># Normalize 3D vector...</span> | 
|  | 219 <a name="Normalize-"></a> 206 <span class="k">sub </span><span class="m">Normalize</span> <span class="s">{</span> | 
|  | 220  207   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 221  208 | 
|  | 222  209   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span><span class="i">->GetSize</span><span class="s">(</span><span class="s">)</span> != <span class="n">3</span><span class="s">)</span> <span class="s">{</span> | 
|  | 223  210     <span class="w">croak</span> <span class="q">"Error: ${ClassName}->GetGetLength: Object must be a 3D vector..."</span><span class="sc">;</span> | 
|  | 224  211   <span class="s">}</span> | 
|  | 225  212   <span class="k">my</span><span class="s">(</span><span class="i">$Vector</span><span class="cm">,</span> <span class="i">$Length</span><span class="s">)</span><span class="sc">;</span> | 
|  | 226  213   <span class="i">$Length</span> = <span class="i">$This</span><span class="i">->GetLength</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 227  214   <span class="i">$Vector</span> = <span class="i">$This</span> / <span class="i">$Length</span><span class="sc">;</span> | 
|  | 228  215 | 
|  | 229  216   <span class="k">return</span> <span class="i">$Vector</span><span class="sc">;</span> | 
|  | 230  217 <span class="s">}</span> | 
|  | 231  218 | 
|  | 232  219 <span class="c"># Is it a vector object?</span> | 
|  | 233 <a name="IsVector-"></a> 220 <span class="k">sub </span><span class="m">IsVector ($)</span> <span class="s">{</span> | 
|  | 234  221   <span class="k">my</span><span class="s">(</span><span class="i">$Object</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 235  222 | 
|  | 236  223   <span class="k">return</span> <span class="i">_IsVector</span><span class="s">(</span><span class="i">$Object</span><span class="s">)</span><span class="sc">;</span> | 
|  | 237  224 <span class="s">}</span> | 
|  | 238  225 | 
|  | 239  226 <span class="c"># Get size...</span> | 
|  | 240 <a name="GetSize-"></a> 227 <span class="k">sub </span><span class="m">GetSize</span> <span class="s">{</span> | 
|  | 241  228   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 242  229 | 
|  | 243  230   <span class="k">return</span> <span class="k">scalar</span> <span class="i">@</span>{<span class="i">$This</span>->{<span class="w">Values</span>}}<span class="sc">;</span> | 
|  | 244  231 <span class="s">}</span> | 
|  | 245  232 | 
|  | 246  233 <span class="c"># Get X value of a 3D vector...</span> | 
|  | 247 <a name="GetX-"></a> 234 <span class="k">sub </span><span class="m">GetX</span> <span class="s">{</span> | 
|  | 248  235   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 249  236 | 
|  | 250  237   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span><span class="i">->GetSize</span><span class="s">(</span><span class="s">)</span> != <span class="n">3</span><span class="s">)</span> <span class="s">{</span> | 
|  | 251  238     <span class="w">croak</span> <span class="q">"Error: ${ClassName}->GetX: Object must be a 3D vector..."</span><span class="sc">;</span> | 
|  | 252  239   <span class="s">}</span> | 
|  | 253  240   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetValue</span><span class="s">(</span><span class="n">0</span><span class="s">)</span><span class="sc">;</span> | 
|  | 254  241 <span class="s">}</span> | 
|  | 255  242 | 
|  | 256  243 <span class="c"># Set X value of a 3D vector...</span> | 
|  | 257 <a name="SetX-"></a> 244 <span class="k">sub </span><span class="m">SetX</span> <span class="s">{</span> | 
|  | 258  245   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Value</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 259  246 | 
|  | 260  247   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span><span class="i">->GetSize</span><span class="s">(</span><span class="s">)</span> != <span class="n">3</span><span class="s">)</span> <span class="s">{</span> | 
|  | 261  248     <span class="w">croak</span> <span class="q">"Error: ${ClassName}->SetX: Object must be a 3D vector..."</span><span class="sc">;</span> | 
|  | 262  249   <span class="s">}</span> | 
|  | 263  250   <span class="k">return</span> <span class="i">$This</span><span class="i">->_SetValue</span><span class="s">(</span><span class="n">0</span><span class="cm">,</span> <span class="i">$Value</span><span class="s">)</span><span class="sc">;</span> | 
|  | 264  251 <span class="s">}</span> | 
|  | 265  252 | 
|  | 266  253 <span class="c"># Get Y value of a 3D vector...</span> | 
|  | 267 <a name="GetY-"></a> 254 <span class="k">sub </span><span class="m">GetY</span> <span class="s">{</span> | 
|  | 268  255   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 269  256 | 
|  | 270  257   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span><span class="i">->GetSize</span><span class="s">(</span><span class="s">)</span> != <span class="n">3</span><span class="s">)</span> <span class="s">{</span> | 
|  | 271  258     <span class="w">croak</span> <span class="q">"Error: ${ClassName}->GetY: Object must be a 3D vector..."</span><span class="sc">;</span> | 
|  | 272  259   <span class="s">}</span> | 
|  | 273  260   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetValue</span><span class="s">(</span><span class="n">1</span><span class="s">)</span><span class="sc">;</span> | 
|  | 274  261 <span class="s">}</span> | 
|  | 275  262 | 
|  | 276  263 <span class="c"># Set Y value of a 3D vector...</span> | 
|  | 277 <a name="SetY-"></a> 264 <span class="k">sub </span><span class="m">SetY</span> <span class="s">{</span> | 
|  | 278  265   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Value</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 279  266 | 
|  | 280  267   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span><span class="i">->GetSize</span><span class="s">(</span><span class="s">)</span> != <span class="n">3</span><span class="s">)</span> <span class="s">{</span> | 
|  | 281  268     <span class="w">croak</span> <span class="q">"Error: ${ClassName}->SetY: Object must be a 3D vector..."</span><span class="sc">;</span> | 
|  | 282  269   <span class="s">}</span> | 
|  | 283  270   <span class="k">return</span> <span class="i">$This</span><span class="i">->_SetValue</span><span class="s">(</span><span class="n">1</span><span class="cm">,</span> <span class="i">$Value</span><span class="s">)</span><span class="sc">;</span> | 
|  | 284  271 <span class="s">}</span> | 
|  | 285  272 | 
|  | 286  273 <span class="c"># Get Z value of a 3D vector...</span> | 
|  | 287 <a name="GetZ-"></a> 274 <span class="k">sub </span><span class="m">GetZ</span> <span class="s">{</span> | 
|  | 288  275   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 289  276 | 
|  | 290  277   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span><span class="i">->GetSize</span><span class="s">(</span><span class="s">)</span> != <span class="n">3</span><span class="s">)</span> <span class="s">{</span> | 
|  | 291  278     <span class="w">croak</span> <span class="q">"Error: ${ClassName}->GetZ: Object must be a 3D vector..."</span><span class="sc">;</span> | 
|  | 292  279   <span class="s">}</span> | 
|  | 293  280   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetValue</span><span class="s">(</span><span class="n">2</span><span class="s">)</span><span class="sc">;</span> | 
|  | 294  281 <span class="s">}</span> | 
|  | 295  282 | 
|  | 296  283 <span class="c"># Set Z value of a 3D vector...</span> | 
|  | 297 <a name="SetZ-"></a> 284 <span class="k">sub </span><span class="m">SetZ</span> <span class="s">{</span> | 
|  | 298  285   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Value</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 299  286 | 
|  | 300  287   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span><span class="i">->GetSize</span><span class="s">(</span><span class="s">)</span> != <span class="n">3</span><span class="s">)</span> <span class="s">{</span> | 
|  | 301  288     <span class="w">croak</span> <span class="q">"Error: ${ClassName}->SetZ: Object must be a 3D vector..."</span><span class="sc">;</span> | 
|  | 302  289   <span class="s">}</span> | 
|  | 303  290   <span class="k">return</span> <span class="i">$This</span><span class="i">->_SetValue</span><span class="s">(</span><span class="n">2</span><span class="cm">,</span> <span class="i">$Value</span><span class="s">)</span><span class="sc">;</span> | 
|  | 304  291 <span class="s">}</span> | 
|  | 305  292 | 
|  | 306  293 <span class="c"># Set XYZ value of a 3D vector using:</span> | 
|  | 307  294 <span class="c">#    o List of values</span> | 
|  | 308  295 <span class="c">#    o Reference to an list of values</span> | 
|  | 309  296 <span class="c">#    o Another vector object</span> | 
|  | 310  297 <span class="c">#</span> | 
|  | 311 <a name="SetXYZ-"></a> 298 <span class="k">sub </span><span class="m">SetXYZ</span> <span class="s">{</span> | 
|  | 312  299   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">@Values</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 313  300 | 
|  | 314  301   <span class="k">if</span> <span class="s">(</span>!<span class="i">@Values</span><span class="s">)</span> <span class="s">{</span> | 
|  | 315  302     <span class="w">croak</span> <span class="q">"Error: ${ClassName}->SetXYZ: No values specified..."</span><span class="sc">;</span> | 
|  | 316  303   <span class="s">}</span> | 
|  | 317  304 | 
|  | 318  305   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span><span class="i">->GetSize</span><span class="s">(</span><span class="s">)</span> != <span class="n">3</span><span class="s">)</span> <span class="s">{</span> | 
|  | 319  306     <span class="w">croak</span> <span class="q">"Error: ${ClassName}->SetXYZ: Object must be a 3D vector..."</span><span class="sc">;</span> | 
|  | 320  307   <span class="s">}</span> | 
|  | 321  308 | 
|  | 322  309   <span class="c"># Set vector values...</span> | 
|  | 323  310   <span class="k">my</span><span class="s">(</span><span class="i">$FirstValue</span><span class="cm">,</span> <span class="i">$TypeOfFirstValue</span><span class="s">)</span><span class="sc">;</span> | 
|  | 324  311   <span class="i">$FirstValue</span> = <span class="i">$Values</span>[<span class="n">0</span>]<span class="sc">;</span> | 
|  | 325  312   <span class="i">$TypeOfFirstValue</span> = <span class="k">ref</span> <span class="i">$FirstValue</span><span class="sc">;</span> | 
|  | 326  313   <span class="k">if</span> <span class="s">(</span><span class="i">$TypeOfFirstValue</span> =~ <span class="q">/^(SCALAR|HASH|CODE|REF|GLOB)/</span><span class="s">)</span> <span class="s">{</span> | 
|  | 327  314     <span class="w">croak</span> <span class="q">"Error: ${ClassName}->SetXYZ: A reference to unsupported value format specified..."</span><span class="sc">;</span> | 
|  | 328  315   <span class="s">}</span> | 
|  | 329  316 | 
|  | 330  317   <span class="k">my</span><span class="s">(</span><span class="i">$X</span><span class="cm">,</span> <span class="i">$Y</span><span class="cm">,</span> <span class="i">$Z</span><span class="s">)</span><span class="sc">;</span> | 
|  | 331  318   <span class="k">if</span> <span class="s">(</span><span class="i">_IsVector</span><span class="s">(</span><span class="i">$FirstValue</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 332  319     <span class="c"># SetXYZ using vector...</span> | 
|  | 333  320     <span class="k">if</span> <span class="s">(</span><span class="i">$FirstValue</span><span class="i">->GetSize</span><span class="s">(</span><span class="s">)</span> != <span class="n">3</span><span class="s">)</span> <span class="s">{</span> | 
|  | 334  321       <span class="w">croak</span> <span class="q">"Error: ${ClassName}->SetXYZ: Input object must be a 3D vector..."</span><span class="sc">;</span> | 
|  | 335  322     <span class="s">}</span> | 
|  | 336  323     <span class="s">(</span><span class="i">$X</span><span class="cm">,</span> <span class="i">$Y</span><span class="cm">,</span> <span class="i">$Z</span><span class="s">)</span> = <span class="i">@</span>{<span class="i">$FirstValue</span>->{<span class="w">Values</span>}}<span class="sc">;</span> | 
|  | 337  324   <span class="s">}</span> | 
|  | 338  325   <span class="k">elsif</span> <span class="s">(</span><span class="i">$TypeOfFirstValue</span> =~ <span class="q">/^ARRAY/</span><span class="s">)</span> <span class="s">{</span> | 
|  | 339  326     <span class="c"># SetXYZ using array reference...</span> | 
|  | 340  327     <span class="k">if</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$FirstValue</span>} != <span class="n">3</span><span class="s">)</span> <span class="s">{</span> | 
|  | 341  328       <span class="w">croak</span> <span class="q">"Error: ${ClassName}->SetXYZ: Input array reference must correspond to an array with three values..."</span><span class="sc">;</span> | 
|  | 342  329     <span class="s">}</span> | 
|  | 343  330     <span class="s">(</span><span class="i">$X</span><span class="cm">,</span> <span class="i">$Y</span><span class="cm">,</span> <span class="i">$Z</span><span class="s">)</span> = <span class="i">@</span>{<span class="i">$FirstValue</span>}<span class="sc">;</span> | 
|  | 344  331   <span class="s">}</span> | 
|  | 345  332   <span class="k">else</span> <span class="s">{</span> | 
|  | 346  333     <span class="c"># It's a list of values...</span> | 
|  | 347  334     <span class="k">if</span> <span class="s">(</span><span class="i">@Values</span> != <span class="n">3</span><span class="s">)</span> <span class="s">{</span> | 
|  | 348  335       <span class="w">croak</span> <span class="q">"Error: ${ClassName}->SetXYZ: Input array must contain three values..."</span><span class="sc">;</span> | 
|  | 349  336     <span class="s">}</span> | 
|  | 350  337     <span class="s">(</span><span class="i">$X</span><span class="cm">,</span> <span class="i">$Y</span><span class="cm">,</span> <span class="i">$Z</span><span class="s">)</span> = <span class="i">@Values</span><span class="sc">;</span> | 
|  | 351  338   <span class="s">}</span> | 
|  | 352  339   <span class="i">$This</span>->{<span class="w">Values</span>}[<span class="n">0</span>] = <span class="i">$X</span><span class="sc">;</span> | 
|  | 353  340   <span class="i">$This</span>->{<span class="w">Values</span>}[<span class="n">1</span>] = <span class="i">$Y</span><span class="sc">;</span> | 
|  | 354  341   <span class="i">$This</span>->{<span class="w">Values</span>}[<span class="n">2</span>] = <span class="i">$Z</span><span class="sc">;</span> | 
|  | 355  342 | 
|  | 356  343   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 357  344 <span class="s">}</span> | 
|  | 358  345 | 
|  | 359  346 <span class="c"># Get XYZ as an array or a reference to an array...</span> | 
|  | 360  347 <span class="c">#</span> | 
|  | 361 <a name="GetXYZ-"></a> 348 <span class="k">sub </span><span class="m">GetXYZ</span> <span class="s">{</span> | 
|  | 362  349   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 363  350 | 
|  | 364  351   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span><span class="i">->GetSize</span><span class="s">(</span><span class="s">)</span> != <span class="n">3</span><span class="s">)</span> <span class="s">{</span> | 
|  | 365  352     <span class="w">croak</span> <span class="q">"Error: ${ClassName}->GetXYZ: Object must be a 3D vector..."</span><span class="sc">;</span> | 
|  | 366  353   <span class="s">}</span> | 
|  | 367  354   <span class="k">return</span> <span class="k">wantarray</span> ? <span class="i">@</span>{<span class="i">$This</span>->{<span class="w">Values</span>}} <span class="co">:</span> \<span class="i">@</span>{<span class="i">$This</span>->{<span class="w">Values</span>}}<span class="sc">;</span> | 
|  | 368  355 <span class="s">}</span> | 
|  | 369  356 | 
|  | 370  357 <span class="c"># Get a specific value from vector with indicies starting from 0..</span> | 
|  | 371 <a name="GetValue-"></a> 358 <span class="k">sub </span><span class="m">GetValue</span> <span class="s">{</span> | 
|  | 372  359   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Index</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 373  360 | 
|  | 374  361   <span class="k">if</span> <span class="s">(</span><span class="i">$Index</span> < <span class="n">0</span><span class="s">)</span> <span class="s">{</span> | 
|  | 375  362     <span class="w">croak</span> <span class="q">"Error: ${ClassName}->GetValue: Index value must be a positive number..."</span><span class="sc">;</span> | 
|  | 376  363   <span class="s">}</span> | 
|  | 377  364   <span class="k">if</span> <span class="s">(</span><span class="i">$Index</span> >= <span class="i">$This</span><span class="i">->GetSize</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 378  365     <span class="w">croak</span> <span class="q">"Error: ${ClassName}->GetValue: Index value must be less than size of vector..."</span><span class="sc">;</span> | 
|  | 379  366   <span class="s">}</span> | 
|  | 380  367   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetValue</span><span class="s">(</span><span class="i">$Index</span><span class="s">)</span><span class="sc">;</span> | 
|  | 381  368 <span class="s">}</span> | 
|  | 382  369 | 
|  | 383  370 <span class="c"># Get a vector value...</span> | 
|  | 384 <a name="_GetValue-"></a> 371 <span class="k">sub </span><span class="m">_GetValue</span> <span class="s">{</span> | 
|  | 385  372   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Index</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 386  373 | 
|  | 387  374   <span class="k">return</span> <span class="i">$This</span>->{<span class="w">Values</span>}[<span class="i">$Index</span>]<span class="sc">;</span> | 
|  | 388  375 <span class="s">}</span> | 
|  | 389  376 | 
|  | 390  377 <span class="c"># Set a specific value in vector with indicies starting from 0..</span> | 
|  | 391 <a name="SetValue-"></a> 378 <span class="k">sub </span><span class="m">SetValue</span> <span class="s">{</span> | 
|  | 392  379   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Index</span><span class="cm">,</span> <span class="i">$Value</span><span class="cm">,</span> <span class="i">$SkipCheck</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 393  380 | 
|  | 394  381   <span class="c"># Just set it...</span> | 
|  | 395  382   <span class="k">if</span> <span class="s">(</span><span class="i">$SkipCheck</span><span class="s">)</span> <span class="s">{</span> | 
|  | 396  383     <span class="k">return</span> <span class="i">$This</span><span class="i">->_SetValue</span><span class="s">(</span><span class="i">$Index</span><span class="cm">,</span> <span class="i">$Value</span><span class="s">)</span><span class="sc">;</span> | 
|  | 397  384   <span class="s">}</span> | 
|  | 398  385 | 
|  | 399  386   <span class="c"># Check and set...</span> | 
|  | 400  387   <span class="k">if</span> <span class="s">(</span><span class="i">$Index</span> < <span class="n">0</span><span class="s">)</span> <span class="s">{</span> | 
|  | 401  388     <span class="w">croak</span> <span class="q">"Error: ${ClassName}->SetValue: Index value must be a positive number..."</span><span class="sc">;</span> | 
|  | 402  389   <span class="s">}</span> | 
|  | 403  390   <span class="k">if</span> <span class="s">(</span><span class="i">$Index</span> >= <span class="i">$This</span><span class="i">->GetSize</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 404  391     <span class="w">croak</span> <span class="q">"Error: ${ClassName}->SetValue: Index vaue must be less than size of vector..."</span><span class="sc">;</span> | 
|  | 405  392   <span class="s">}</span> | 
|  | 406  393 | 
|  | 407  394   <span class="k">return</span> <span class="i">$This</span><span class="i">->_SetValue</span><span class="s">(</span><span class="i">$Index</span><span class="cm">,</span> <span class="i">$Value</span><span class="s">)</span><span class="sc">;</span> | 
|  | 408  395 <span class="s">}</span> | 
|  | 409  396 | 
|  | 410  397 <span class="c"># Set a vector value...</span> | 
|  | 411 <a name="_SetValue-"></a> 398 <span class="k">sub </span><span class="m">_SetValue</span> <span class="s">{</span> | 
|  | 412  399   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Index</span><span class="cm">,</span> <span class="i">$Value</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 413  400 | 
|  | 414  401   <span class="i">$This</span>->{<span class="w">Values</span>}[<span class="i">$Index</span>] = <span class="i">$Value</span><span class="sc">;</span> | 
|  | 415  402 | 
|  | 416  403   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 417  404 <span class="s">}</span> | 
|  | 418  405 | 
|  | 419  406 <span class="c"># Return vector values as an array or reference to an array...</span> | 
|  | 420 <a name="GetValues-"></a> 407 <span class="k">sub </span><span class="m">GetValues</span> <span class="s">{</span> | 
|  | 421  408   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 422  409 | 
|  | 423  410   <span class="k">return</span> <span class="k">wantarray</span> ? <span class="i">@</span>{<span class="i">$This</span>->{<span class="w">Values</span>}} <span class="co">:</span> \<span class="i">@</span>{<span class="i">$This</span>->{<span class="w">Values</span>}}<span class="sc">;</span> | 
|  | 424  411 <span class="s">}</span> | 
|  | 425  412 | 
|  | 426  413 <span class="c"># Get number of non-zero values in vector...</span> | 
|  | 427  414 <span class="c">#</span> | 
|  | 428 <a name="GetNumOfNonZeroValues-"></a> 415 <span class="k">sub </span><span class="m">GetNumOfNonZeroValues</span> <span class="s">{</span> | 
|  | 429  416   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 430  417   <span class="k">my</span><span class="s">(</span><span class="i">$Count</span><span class="cm">,</span> <span class="i">$Index</span><span class="cm">,</span> <span class="i">$Size</span><span class="s">)</span><span class="sc">;</span> | 
|  | 431  418 | 
|  | 432  419   <span class="i">$Count</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 433  420   <span class="i">$Size</span> = <span class="i">$This</span><span class="i">->GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 434  421 | 
|  | 435  422   <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$Size</span> -<span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 436  423     <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>->{<span class="w">Values</span>}[<span class="i">$Index</span>] != <span class="n">0</span><span class="s">)</span> <span class="s">{</span> | 
|  | 437  424       <span class="i">$Count</span>++<span class="sc">;</span> | 
|  | 438  425     <span class="s">}</span> | 
|  | 439  426   <span class="s">}</span> | 
|  | 440  427   <span class="k">return</span> <span class="i">$Count</span><span class="sc">;</span> | 
|  | 441  428 <span class="s">}</span> | 
|  | 442  429 | 
|  | 443  430 <span class="c"># Get percent of non-zero values...</span> | 
|  | 444  431 <span class="c">#</span> | 
|  | 445 <a name="GetPercentOfNonZeroValues-"></a> 432 <span class="k">sub </span><span class="m">GetPercentOfNonZeroValues</span> <span class="s">{</span> | 
|  | 446  433   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 447  434 | 
|  | 448  435   <span class="k">return</span> <span class="i">$This</span><span class="i">->GetSize</span><span class="s">(</span><span class="s">)</span> ? <span class="s">(</span><span class="s">(</span><span class="i">$This</span><span class="i">->GetNumOfNonZeroValues</span><span class="s">(</span><span class="s">)</span>/<span class="i">$This</span><span class="i">->GetSize</span><span class="s">(</span><span class="s">)</span><span class="s">)</span>*<span class="n">100</span><span class="s">)</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 449  436 <span class="s">}</span> | 
|  | 450  437 | 
|  | 451  438 <span class="c"># Set value print format for an individual object or the whole class...</span> | 
|  | 452 <a name="SetValuePrintFormat-"></a> 439 <span class="k">sub </span><span class="m">SetValuePrintFormat ($;$)</span> <span class="s">{</span> | 
|  | 453  440   <span class="k">my</span><span class="s">(</span><span class="i">$FirstParameter</span><span class="cm">,</span> <span class="i">$SecondParameter</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 454  441 | 
|  | 455  442   <span class="k">if</span> <span class="s">(</span><span class="s">(</span><span class="i">@_</span> == <span class="n">2</span><span class="s">)</span> && <span class="s">(</span><span class="i">_IsVector</span><span class="s">(</span><span class="i">$FirstParameter</span><span class="s">)</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 456  443     <span class="c"># Set value print format for the specific object...</span> | 
|  | 457  444     <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$ValuePrintFormat</span><span class="s">)</span> = <span class="s">(</span><span class="i">$FirstParameter</span><span class="cm">,</span> <span class="i">$SecondParameter</span><span class="s">)</span><span class="sc">;</span> | 
|  | 458  445 | 
|  | 459  446     <span class="i">$This</span>->{<span class="w">ValueFormat</span>} = <span class="i">$ValuePrintFormat</span><span class="sc">;</span> | 
|  | 460  447   <span class="s">}</span> | 
|  | 461  448   <span class="k">else</span> <span class="s">{</span> | 
|  | 462  449     <span class="c"># Set value print format for the class...</span> | 
|  | 463  450     <span class="k">my</span><span class="s">(</span><span class="i">$ValuePrintFormat</span><span class="s">)</span> = <span class="s">(</span><span class="i">$FirstParameter</span><span class="s">)</span><span class="sc">;</span> | 
|  | 464  451 | 
|  | 465  452     <span class="i">$ValueFormat</span> = <span class="i">$ValuePrintFormat</span><span class="sc">;</span> | 
|  | 466  453   <span class="s">}</span> | 
|  | 467  454 <span class="s">}</span> | 
|  | 468  455 | 
|  | 469  456 <span class="c"># Zero vector of specified size or size 3...</span> | 
|  | 470 <a name="ZeroVector-"></a> 457 <span class="k">sub </span><span class="m">ZeroVector (;$)</span> <span class="s">{</span> | 
|  | 471  458   <span class="k">my</span><span class="s">(</span><span class="i">$Size</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 472  459   <span class="k">my</span><span class="s">(</span><span class="i">$Vector</span><span class="cm">,</span> <span class="i">@Values</span><span class="s">)</span><span class="sc">;</span> | 
|  | 473  460 | 
|  | 474  461   <span class="i">$Size</span> = <span class="s">(</span><span class="k">defined</span> <span class="i">$Size</span><span class="s">)</span> ? <span class="i">$Size</span> <span class="co">:</span> <span class="n">3</span><span class="sc">;</span> | 
|  | 475  462   <span class="i">@Values</span> = <span class="s">(</span><span class="q">'0'</span><span class="s">)</span> x <span class="i">$Size</span><span class="sc">;</span> | 
|  | 476  463 | 
|  | 477  464   <span class="i">$Vector</span> = <span class="i">new</span> <span class="i">Vector</span><span class="s">(</span>\<span class="i">@Values</span><span class="s">)</span><span class="sc">;</span> | 
|  | 478  465   <span class="k">return</span> <span class="i">$Vector</span><span class="sc">;</span> | 
|  | 479  466 <span class="s">}</span> | 
|  | 480  467 | 
|  | 481  468 <span class="c"># Unit vector of specified size or size 3...</span> | 
|  | 482 <a name="UnitVector-"></a> 469 <span class="k">sub </span><span class="m">UnitVector (;$)</span> <span class="s">{</span> | 
|  | 483  470   <span class="k">my</span><span class="s">(</span><span class="i">$Size</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 484  471   <span class="k">my</span><span class="s">(</span><span class="i">$Vector</span><span class="cm">,</span> <span class="i">@Values</span><span class="s">)</span><span class="sc">;</span> | 
|  | 485  472 | 
|  | 486  473   <span class="i">$Size</span> = <span class="s">(</span><span class="k">defined</span> <span class="i">$Size</span><span class="s">)</span> ? <span class="i">$Size</span> <span class="co">:</span> <span class="n">3</span><span class="sc">;</span> | 
|  | 487  474   <span class="i">@Values</span> = <span class="s">(</span><span class="q">'1'</span><span class="s">)</span> x <span class="i">$Size</span><span class="sc">;</span> | 
|  | 488  475 | 
|  | 489  476   <span class="i">$Vector</span> = <span class="i">new</span> <span class="i">Vector</span><span class="s">(</span>\<span class="i">@Values</span><span class="s">)</span><span class="sc">;</span> | 
|  | 490  477   <span class="k">return</span> <span class="i">$Vector</span><span class="sc">;</span> | 
|  | 491  478 <span class="s">}</span> | 
|  | 492  479 | 
|  | 493  480 <span class="c"># Unit X vector of size 3...</span> | 
|  | 494 <a name="UnitXVector-"></a> 481 <span class="k">sub </span><span class="m">UnitXVector ()</span> <span class="s">{</span> | 
|  | 495  482   <span class="k">my</span><span class="s">(</span><span class="i">$Vector</span><span class="s">)</span><span class="sc">;</span> | 
|  | 496  483 | 
|  | 497  484   <span class="i">$Vector</span> = <span class="i">new</span> <span class="i">Vector</span><span class="s">(</span><span class="n">1</span><span class="cm">,</span> <span class="n">0</span><span class="cm">,</span> <span class="n">0</span><span class="s">)</span><span class="sc">;</span> | 
|  | 498  485   <span class="k">return</span> <span class="i">$Vector</span><span class="sc">;</span> | 
|  | 499  486 <span class="s">}</span> | 
|  | 500  487 | 
|  | 501  488 <span class="c"># Unit Y vector of size 3...</span> | 
|  | 502 <a name="UnitYVector-"></a> 489 <span class="k">sub </span><span class="m">UnitYVector ()</span> <span class="s">{</span> | 
|  | 503  490   <span class="k">my</span><span class="s">(</span><span class="i">$Vector</span><span class="s">)</span><span class="sc">;</span> | 
|  | 504  491 | 
|  | 505  492   <span class="i">$Vector</span> = <span class="i">new</span> <span class="i">Vector</span><span class="s">(</span><span class="n">0</span><span class="cm">,</span> <span class="n">1</span><span class="cm">,</span> <span class="n">0</span><span class="s">)</span><span class="sc">;</span> | 
|  | 506  493   <span class="k">return</span> <span class="i">$Vector</span><span class="sc">;</span> | 
|  | 507  494 <span class="s">}</span> | 
|  | 508  495 | 
|  | 509  496 <span class="c"># Unit Z vector of size 3...</span> | 
|  | 510 <a name="UnitZVector-"></a> 497 <span class="k">sub </span><span class="m">UnitZVector ()</span> <span class="s">{</span> | 
|  | 511  498   <span class="k">my</span><span class="s">(</span><span class="i">$Vector</span><span class="s">)</span><span class="sc">;</span> | 
|  | 512  499 | 
|  | 513  500   <span class="i">$Vector</span> = <span class="i">new</span> <span class="i">Vector</span><span class="s">(</span><span class="n">0</span><span class="cm">,</span> <span class="n">0</span><span class="cm">,</span> <span class="n">1</span><span class="s">)</span><span class="sc">;</span> | 
|  | 514  501   <span class="k">return</span> <span class="i">$Vector</span><span class="sc">;</span> | 
|  | 515  502 <span class="s">}</span> | 
|  | 516  503 | 
|  | 517  504 <span class="c">#</span> | 
|  | 518  505 <span class="c"># Vector addition operator supports two addition modes:</span> | 
|  | 519  506 <span class="c">#   . Addition of two vectors by adding corresponding vector values</span> | 
|  | 520  507 <span class="c">#   . Addition of a scalar value to vector values ($Vector + 1)</span> | 
|  | 521  508 <span class="c">#</span> | 
|  | 522  509 <span class="c"># Caveats:</span> | 
|  | 523  510 <span class="c">#   . Addition of a vector to scalar is not allowed (1 + $Vector)</span> | 
|  | 524  511 <span class="c">#</span> | 
|  | 525 <a name="_VectorAdditionOperator-"></a> 512 <span class="k">sub </span><span class="m">_VectorAdditionOperator</span> <span class="s">{</span> | 
|  | 526  513   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsVector</span><span class="cm">,</span> <span class="i">$ErrorMsg</span><span class="s">)</span><span class="sc">;</span> | 
|  | 527  514 | 
|  | 528  515   <span class="i">$ErrorMsg</span> = <span class="q">"_VectorAdditionOperator: Vector addition failed"</span><span class="sc">;</span> | 
|  | 529  516   <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsVector</span><span class="s">)</span> = <span class="i">_ProcessOverloadedOperatorParameters</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">@_</span><span class="s">)</span><span class="sc">;</span> | 
|  | 530  517 | 
|  | 531  518   <span class="c"># Do the addition. Order can be ignored: It's a commumative operation.</span> | 
|  | 532  519   <span class="k">my</span><span class="s">(</span><span class="i">$Vector</span><span class="cm">,</span> <span class="i">$ThisSize</span><span class="cm">,</span> <span class="i">$Index</span><span class="s">)</span><span class="sc">;</span> | 
|  | 533  520   <span class="i">$Vector</span> = <span class="i">$This</span><span class="i">->Copy</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 534  521   <span class="i">$ThisSize</span> = <span class="i">$This</span><span class="i">->GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 535  522 | 
|  | 536  523   <span class="k">if</span> <span class="s">(</span><span class="i">$OtherIsVector</span><span class="s">)</span> <span class="s">{</span> | 
|  | 537  524     <span class="c"># $OrderFlipped is set to false for two vectors...</span> | 
|  | 538  525     <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$ThisSize</span> -<span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 539  526       <span class="i">$Vector</span>->{<span class="w">Values</span>}[<span class="i">$Index</span>] += <span class="i">$Other</span>->{<span class="w">Values</span>}[<span class="i">$Index</span>]<span class="sc">;</span> | 
|  | 540  527     <span class="s">}</span> | 
|  | 541  528   <span class="s">}</span> | 
|  | 542  529   <span class="k">else</span> <span class="s">{</span> | 
|  | 543  530     <span class="k">if</span> <span class="s">(</span><span class="i">$OrderFlipped</span><span class="s">)</span> <span class="s">{</span> | 
|  | 544  531       <span class="w">croak</span> <span class="q">"Error: ${ClassName}->${ErrorMsg}: First object must be a vector..."</span><span class="sc">;</span> | 
|  | 545  532     <span class="s">}</span> | 
|  | 546  533     <span class="c"># Scalar addition...</span> | 
|  | 547  534     <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$ThisSize</span> -<span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 548  535       <span class="i">$Vector</span>->{<span class="w">Values</span>}[<span class="i">$Index</span>] += <span class="i">$Other</span><span class="sc">;</span> | 
|  | 549  536     <span class="s">}</span> | 
|  | 550  537   <span class="s">}</span> | 
|  | 551  538   <span class="k">return</span> <span class="i">$Vector</span><span class="sc">;</span> | 
|  | 552  539 <span class="s">}</span> | 
|  | 553  540 | 
|  | 554  541 <span class="c">#</span> | 
|  | 555  542 <span class="c"># Vector subtraction operator supports two subtraction modes:</span> | 
|  | 556  543 <span class="c">#   . Subtraction of two vectors by subtracting corresponding vector values</span> | 
|  | 557  544 <span class="c">#   . Subtraction of a scalar value from vector values ($Vector - 1)</span> | 
|  | 558  545 <span class="c">#</span> | 
|  | 559  546 <span class="c"># Caveats:</span> | 
|  | 560  547 <span class="c">#   . Subtraction of a vector from scalar is not allowed (1 - $Vector)</span> | 
|  | 561  548 <span class="c">#</span> | 
|  | 562 <a name="_VectorSubtractionOperator-"></a> 549 <span class="k">sub </span><span class="m">_VectorSubtractionOperator</span> <span class="s">{</span> | 
|  | 563  550   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsVector</span><span class="cm">,</span> <span class="i">$ErrorMsg</span><span class="s">)</span><span class="sc">;</span> | 
|  | 564  551 | 
|  | 565  552   <span class="i">$ErrorMsg</span> = <span class="q">"_VectorSubtractionOperator: Vector subtracttion failed"</span><span class="sc">;</span> | 
|  | 566  553   <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsVector</span><span class="s">)</span> = <span class="i">_ProcessOverloadedOperatorParameters</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">@_</span><span class="s">)</span><span class="sc">;</span> | 
|  | 567  554 | 
|  | 568  555   <span class="c"># Do the subtraction...</span> | 
|  | 569  556   <span class="k">my</span><span class="s">(</span><span class="i">$Vector</span><span class="cm">,</span> <span class="i">$ThisSize</span><span class="cm">,</span> <span class="i">$Index</span><span class="s">)</span><span class="sc">;</span> | 
|  | 570  557   <span class="i">$Vector</span> = <span class="i">$This</span><span class="i">->Copy</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 571  558   <span class="i">$ThisSize</span> = <span class="i">$This</span><span class="i">->GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 572  559 | 
|  | 573  560   <span class="k">if</span> <span class="s">(</span><span class="i">$OtherIsVector</span><span class="s">)</span> <span class="s">{</span> | 
|  | 574  561     <span class="c"># $OrderFlipped is set to false for two vectors...</span> | 
|  | 575  562     <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$ThisSize</span> -<span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 576  563       <span class="i">$Vector</span>->{<span class="w">Values</span>}[<span class="i">$Index</span>] -= <span class="i">$Other</span>->{<span class="w">Values</span>}[<span class="i">$Index</span>]<span class="sc">;</span> | 
|  | 577  564     <span class="s">}</span> | 
|  | 578  565   <span class="s">}</span> | 
|  | 579  566   <span class="k">else</span> <span class="s">{</span> | 
|  | 580  567     <span class="c"># Scalar subtraction...</span> | 
|  | 581  568     <span class="k">if</span> <span class="s">(</span><span class="i">$OrderFlipped</span><span class="s">)</span> <span class="s">{</span> | 
|  | 582  569       <span class="w">croak</span> <span class="q">"Error: ${ClassName}->${ErrorMsg}: First object must be a vector..."</span><span class="sc">;</span> | 
|  | 583  570     <span class="s">}</span> | 
|  | 584  571     <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$ThisSize</span> -<span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 585  572       <span class="i">$Vector</span>->{<span class="w">Values</span>}[<span class="i">$Index</span>] -= <span class="i">$Other</span><span class="sc">;</span> | 
|  | 586  573     <span class="s">}</span> | 
|  | 587  574   <span class="s">}</span> | 
|  | 588  575   <span class="k">return</span> <span class="i">$Vector</span><span class="sc">;</span> | 
|  | 589  576 <span class="s">}</span> | 
|  | 590  577 | 
|  | 591  578 <span class="c">#</span> | 
|  | 592  579 <span class="c"># Vector multiplication operator supports two multiplication modes:</span> | 
|  | 593  580 <span class="c">#   . Multiplication of two vectors by multiplying corresponding vector values</span> | 
|  | 594  581 <span class="c">#   . Multiplying vector values by a scalar ($Vector * 1)</span> | 
|  | 595  582 <span class="c">#</span> | 
|  | 596  583 <span class="c"># Caveats:</span> | 
|  | 597  584 <span class="c">#   . Multiplication of a scalar by a vector is not allowed (1 * $Vector)</span> | 
|  | 598  585 <span class="c">#</span> | 
|  | 599 <a name="_VectorMultiplicationOperator-"></a> 586 <span class="k">sub </span><span class="m">_VectorMultiplicationOperator</span> <span class="s">{</span> | 
|  | 600  587   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsVector</span><span class="cm">,</span> <span class="i">$ErrorMsg</span><span class="s">)</span><span class="sc">;</span> | 
|  | 601  588 | 
|  | 602  589   <span class="i">$ErrorMsg</span> = <span class="q">"_VectorMultiplicationOperator: Vector addition failed"</span><span class="sc">;</span> | 
|  | 603  590   <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsVector</span><span class="s">)</span> = <span class="i">_ProcessOverloadedOperatorParameters</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">@_</span><span class="s">)</span><span class="sc">;</span> | 
|  | 604  591 | 
|  | 605  592   <span class="c"># Do the multiplication...</span> | 
|  | 606  593   <span class="k">my</span><span class="s">(</span><span class="i">$Vector</span><span class="cm">,</span> <span class="i">$ThisSize</span><span class="cm">,</span> <span class="i">$Index</span><span class="s">)</span><span class="sc">;</span> | 
|  | 607  594   <span class="i">$Vector</span> = <span class="i">$This</span><span class="i">->Copy</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 608  595   <span class="i">$ThisSize</span> = <span class="i">$This</span><span class="i">->GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 609  596 | 
|  | 610  597   <span class="k">if</span> <span class="s">(</span><span class="i">$OtherIsVector</span><span class="s">)</span> <span class="s">{</span> | 
|  | 611  598     <span class="c"># $OrderFlipped is set to false for two vectors...</span> | 
|  | 612  599     <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$ThisSize</span> -<span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 613  600       <span class="i">$Vector</span>->{<span class="w">Values</span>}[<span class="i">$Index</span>] *= <span class="i">$Other</span>->{<span class="w">Values</span>}[<span class="i">$Index</span>]<span class="sc">;</span> | 
|  | 614  601     <span class="s">}</span> | 
|  | 615  602   <span class="s">}</span> | 
|  | 616  603   <span class="k">else</span> <span class="s">{</span> | 
|  | 617  604     <span class="k">if</span> <span class="s">(</span><span class="i">$OrderFlipped</span><span class="s">)</span> <span class="s">{</span> | 
|  | 618  605       <span class="w">croak</span> <span class="q">"Error: ${ClassName}->${ErrorMsg}: First object must be a vector..."</span><span class="sc">;</span> | 
|  | 619  606     <span class="s">}</span> | 
|  | 620  607     <span class="c"># Scalar multiplication...</span> | 
|  | 621  608     <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$ThisSize</span> -<span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 622  609       <span class="i">$Vector</span>->{<span class="w">Values</span>}[<span class="i">$Index</span>] *= <span class="i">$Other</span><span class="sc">;</span> | 
|  | 623  610     <span class="s">}</span> | 
|  | 624  611   <span class="s">}</span> | 
|  | 625  612   <span class="k">return</span> <span class="i">$Vector</span><span class="sc">;</span> | 
|  | 626  613 <span class="s">}</span> | 
|  | 627  614 | 
|  | 628  615 <span class="c">#</span> | 
|  | 629  616 <span class="c"># Vector division operator supports two division modes:</span> | 
|  | 630  617 <span class="c">#   . Division of two vectors by dividing corresponding vector values</span> | 
|  | 631  618 <span class="c">#   . Dividing vector values by a scalar ($Vector / 2)</span> | 
|  | 632  619 <span class="c">#</span> | 
|  | 633  620 <span class="c"># Caveats:</span> | 
|  | 634  621 <span class="c">#   . Division of a scalar by a vector is not allowed (1 / $Vector)</span> | 
|  | 635  622 <span class="c">#</span> | 
|  | 636 <a name="_VectorDivisionOperator-"></a> 623 <span class="k">sub </span><span class="m">_VectorDivisionOperator</span> <span class="s">{</span> | 
|  | 637  624   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsVector</span><span class="cm">,</span> <span class="i">$ErrorMsg</span><span class="s">)</span><span class="sc">;</span> | 
|  | 638  625 | 
|  | 639  626   <span class="i">$ErrorMsg</span> = <span class="q">"_VectorDivisionOperator: Vector division failed"</span><span class="sc">;</span> | 
|  | 640  627   <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsVector</span><span class="s">)</span> = <span class="i">_ProcessOverloadedOperatorParameters</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">@_</span><span class="s">)</span><span class="sc">;</span> | 
|  | 641  628 | 
|  | 642  629   <span class="c"># Do the division...</span> | 
|  | 643  630   <span class="k">my</span><span class="s">(</span><span class="i">$Vector</span><span class="cm">,</span> <span class="i">$ThisSize</span><span class="cm">,</span> <span class="i">$Index</span><span class="s">)</span><span class="sc">;</span> | 
|  | 644  631   <span class="i">$Vector</span> = <span class="i">$This</span><span class="i">->Copy</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 645  632   <span class="i">$ThisSize</span> = <span class="i">$This</span><span class="i">->GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 646  633 | 
|  | 647  634   <span class="k">if</span> <span class="s">(</span><span class="i">$OtherIsVector</span><span class="s">)</span> <span class="s">{</span> | 
|  | 648  635     <span class="c"># $OrderFlipped is set to false for two vectors...</span> | 
|  | 649  636     <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$ThisSize</span> -<span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 650  637       <span class="i">$Vector</span>->{<span class="w">Values</span>}[<span class="i">$Index</span>] /= <span class="i">$Other</span>->{<span class="w">Values</span>}[<span class="i">$Index</span>]<span class="sc">;</span> | 
|  | 651  638     <span class="s">}</span> | 
|  | 652  639   <span class="s">}</span> | 
|  | 653  640   <span class="k">else</span> <span class="s">{</span> | 
|  | 654  641     <span class="k">if</span> <span class="s">(</span><span class="i">$OrderFlipped</span><span class="s">)</span> <span class="s">{</span> | 
|  | 655  642       <span class="w">croak</span> <span class="q">"Error: ${ClassName}->${ErrorMsg}: First object must be a vector..."</span><span class="sc">;</span> | 
|  | 656  643     <span class="s">}</span> | 
|  | 657  644     <span class="c"># Scalar divison...</span> | 
|  | 658  645     <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$ThisSize</span> -<span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 659  646       <span class="i">$Vector</span>->{<span class="w">Values</span>}[<span class="i">$Index</span>] /=  <span class="i">$Other</span><span class="sc">;</span> | 
|  | 660  647     <span class="s">}</span> | 
|  | 661  648   <span class="s">}</span> | 
|  | 662  649   <span class="k">return</span> <span class="i">$Vector</span><span class="sc">;</span> | 
|  | 663  650 <span class="s">}</span> | 
|  | 664  651 | 
|  | 665  652 <span class="c">#</span> | 
|  | 666  653 <span class="c"># Vector exponentiation operator supports two exponentiation modes:</span> | 
|  | 667  654 <span class="c">#   . Exponentiation of two vectors by exponentiation of  corresponding vector values</span> | 
|  | 668  655 <span class="c">#   . Exponentiation of vector values by a scalar ($Vector ** 2)</span> | 
|  | 669  656 <span class="c">#</span> | 
|  | 670  657 <span class="c"># Caveats:</span> | 
|  | 671  658 <span class="c">#   . Exponent of scalar by a vector is not allowed (2 ** $Vector)</span> | 
|  | 672  659 <span class="c">#</span> | 
|  | 673 <a name="_VectorExponentiationOperator-"></a> 660 <span class="k">sub </span><span class="m">_VectorExponentiationOperator</span> <span class="s">{</span> | 
|  | 674  661   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsVector</span><span class="cm">,</span> <span class="i">$ErrorMsg</span><span class="s">)</span><span class="sc">;</span> | 
|  | 675  662 | 
|  | 676  663   <span class="i">$ErrorMsg</span> = <span class="q">"_VectorExponentiationOperator: Vector exponentiation failed"</span><span class="sc">;</span> | 
|  | 677  664   <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsVector</span><span class="s">)</span> = <span class="i">_ProcessOverloadedOperatorParameters</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">@_</span><span class="s">)</span><span class="sc">;</span> | 
|  | 678  665 | 
|  | 679  666   <span class="c"># Do the exponentiation...</span> | 
|  | 680  667   <span class="k">my</span><span class="s">(</span><span class="i">$Vector</span><span class="cm">,</span> <span class="i">$ThisSize</span><span class="cm">,</span> <span class="i">$Index</span><span class="s">)</span><span class="sc">;</span> | 
|  | 681  668   <span class="i">$Vector</span> = <span class="i">$This</span><span class="i">->Copy</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 682  669   <span class="i">$ThisSize</span> = <span class="i">$This</span><span class="i">->GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 683  670 | 
|  | 684  671   <span class="k">if</span> <span class="s">(</span><span class="i">$OtherIsVector</span><span class="s">)</span> <span class="s">{</span> | 
|  | 685  672     <span class="c"># $OrderFlipped is set to false for two vectors...</span> | 
|  | 686  673     <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$ThisSize</span> -<span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 687  674       <span class="i">$Vector</span>->{<span class="w">Values</span>}[<span class="i">$Index</span>] **= <span class="i">$Other</span>->{<span class="w">Values</span>}[<span class="i">$Index</span>]<span class="sc">;</span> | 
|  | 688  675     <span class="s">}</span> | 
|  | 689  676   <span class="s">}</span> | 
|  | 690  677   <span class="k">else</span> <span class="s">{</span> | 
|  | 691  678     <span class="k">if</span> <span class="s">(</span><span class="i">$OrderFlipped</span><span class="s">)</span> <span class="s">{</span> | 
|  | 692  679       <span class="w">croak</span> <span class="q">"Error: ${ClassName}->${ErrorMsg}: First object must be a vector..."</span><span class="sc">;</span> | 
|  | 693  680     <span class="s">}</span> | 
|  | 694  681     <span class="c"># Scalar exponentiation...</span> | 
|  | 695  682     <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$ThisSize</span> -<span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 696  683       <span class="i">$Vector</span>->{<span class="w">Values</span>}[<span class="i">$Index</span>] **=  <span class="i">$Other</span><span class="sc">;</span> | 
|  | 697  684     <span class="s">}</span> | 
|  | 698  685   <span class="s">}</span> | 
|  | 699  686   <span class="k">return</span> <span class="i">$Vector</span><span class="sc">;</span> | 
|  | 700  687 <span class="s">}</span> | 
|  | 701  688 | 
|  | 702  689 <span class="c">#</span> | 
|  | 703  690 <span class="c"># Vector modulus operator supports two modulus modes:</span> | 
|  | 704  691 <span class="c">#   . Modulus of two vectors by taking modulus between corresponding vector values</span> | 
|  | 705  692 <span class="c">#   . Modulus of vector values by a scalar ($Vector % 2)</span> | 
|  | 706  693 <span class="c">#</span> | 
|  | 707  694 <span class="c"># Caveats:</span> | 
|  | 708  695 <span class="c">#   . Modulus of scalar by a vector is not allowed (2 % $Vector)</span> | 
|  | 709  696 <span class="c">#</span> | 
|  | 710 <a name="_VectorModulusOperator-"></a> 697 <span class="k">sub </span><span class="m">_VectorModulusOperator</span> <span class="s">{</span> | 
|  | 711  698   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsVector</span><span class="cm">,</span> <span class="i">$ErrorMsg</span><span class="s">)</span><span class="sc">;</span> | 
|  | 712  699 | 
|  | 713  700   <span class="i">$ErrorMsg</span> = <span class="q">"_VectorModulusOperator: Vector exponentiation failed"</span><span class="sc">;</span> | 
|  | 714  701   <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsVector</span><span class="s">)</span> = <span class="i">_ProcessOverloadedOperatorParameters</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">@_</span><span class="s">)</span><span class="sc">;</span> | 
|  | 715  702 | 
|  | 716  703   <span class="c"># Take the modulus...</span> | 
|  | 717  704   <span class="k">my</span><span class="s">(</span><span class="i">$Vector</span><span class="cm">,</span> <span class="i">$ThisSize</span><span class="cm">,</span> <span class="i">$Index</span><span class="s">)</span><span class="sc">;</span> | 
|  | 718  705   <span class="i">$Vector</span> = <span class="i">$This</span><span class="i">->Copy</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 719  706   <span class="i">$ThisSize</span> = <span class="i">$This</span><span class="i">->GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 720  707 | 
|  | 721  708   <span class="k">if</span> <span class="s">(</span><span class="i">$OtherIsVector</span><span class="s">)</span> <span class="s">{</span> | 
|  | 722  709     <span class="c"># $OrderFlipped is set to false for two vectors...</span> | 
|  | 723  710     <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$ThisSize</span> -<span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 724  711       <span class="i">$Vector</span>->{<span class="w">Values</span>}[<span class="i">$Index</span>] %= <span class="i">$Other</span>->{<span class="w">Values</span>}[<span class="i">$Index</span>]<span class="sc">;</span> | 
|  | 725  712     <span class="s">}</span> | 
|  | 726  713   <span class="s">}</span> | 
|  | 727  714   <span class="k">else</span> <span class="s">{</span> | 
|  | 728  715     <span class="k">if</span> <span class="s">(</span><span class="i">$OrderFlipped</span><span class="s">)</span> <span class="s">{</span> | 
|  | 729  716       <span class="w">croak</span> <span class="q">"Error: ${ClassName}->${ErrorMsg}: First object must be a vector..."</span><span class="sc">;</span> | 
|  | 730  717     <span class="s">}</span> | 
|  | 731  718     <span class="c"># Scalar modulus...</span> | 
|  | 732  719     <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$ThisSize</span> -<span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 733  720       <span class="i">$Vector</span>->{<span class="w">Values</span>}[<span class="i">$Index</span>] %=  <span class="i">$Other</span><span class="sc">;</span> | 
|  | 734  721     <span class="s">}</span> | 
|  | 735  722   <span class="s">}</span> | 
|  | 736  723   <span class="k">return</span> <span class="i">$Vector</span><span class="sc">;</span> | 
|  | 737  724 <span class="s">}</span> | 
|  | 738  725 | 
|  | 739  726 <span class="c">#</span> | 
|  | 740  727 <span class="c"># Vector dot product operator supports two modes:</span> | 
|  | 741  728 <span class="c">#   . Dot product of two 3D vectors</span> | 
|  | 742  729 <span class="c">#   . Concatenation of a vector and a scalar</span> | 
|  | 743  730 <span class="c">#</span> | 
|  | 744 <a name="_VectorDotProductOperator-"></a> 731 <span class="k">sub </span><span class="m">_VectorDotProductOperator</span> <span class="s">{</span> | 
|  | 745  732   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsVector</span><span class="cm">,</span> <span class="i">$ErrorMsg</span><span class="s">)</span><span class="sc">;</span> | 
|  | 746  733 | 
|  | 747  734   <span class="i">$ErrorMsg</span> = <span class="q">"_VectorDotProductOperator: Vector dot product failed"</span><span class="sc">;</span> | 
|  | 748  735   <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsVector</span><span class="s">)</span> = <span class="i">_ProcessOverloadedOperatorParameters</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">@_</span><span class="s">)</span><span class="sc">;</span> | 
|  | 749  736 | 
|  | 750  737   <span class="k">if</span> <span class="s">(</span><span class="i">$OtherIsVector</span><span class="s">)</span> <span class="s">{</span> | 
|  | 751  738     <span class="c"># Calculate dot product of two 3D vectors...</span> | 
|  | 752  739     <span class="k">my</span><span class="s">(</span><span class="i">$DotProduct</span><span class="s">)</span><span class="sc">;</span> | 
|  | 753  740     <span class="k">if</span> <span class="s">(</span><span class="i">$This</span><span class="i">->GetSize</span><span class="s">(</span><span class="s">)</span> != <span class="n">3</span><span class="s">)</span> <span class="s">{</span> | 
|  | 754  741       <span class="w">croak</span> <span class="q">"Error: ${ClassName}->${ErrorMsg}: Both vectors must be 3D vectors..."</span><span class="sc">;</span> | 
|  | 755  742     <span class="s">}</span> | 
|  | 756  743     <span class="i">$DotProduct</span> = <span class="i">$This</span><span class="i">->GetX</span><span class="s">(</span><span class="s">)</span> * <span class="i">$Other</span><span class="i">->GetX</span> + <span class="i">$This</span><span class="i">->GetY</span><span class="s">(</span><span class="s">)</span> * <span class="i">$Other</span><span class="i">->GetY</span><span class="s">(</span><span class="s">)</span> + <span class="i">$This</span><span class="i">->GetZ</span> * <span class="i">$Other</span><span class="i">->GetZ</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 757  744     <span class="k">return</span> <span class="i">$DotProduct</span><span class="sc">;</span> | 
|  | 758  745   <span class="s">}</span> | 
|  | 759  746   <span class="k">else</span> <span class="s">{</span> | 
|  | 760  747     <span class="c"># Do a string concatenation and return the string...</span> | 
|  | 761  748     <span class="k">if</span> <span class="s">(</span><span class="i">$OrderFlipped</span><span class="s">)</span> <span class="s">{</span> | 
|  | 762  749       <span class="k">return</span> <span class="i">$Other</span> . <span class="i">$This</span><span class="i">->StringifyVector</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 763  750     <span class="s">}</span> | 
|  | 764  751     <span class="k">else</span> <span class="s">{</span> | 
|  | 765  752       <span class="k">return</span> <span class="i">$This</span><span class="i">->StringifyVector</span><span class="s">(</span><span class="s">)</span> . <span class="i">$Other</span><span class="sc">;</span> | 
|  | 766  753     <span class="s">}</span> | 
|  | 767  754   <span class="s">}</span> | 
|  | 768  755 <span class="s">}</span> | 
|  | 769  756 | 
|  | 770  757 <span class="c">#</span> | 
|  | 771  758 <span class="c"># Vector cross product operator genrates a new vector which is the cross</span> | 
|  | 772  759 <span class="c"># product of two 3D vectors.</span> | 
|  | 773  760 <span class="c">#</span> | 
|  | 774  761 <span class="c"># For two vectors, V1 (X1, Y1, Z1) and V2 (X2, Y2, Z2), cross product</span> | 
|  | 775  762 <span class="c"># V1 x V2 corresponds: (Y1.Z2 - Z1.Y2), (Z1.X2 - X1.Z2), (X1.Y2 - Y1.X2)</span> | 
|  | 776  763 <span class="c">#</span> | 
|  | 777 <a name="_VectorCrossProductOperator-"></a> 764 <span class="k">sub </span><span class="m">_VectorCrossProductOperator</span> <span class="s">{</span> | 
|  | 778  765   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsVector</span><span class="cm">,</span> <span class="i">$ErrorMsg</span><span class="s">)</span><span class="sc">;</span> | 
|  | 779  766 | 
|  | 780  767   <span class="i">$ErrorMsg</span> = <span class="q">"_VectorCrossProductOperator: Vector cross product failed"</span><span class="sc">;</span> | 
|  | 781  768   <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsVector</span><span class="s">)</span> = <span class="i">_ProcessOverloadedOperatorParameters</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">@_</span><span class="s">)</span><span class="sc">;</span> | 
|  | 782  769 | 
|  | 783  770   <span class="k">if</span> <span class="s">(</span>!<span class="i">$OtherIsVector</span><span class="s">)</span> <span class="s">{</span> | 
|  | 784  771     <span class="w">croak</span> <span class="q">"Error: ${ClassName}->${ErrorMsg}: Both object must be vectors..."</span><span class="sc">;</span> | 
|  | 785  772   <span class="s">}</span> | 
|  | 786  773 | 
|  | 787  774   <span class="c"># Calculate cross product of two 3D vectors...</span> | 
|  | 788  775   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span><span class="i">->GetSize</span><span class="s">(</span><span class="s">)</span> != <span class="n">3</span><span class="s">)</span> <span class="s">{</span> | 
|  | 789  776     <span class="w">croak</span> <span class="q">"Error: ${ClassName}->${ErrorMsg}: Both vectors must be 3D vectors..."</span><span class="sc">;</span> | 
|  | 790  777   <span class="s">}</span> | 
|  | 791  778   <span class="k">my</span><span class="s">(</span><span class="i">$Vector</span><span class="cm">,</span> <span class="i">$X</span><span class="cm">,</span> <span class="i">$Y</span><span class="cm">,</span> <span class="i">$Z</span><span class="s">)</span><span class="sc">;</span> | 
|  | 792  779   <span class="i">$X</span> = <span class="i">$This</span><span class="i">->GetY</span><span class="s">(</span><span class="s">)</span> * <span class="i">$Other</span><span class="i">->GetZ</span><span class="s">(</span><span class="s">)</span> - <span class="i">$This</span><span class="i">->GetZ</span><span class="s">(</span><span class="s">)</span> * <span class="i">$Other</span><span class="i">->GetY</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 793  780   <span class="i">$Y</span> = <span class="i">$This</span><span class="i">->GetZ</span><span class="s">(</span><span class="s">)</span> * <span class="i">$Other</span><span class="i">->GetX</span><span class="s">(</span><span class="s">)</span> - <span class="i">$This</span><span class="i">->GetX</span><span class="s">(</span><span class="s">)</span> * <span class="i">$Other</span><span class="i">->GetZ</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 794  781   <span class="i">$Z</span> = <span class="i">$This</span><span class="i">->GetX</span><span class="s">(</span><span class="s">)</span> * <span class="i">$Other</span><span class="i">->GetY</span><span class="s">(</span><span class="s">)</span> - <span class="i">$This</span><span class="i">->GetY</span><span class="s">(</span><span class="s">)</span> * <span class="i">$Other</span><span class="i">->GetX</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 795  782 | 
|  | 796  783   <span class="i">$Vector</span> = <span class="s">(</span><span class="k">ref</span> <span class="i">$This</span><span class="s">)</span><span class="i">->new</span><span class="s">(</span><span class="i">$X</span><span class="cm">,</span> <span class="i">$Y</span><span class="cm">,</span> <span class="i">$Z</span><span class="s">)</span><span class="sc">;</span> | 
|  | 797  784 | 
|  | 798  785   <span class="k">return</span> <span class="i">$Vector</span><span class="sc">;</span> | 
|  | 799  786 <span class="s">}</span> | 
|  | 800  787 | 
|  | 801  788 <span class="c">#</span> | 
|  | 802  789 <span class="c"># Vector booelan operator checks whether a vector contains at least one non-zero</span> | 
|  | 803  790 <span class="c"># value...</span> | 
|  | 804  791 <span class="c">#</span> | 
|  | 805 <a name="_VectorBooleanOperator-"></a> 792 <span class="k">sub </span><span class="m">_VectorBooleanOperator</span> <span class="s">{</span> | 
|  | 806  793   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsVector</span><span class="cm">,</span> <span class="i">$ErrorMsg</span><span class="s">)</span><span class="sc">;</span> | 
|  | 807  794 | 
|  | 808  795   <span class="i">$ErrorMsg</span> = <span class="q">"_VectorBooleanOperator: Vector boolean operation failed"</span><span class="sc">;</span> | 
|  | 809  796   <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsVector</span><span class="s">)</span> = <span class="i">_ProcessOverloadedOperatorParameters</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">@_</span><span class="s">)</span><span class="sc">;</span> | 
|  | 810  797 | 
|  | 811  798   <span class="k">my</span><span class="s">(</span><span class="i">$Size</span><span class="cm">,</span> <span class="i">$Index</span><span class="s">)</span><span class="sc">;</span> | 
|  | 812  799   <span class="i">$Size</span> = <span class="i">$This</span><span class="i">->GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 813  800 | 
|  | 814  801   <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$Size</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 815  802     <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>->{<span class="w">Values</span>}[<span class="i">$Index</span>] != <span class="n">0</span><span class="s">)</span> <span class="s">{</span> | 
|  | 816  803       <span class="k">return</span> <span class="n">1</span><span class="sc">;</span> | 
|  | 817  804     <span class="s">}</span> | 
|  | 818  805   <span class="s">}</span> | 
|  | 819  806   <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 820  807 <span class="s">}</span> | 
|  | 821  808 | 
|  | 822  809 <span class="c">#</span> | 
|  | 823  810 <span class="c"># Vector not booelan operator checks whether all values of a vector are zero.</span> | 
|  | 824  811 <span class="c">#</span> | 
|  | 825 <a name="_VectorNotBooleanOperator-"></a> 812 <span class="k">sub </span><span class="m">_VectorNotBooleanOperator</span> <span class="s">{</span> | 
|  | 826  813   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsVector</span><span class="cm">,</span> <span class="i">$ErrorMsg</span><span class="s">)</span><span class="sc">;</span> | 
|  | 827  814 | 
|  | 828  815   <span class="i">$ErrorMsg</span> = <span class="q">"_VectorNotBooleanOperator: Vector not boolean operation failed"</span><span class="sc">;</span> | 
|  | 829  816   <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsVector</span><span class="s">)</span> = <span class="i">_ProcessOverloadedOperatorParameters</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">@_</span><span class="s">)</span><span class="sc">;</span> | 
|  | 830  817 | 
|  | 831  818   <span class="k">my</span><span class="s">(</span><span class="i">$Size</span><span class="cm">,</span> <span class="i">$Index</span><span class="s">)</span><span class="sc">;</span> | 
|  | 832  819   <span class="i">$Size</span> = <span class="i">$This</span><span class="i">->GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 833  820 | 
|  | 834  821   <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$Size</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 835  822     <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>->{<span class="w">Values</span>}[<span class="i">$Index</span>] != <span class="n">0</span><span class="s">)</span> <span class="s">{</span> | 
|  | 836  823       <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 837  824     <span class="s">}</span> | 
|  | 838  825   <span class="s">}</span> | 
|  | 839  826   <span class="k">return</span> <span class="n">1</span><span class="sc">;</span> | 
|  | 840  827 <span class="s">}</span> | 
|  | 841  828 | 
|  | 842  829 <span class="c">#</span> | 
|  | 843  830 <span class="c"># Vector equal operator supports two modes:</span> | 
|  | 844  831 <span class="c">#   . Comparion of corresponding values in two vectors</span> | 
|  | 845  832 <span class="c">#   . Comparing vectors values to a scalar ($Vector == 2)</span> | 
|  | 846  833 <span class="c">#</span> | 
|  | 847  834 <span class="c"># Caveats:</span> | 
|  | 848  835 <span class="c">#   . Comparison of a scalar to vector values is not allowed (2 == $Vector)</span> | 
|  | 849  836 <span class="c">#</span> | 
|  | 850 <a name="_VectorEqualOperator-"></a> 837 <span class="k">sub </span><span class="m">_VectorEqualOperator</span> <span class="s">{</span> | 
|  | 851  838   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsVector</span><span class="cm">,</span> <span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">$CheckVectorSizes</span><span class="s">)</span><span class="sc">;</span> | 
|  | 852  839 | 
|  | 853  840   <span class="i">$ErrorMsg</span> = <span class="q">"_VectorEqualOperator: Vector equal comparison failed"</span><span class="sc">;</span> | 
|  | 854  841   <span class="i">$CheckVectorSizes</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 855  842   <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsVector</span><span class="s">)</span> = <span class="i">_ProcessOverloadedOperatorParameters</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">@_</span><span class="cm">,</span> <span class="i">$CheckVectorSizes</span><span class="s">)</span><span class="sc">;</span> | 
|  | 856  843 | 
|  | 857  844   <span class="c"># Do the comparison...</span> | 
|  | 858  845   <span class="k">my</span><span class="s">(</span><span class="i">$ThisSize</span><span class="cm">,</span> <span class="i">$Index</span><span class="s">)</span><span class="sc">;</span> | 
|  | 859  846   <span class="i">$ThisSize</span> = <span class="i">$This</span><span class="i">->GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 860  847 | 
|  | 861  848   <span class="k">if</span> <span class="s">(</span><span class="i">$OtherIsVector</span><span class="s">)</span> <span class="s">{</span> | 
|  | 862  849     <span class="c"># $OrderFlipped is set to false for two vectors...</span> | 
|  | 863  850     <span class="k">my</span><span class="s">(</span><span class="i">$OtherSize</span><span class="s">)</span> = <span class="i">$Other</span><span class="i">->GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 864  851     <span class="k">if</span> <span class="s">(</span><span class="i">$ThisSize</span> != <span class="i">$OtherSize</span><span class="s">)</span> <span class="s">{</span> | 
|  | 865  852       <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 866  853     <span class="s">}</span> | 
|  | 867  854     <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$ThisSize</span> -<span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 868  855       <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>->{<span class="w">Values</span>}[<span class="i">$Index</span>] != <span class="i">$Other</span>->{<span class="w">Values</span>}[<span class="i">$Index</span>]<span class="s">)</span> <span class="s">{</span> | 
|  | 869  856         <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 870  857       <span class="s">}</span> | 
|  | 871  858     <span class="s">}</span> | 
|  | 872  859   <span class="s">}</span> | 
|  | 873  860   <span class="k">else</span> <span class="s">{</span> | 
|  | 874  861     <span class="k">if</span> <span class="s">(</span><span class="i">$OrderFlipped</span><span class="s">)</span> <span class="s">{</span> | 
|  | 875  862       <span class="w">croak</span> <span class="q">"Error: ${ClassName}->${ErrorMsg}: First object must be a vector..."</span><span class="sc">;</span> | 
|  | 876  863     <span class="s">}</span> | 
|  | 877  864     <span class="c"># Scalar comparison...</span> | 
|  | 878  865     <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$ThisSize</span> -<span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 879  866       <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>->{<span class="w">Values</span>}[<span class="i">$Index</span>] != <span class="i">$Other</span><span class="s">)</span> <span class="s">{</span> | 
|  | 880  867         <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 881  868       <span class="s">}</span> | 
|  | 882  869     <span class="s">}</span> | 
|  | 883  870   <span class="s">}</span> | 
|  | 884  871   <span class="k">return</span> <span class="n">1</span><span class="sc">;</span> | 
|  | 885  872 <span class="s">}</span> | 
|  | 886  873 | 
|  | 887  874 <span class="c">#</span> | 
|  | 888  875 <span class="c"># Vector not equal operator supports two modes:</span> | 
|  | 889  876 <span class="c">#   . Comparion of corresponding values in two vectors</span> | 
|  | 890  877 <span class="c">#   . Comparing vectors values to a scalar ($Vector != 2)</span> | 
|  | 891  878 <span class="c">#</span> | 
|  | 892  879 <span class="c"># Caveats:</span> | 
|  | 893  880 <span class="c">#   . Comparison of a scalar to vector values is not allowed (2 != $Vector2)</span> | 
|  | 894  881 <span class="c">#</span> | 
|  | 895 <a name="_VectorNotEqualOperator-"></a> 882 <span class="k">sub </span><span class="m">_VectorNotEqualOperator</span> <span class="s">{</span> | 
|  | 896  883   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsVector</span><span class="cm">,</span> <span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">$CheckVectorSizes</span><span class="s">)</span><span class="sc">;</span> | 
|  | 897  884 | 
|  | 898  885   <span class="i">$ErrorMsg</span> = <span class="q">"_VectorNotEqualOperator: Vector not equal comparison failed"</span><span class="sc">;</span> | 
|  | 899  886   <span class="i">$CheckVectorSizes</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 900  887   <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsVector</span><span class="s">)</span> = <span class="i">_ProcessOverloadedOperatorParameters</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">@_</span><span class="cm">,</span> <span class="i">$CheckVectorSizes</span><span class="s">)</span><span class="sc">;</span> | 
|  | 901  888 | 
|  | 902  889   <span class="c"># Do the comparison...</span> | 
|  | 903  890   <span class="k">my</span><span class="s">(</span><span class="i">$ThisSize</span><span class="cm">,</span> <span class="i">$Index</span><span class="s">)</span><span class="sc">;</span> | 
|  | 904  891   <span class="i">$ThisSize</span> = <span class="i">$This</span><span class="i">->GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 905  892 | 
|  | 906  893   <span class="k">if</span> <span class="s">(</span><span class="i">$OtherIsVector</span><span class="s">)</span> <span class="s">{</span> | 
|  | 907  894     <span class="c"># $OrderFlipped is set to false for two vectors...</span> | 
|  | 908  895     <span class="k">my</span><span class="s">(</span><span class="i">$OtherSize</span><span class="s">)</span> = <span class="i">$Other</span><span class="i">->GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 909  896     <span class="k">if</span> <span class="s">(</span><span class="i">$ThisSize</span> != <span class="i">$OtherSize</span><span class="s">)</span> <span class="s">{</span> | 
|  | 910  897       <span class="k">return</span> <span class="n">1</span><span class="sc">;</span> | 
|  | 911  898     <span class="s">}</span> | 
|  | 912  899     <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$ThisSize</span> -<span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 913  900       <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>->{<span class="w">Values</span>}[<span class="i">$Index</span>] == <span class="i">$Other</span>->{<span class="w">Values</span>}[<span class="i">$Index</span>]<span class="s">)</span> <span class="s">{</span> | 
|  | 914  901         <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 915  902       <span class="s">}</span> | 
|  | 916  903     <span class="s">}</span> | 
|  | 917  904   <span class="s">}</span> | 
|  | 918  905   <span class="k">else</span> <span class="s">{</span> | 
|  | 919  906     <span class="k">if</span> <span class="s">(</span><span class="i">$OrderFlipped</span><span class="s">)</span> <span class="s">{</span> | 
|  | 920  907       <span class="w">croak</span> <span class="q">"Error: ${ClassName}->${ErrorMsg}: First object must be a vector..."</span><span class="sc">;</span> | 
|  | 921  908     <span class="s">}</span> | 
|  | 922  909     <span class="c"># Scalar comparison...</span> | 
|  | 923  910     <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$ThisSize</span> -<span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 924  911       <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>->{<span class="w">Values</span>}[<span class="i">$Index</span>] == <span class="i">$Other</span><span class="s">)</span> <span class="s">{</span> | 
|  | 925  912         <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 926  913       <span class="s">}</span> | 
|  | 927  914     <span class="s">}</span> | 
|  | 928  915   <span class="s">}</span> | 
|  | 929  916   <span class="k">return</span> <span class="n">1</span><span class="sc">;</span> | 
|  | 930  917 <span class="s">}</span> | 
|  | 931  918 | 
|  | 932  919 <span class="c">#</span> | 
|  | 933  920 <span class="c"># Vector less than operator supports two modes:</span> | 
|  | 934  921 <span class="c">#   . Comparion of corresponding values in two vectors</span> | 
|  | 935  922 <span class="c">#   . Comparing vectors values to a scalar ($Vector < 2)</span> | 
|  | 936  923 <span class="c">#</span> | 
|  | 937  924 <span class="c"># Caveats:</span> | 
|  | 938  925 <span class="c">#   . Comparison of a scalar to vector values is not allowed (2 < $Vector2)</span> | 
|  | 939  926 <span class="c">#</span> | 
|  | 940 <a name="_VectorLessThanOperator-"></a> 927 <span class="k">sub </span><span class="m">_VectorLessThanOperator</span> <span class="s">{</span> | 
|  | 941  928   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsVector</span><span class="cm">,</span> <span class="i">$ErrorMsg</span><span class="s">)</span><span class="sc">;</span> | 
|  | 942  929 | 
|  | 943  930   <span class="i">$ErrorMsg</span> = <span class="q">"_VectorLessThanOperator: Vector less than comparison failed"</span><span class="sc">;</span> | 
|  | 944  931   <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsVector</span><span class="s">)</span> = <span class="i">_ProcessOverloadedOperatorParameters</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">@_</span><span class="s">)</span><span class="sc">;</span> | 
|  | 945  932 | 
|  | 946  933   <span class="c"># Do the comparison...</span> | 
|  | 947  934   <span class="k">my</span><span class="s">(</span><span class="i">$ThisSize</span><span class="cm">,</span> <span class="i">$Index</span><span class="s">)</span><span class="sc">;</span> | 
|  | 948  935   <span class="i">$ThisSize</span> = <span class="i">$This</span><span class="i">->GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 949  936 | 
|  | 950  937   <span class="k">if</span> <span class="s">(</span><span class="i">$OtherIsVector</span><span class="s">)</span> <span class="s">{</span> | 
|  | 951  938     <span class="c"># $OrderFlipped is set to false for two vectors...</span> | 
|  | 952  939     <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$ThisSize</span> -<span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 953  940       <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>->{<span class="w">Values</span>}[<span class="i">$Index</span>] >= <span class="i">$Other</span>->{<span class="w">Values</span>}[<span class="i">$Index</span>]<span class="s">)</span> <span class="s">{</span> | 
|  | 954  941         <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 955  942       <span class="s">}</span> | 
|  | 956  943     <span class="s">}</span> | 
|  | 957  944   <span class="s">}</span> | 
|  | 958  945   <span class="k">else</span> <span class="s">{</span> | 
|  | 959  946     <span class="k">if</span> <span class="s">(</span><span class="i">$OrderFlipped</span><span class="s">)</span> <span class="s">{</span> | 
|  | 960  947       <span class="w">croak</span> <span class="q">"Error: ${ClassName}->${ErrorMsg}: First object must be a vector..."</span><span class="sc">;</span> | 
|  | 961  948     <span class="s">}</span> | 
|  | 962  949     <span class="c"># Scalar comparison...</span> | 
|  | 963  950     <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$ThisSize</span> -<span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 964  951       <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>->{<span class="w">Values</span>}[<span class="i">$Index</span>] >= <span class="i">$Other</span><span class="s">)</span> <span class="s">{</span> | 
|  | 965  952         <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 966  953       <span class="s">}</span> | 
|  | 967  954     <span class="s">}</span> | 
|  | 968  955   <span class="s">}</span> | 
|  | 969  956   <span class="k">return</span> <span class="n">1</span><span class="sc">;</span> | 
|  | 970  957 <span class="s">}</span> | 
|  | 971  958 | 
|  | 972  959 <span class="c">#</span> | 
|  | 973  960 <span class="c"># Vector less than equla operator supports two modes:</span> | 
|  | 974  961 <span class="c">#   . Comparion of corresponding values in two vectors</span> | 
|  | 975  962 <span class="c">#   . Comparing vectors values to a scalar ($Vector <= 2)</span> | 
|  | 976  963 <span class="c">#</span> | 
|  | 977  964 <span class="c"># Caveats:</span> | 
|  | 978  965 <span class="c">#   . Comparison of a scalar to vector values is not allowed (2 <= $Vector2)</span> | 
|  | 979  966 <span class="c">#</span> | 
|  | 980 <a name="_VectorLessThanEqualOperator-"></a> 967 <span class="k">sub </span><span class="m">_VectorLessThanEqualOperator</span> <span class="s">{</span> | 
|  | 981  968   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsVector</span><span class="cm">,</span> <span class="i">$ErrorMsg</span><span class="s">)</span><span class="sc">;</span> | 
|  | 982  969 | 
|  | 983  970   <span class="i">$ErrorMsg</span> = <span class="q">"_VectorLessThanEqualOperator: Vector less than equal comparison failed"</span><span class="sc">;</span> | 
|  | 984  971   <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsVector</span><span class="s">)</span> = <span class="i">_ProcessOverloadedOperatorParameters</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">@_</span><span class="s">)</span><span class="sc">;</span> | 
|  | 985  972 | 
|  | 986  973   <span class="c"># Do the comparison...</span> | 
|  | 987  974   <span class="k">my</span><span class="s">(</span><span class="i">$ThisSize</span><span class="cm">,</span> <span class="i">$Index</span><span class="s">)</span><span class="sc">;</span> | 
|  | 988  975   <span class="i">$ThisSize</span> = <span class="i">$This</span><span class="i">->GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 989  976 | 
|  | 990  977   <span class="k">if</span> <span class="s">(</span><span class="i">$OtherIsVector</span><span class="s">)</span> <span class="s">{</span> | 
|  | 991  978     <span class="c"># $OrderFlipped is set to false for two vectors...</span> | 
|  | 992  979     <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$ThisSize</span> -<span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 993  980       <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>->{<span class="w">Values</span>}[<span class="i">$Index</span>] > <span class="i">$Other</span>->{<span class="w">Values</span>}[<span class="i">$Index</span>]<span class="s">)</span> <span class="s">{</span> | 
|  | 994  981         <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 995  982       <span class="s">}</span> | 
|  | 996  983     <span class="s">}</span> | 
|  | 997  984   <span class="s">}</span> | 
|  | 998  985   <span class="k">else</span> <span class="s">{</span> | 
|  | 999  986     <span class="k">if</span> <span class="s">(</span><span class="i">$OrderFlipped</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1000  987       <span class="w">croak</span> <span class="q">"Error: ${ClassName}->${ErrorMsg}: First object must be a vector..."</span><span class="sc">;</span> | 
|  | 1001  988     <span class="s">}</span> | 
|  | 1002  989     <span class="c"># Scalar comparison...</span> | 
|  | 1003  990     <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$ThisSize</span> -<span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1004  991       <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>->{<span class="w">Values</span>}[<span class="i">$Index</span>] > <span class="i">$Other</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1005  992         <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 1006  993       <span class="s">}</span> | 
|  | 1007  994     <span class="s">}</span> | 
|  | 1008  995   <span class="s">}</span> | 
|  | 1009  996   <span class="k">return</span> <span class="n">1</span><span class="sc">;</span> | 
|  | 1010  997 <span class="s">}</span> | 
|  | 1011  998 | 
|  | 1012  999 <span class="c">#</span> | 
|  | 1013 1000 <span class="c"># Vector greatar than operator supports two modes:</span> | 
|  | 1014 1001 <span class="c">#   . Comparion of corresponding values in two vectors</span> | 
|  | 1015 1002 <span class="c">#   . Comparing vectors values to a scalar ($Vector > 2)</span> | 
|  | 1016 1003 <span class="c">#</span> | 
|  | 1017 1004 <span class="c"># Caveats:</span> | 
|  | 1018 1005 <span class="c">#   . Comparison of a scalar to vector values is not allowed (2 > $Vector2)</span> | 
|  | 1019 1006 <span class="c">#</span> | 
|  | 1020 <a name="_VectorGreatarThanOperator-"></a>1007 <span class="k">sub </span><span class="m">_VectorGreatarThanOperator</span> <span class="s">{</span> | 
|  | 1021 1008   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsVector</span><span class="cm">,</span> <span class="i">$ErrorMsg</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1022 1009 | 
|  | 1023 1010   <span class="i">$ErrorMsg</span> = <span class="q">"_VectorGreatarThanOperator: Vector greatar than comparison failed"</span><span class="sc">;</span> | 
|  | 1024 1011   <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsVector</span><span class="s">)</span> = <span class="i">_ProcessOverloadedOperatorParameters</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">@_</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1025 1012 | 
|  | 1026 1013   <span class="c"># Do the comparison...</span> | 
|  | 1027 1014   <span class="k">my</span><span class="s">(</span><span class="i">$ThisSize</span><span class="cm">,</span> <span class="i">$Index</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1028 1015   <span class="i">$ThisSize</span> = <span class="i">$This</span><span class="i">->GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1029 1016 | 
|  | 1030 1017   <span class="k">if</span> <span class="s">(</span><span class="i">$OtherIsVector</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1031 1018     <span class="c"># $OrderFlipped is set to false for two vectors...</span> | 
|  | 1032 1019     <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$ThisSize</span> -<span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1033 1020       <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>->{<span class="w">Values</span>}[<span class="i">$Index</span>] <= <span class="i">$Other</span>->{<span class="w">Values</span>}[<span class="i">$Index</span>]<span class="s">)</span> <span class="s">{</span> | 
|  | 1034 1021         <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 1035 1022       <span class="s">}</span> | 
|  | 1036 1023     <span class="s">}</span> | 
|  | 1037 1024   <span class="s">}</span> | 
|  | 1038 1025   <span class="k">else</span> <span class="s">{</span> | 
|  | 1039 1026     <span class="k">if</span> <span class="s">(</span><span class="i">$OrderFlipped</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1040 1027       <span class="w">croak</span> <span class="q">"Error: ${ClassName}->${ErrorMsg}: First object must be a vector..."</span><span class="sc">;</span> | 
|  | 1041 1028     <span class="s">}</span> | 
|  | 1042 1029     <span class="c"># Scalar comparison...</span> | 
|  | 1043 1030     <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$ThisSize</span> -<span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1044 1031       <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>->{<span class="w">Values</span>}[<span class="i">$Index</span>] <= <span class="i">$Other</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1045 1032         <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 1046 1033       <span class="s">}</span> | 
|  | 1047 1034     <span class="s">}</span> | 
|  | 1048 1035   <span class="s">}</span> | 
|  | 1049 1036   <span class="k">return</span> <span class="n">1</span><span class="sc">;</span> | 
|  | 1050 1037 <span class="s">}</span> | 
|  | 1051 1038 | 
|  | 1052 1039 <span class="c">#</span> | 
|  | 1053 1040 <span class="c"># Vector greatar than equal operator supports two modes:</span> | 
|  | 1054 1041 <span class="c">#   . Comparion of corresponding values in two vectors</span> | 
|  | 1055 1042 <span class="c">#   . Comparing vectors values to a scalar ($Vector >= 2)</span> | 
|  | 1056 1043 <span class="c">#</span> | 
|  | 1057 1044 <span class="c"># Caveats:</span> | 
|  | 1058 1045 <span class="c">#   . Comparison of a scalar to vector values is not allowed (2 <= $Vector2)</span> | 
|  | 1059 1046 <span class="c">#</span> | 
|  | 1060 <a name="_VectorGreatarThanEqualOperator-"></a>1047 <span class="k">sub </span><span class="m">_VectorGreatarThanEqualOperator</span> <span class="s">{</span> | 
|  | 1061 1048   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsVector</span><span class="cm">,</span> <span class="i">$ErrorMsg</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1062 1049 | 
|  | 1063 1050   <span class="i">$ErrorMsg</span> = <span class="q">"_VectorGreatarThanEqualOperator: Vector greatar than equal comparison failed"</span><span class="sc">;</span> | 
|  | 1064 1051   <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsVector</span><span class="s">)</span> = <span class="i">_ProcessOverloadedOperatorParameters</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">@_</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1065 1052 | 
|  | 1066 1053   <span class="c"># Do the comparison...</span> | 
|  | 1067 1054   <span class="k">my</span><span class="s">(</span><span class="i">$ThisSize</span><span class="cm">,</span> <span class="i">$Index</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1068 1055   <span class="i">$ThisSize</span> = <span class="i">$This</span><span class="i">->GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1069 1056 | 
|  | 1070 1057   <span class="k">if</span> <span class="s">(</span><span class="i">$OtherIsVector</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1071 1058     <span class="c"># $OrderFlipped is set to false for two vectors...</span> | 
|  | 1072 1059     <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$ThisSize</span> -<span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1073 1060       <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>->{<span class="w">Values</span>}[<span class="i">$Index</span>] < <span class="i">$Other</span>->{<span class="w">Values</span>}[<span class="i">$Index</span>]<span class="s">)</span> <span class="s">{</span> | 
|  | 1074 1061         <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 1075 1062       <span class="s">}</span> | 
|  | 1076 1063     <span class="s">}</span> | 
|  | 1077 1064   <span class="s">}</span> | 
|  | 1078 1065   <span class="k">else</span> <span class="s">{</span> | 
|  | 1079 1066     <span class="k">if</span> <span class="s">(</span><span class="i">$OrderFlipped</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1080 1067       <span class="w">croak</span> <span class="q">"Error: ${ClassName}->${ErrorMsg}: First object must be a vector..."</span><span class="sc">;</span> | 
|  | 1081 1068     <span class="s">}</span> | 
|  | 1082 1069     <span class="c"># Scalar comparison...</span> | 
|  | 1083 1070     <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$ThisSize</span> -<span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1084 1071       <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>->{<span class="w">Values</span>}[<span class="i">$Index</span>] < <span class="i">$Other</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1085 1072         <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 1086 1073       <span class="s">}</span> | 
|  | 1087 1074     <span class="s">}</span> | 
|  | 1088 1075   <span class="s">}</span> | 
|  | 1089 1076   <span class="k">return</span> <span class="n">1</span><span class="sc">;</span> | 
|  | 1090 1077 <span class="s">}</span> | 
|  | 1091 1078 | 
|  | 1092 1079 <span class="c">#</span> | 
|  | 1093 1080 <span class="c"># Vector negative value operator returns a vector with values corresponding to</span> | 
|  | 1094 1081 <span class="c"># negative values of a vector</span> | 
|  | 1095 1082 <span class="c">#</span> | 
|  | 1096 <a name="_VectorNegativeValueOperator-"></a>1083 <span class="k">sub </span><span class="m">_VectorNegativeValueOperator</span> <span class="s">{</span> | 
|  | 1097 1084   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsVector</span><span class="cm">,</span> <span class="i">$ErrorMsg</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1098 1085 | 
|  | 1099 1086   <span class="i">$ErrorMsg</span> = <span class="q">"_VectorNegativeValueOperator: Vector negative value operation failed"</span><span class="sc">;</span> | 
|  | 1100 1087   <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsVector</span><span class="s">)</span> = <span class="i">_ProcessOverloadedOperatorParameters</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">@_</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1101 1088 | 
|  | 1102 1089   <span class="c"># Take the negative value...</span> | 
|  | 1103 1090   <span class="k">my</span><span class="s">(</span><span class="i">$Vector</span><span class="cm">,</span> <span class="i">$ThisSize</span><span class="cm">,</span> <span class="i">$Index</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1104 1091   <span class="i">$Vector</span> = <span class="i">$This</span><span class="i">->Copy</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1105 1092   <span class="i">$ThisSize</span> = <span class="i">$This</span><span class="i">->GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1106 1093 | 
|  | 1107 1094   <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$ThisSize</span> -<span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1108 1095     <span class="i">$Vector</span>->{<span class="w">Values</span>}[<span class="i">$Index</span>] = - <span class="i">$This</span>->{<span class="w">Values</span>}[<span class="i">$Index</span>]<span class="sc">;</span> | 
|  | 1109 1096   <span class="s">}</span> | 
|  | 1110 1097   <span class="k">return</span> <span class="i">$Vector</span><span class="sc">;</span> | 
|  | 1111 1098 <span class="s">}</span> | 
|  | 1112 1099 | 
|  | 1113 1100 <span class="c">#</span> | 
|  | 1114 1101 <span class="c"># Vector absolute value operator returns a vector with values corresponding to</span> | 
|  | 1115 1102 <span class="c"># absolute values of a vector</span> | 
|  | 1116 1103 <span class="c">#</span> | 
|  | 1117 <a name="_VectorAbsoluteValueOperator-"></a>1104 <span class="k">sub </span><span class="m">_VectorAbsoluteValueOperator</span> <span class="s">{</span> | 
|  | 1118 1105   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsVector</span><span class="cm">,</span> <span class="i">$ErrorMsg</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1119 1106 | 
|  | 1120 1107   <span class="i">$ErrorMsg</span> = <span class="q">"_VectorAbsoluteValueOperator: Vector absolute value operation failed"</span><span class="sc">;</span> | 
|  | 1121 1108   <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsVector</span><span class="s">)</span> = <span class="i">_ProcessOverloadedOperatorParameters</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">@_</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1122 1109 | 
|  | 1123 1110   <span class="c"># Take the absolute value...</span> | 
|  | 1124 1111   <span class="k">my</span><span class="s">(</span><span class="i">$Vector</span><span class="cm">,</span> <span class="i">$ThisSize</span><span class="cm">,</span> <span class="i">$Index</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1125 1112   <span class="i">$Vector</span> = <span class="i">$This</span><span class="i">->Copy</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1126 1113   <span class="i">$ThisSize</span> = <span class="i">$This</span><span class="i">->GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1127 1114 | 
|  | 1128 1115   <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$ThisSize</span> -<span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1129 1116     <span class="i">$Vector</span>->{<span class="w">Values</span>}[<span class="i">$Index</span>] = <span class="k">abs</span> <span class="i">$This</span>->{<span class="w">Values</span>}[<span class="i">$Index</span>]<span class="sc">;</span> | 
|  | 1130 1117   <span class="s">}</span> | 
|  | 1131 1118   <span class="k">return</span> <span class="i">$Vector</span><span class="sc">;</span> | 
|  | 1132 1119 <span class="s">}</span> | 
|  | 1133 1120 | 
|  | 1134 1121 <span class="c">#</span> | 
|  | 1135 1122 <span class="c"># Vector exp natural base operator returns a vector with values corresponding to</span> | 
|  | 1136 1123 <span class="c"># e raised to the power of values in a vector</span> | 
|  | 1137 1124 <span class="c">#</span> | 
|  | 1138 <a name="_VectorExpNaturalBaseOperator-"></a>1125 <span class="k">sub </span><span class="m">_VectorExpNaturalBaseOperator</span> <span class="s">{</span> | 
|  | 1139 1126   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsVector</span><span class="cm">,</span> <span class="i">$ErrorMsg</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1140 1127 | 
|  | 1141 1128   <span class="i">$ErrorMsg</span> = <span class="q">"_VectorExpNaturalBaseOperator: Vector exp operation failed"</span><span class="sc">;</span> | 
|  | 1142 1129   <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsVector</span><span class="s">)</span> = <span class="i">_ProcessOverloadedOperatorParameters</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">@_</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1143 1130 | 
|  | 1144 1131   <span class="c"># Take the absolute value...</span> | 
|  | 1145 1132   <span class="k">my</span><span class="s">(</span><span class="i">$Vector</span><span class="cm">,</span> <span class="i">$ThisSize</span><span class="cm">,</span> <span class="i">$Index</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1146 1133   <span class="i">$Vector</span> = <span class="i">$This</span><span class="i">->Copy</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1147 1134   <span class="i">$ThisSize</span> = <span class="i">$This</span><span class="i">->GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1148 1135 | 
|  | 1149 1136   <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$ThisSize</span> -<span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1150 1137     <span class="i">$Vector</span>->{<span class="w">Values</span>}[<span class="i">$Index</span>] = <span class="k">exp</span> <span class="i">$This</span>->{<span class="w">Values</span>}[<span class="i">$Index</span>]<span class="sc">;</span> | 
|  | 1151 1138   <span class="s">}</span> | 
|  | 1152 1139   <span class="k">return</span> <span class="i">$Vector</span><span class="sc">;</span> | 
|  | 1153 1140 <span class="s">}</span> | 
|  | 1154 1141 | 
|  | 1155 1142 <span class="c">#</span> | 
|  | 1156 1143 <span class="c"># Vector log natural base operator returns a vector with values corresponding to</span> | 
|  | 1157 1144 <span class="c"># log of values in a vector</span> | 
|  | 1158 1145 <span class="c">#</span> | 
|  | 1159 <a name="_VectorLogNaturalBaseOperator-"></a>1146 <span class="k">sub </span><span class="m">_VectorLogNaturalBaseOperator</span> <span class="s">{</span> | 
|  | 1160 1147   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsVector</span><span class="cm">,</span> <span class="i">$ErrorMsg</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1161 1148 | 
|  | 1162 1149   <span class="i">$ErrorMsg</span> = <span class="q">"_VectorLogNaturalBaseOperator: Vector log operation failed"</span><span class="sc">;</span> | 
|  | 1163 1150   <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsVector</span><span class="s">)</span> = <span class="i">_ProcessOverloadedOperatorParameters</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">@_</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1164 1151 | 
|  | 1165 1152   <span class="c"># Take the absolute value...</span> | 
|  | 1166 1153   <span class="k">my</span><span class="s">(</span><span class="i">$Vector</span><span class="cm">,</span> <span class="i">$ThisSize</span><span class="cm">,</span> <span class="i">$Index</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1167 1154   <span class="i">$Vector</span> = <span class="i">$This</span><span class="i">->Copy</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1168 1155   <span class="i">$ThisSize</span> = <span class="i">$This</span><span class="i">->GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1169 1156 | 
|  | 1170 1157   <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$ThisSize</span> -<span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1171 1158     <span class="i">$Vector</span>->{<span class="w">Values</span>}[<span class="i">$Index</span>] = <span class="k">log</span> <span class="i">$This</span>->{<span class="w">Values</span>}[<span class="i">$Index</span>]<span class="sc">;</span> | 
|  | 1172 1159   <span class="s">}</span> | 
|  | 1173 1160   <span class="k">return</span> <span class="i">$Vector</span><span class="sc">;</span> | 
|  | 1174 1161 <span class="s">}</span> | 
|  | 1175 1162 | 
|  | 1176 1163 <span class="c">#</span> | 
|  | 1177 1164 <span class="c"># Vector cosine operator returns a vector with values corresponding to cosine of values</span> | 
|  | 1178 1165 <span class="c"># in a vector. Input vector values are assumed to be in radians.</span> | 
|  | 1179 1166 <span class="c">#</span> | 
|  | 1180 <a name="_VectorCosineOperator-"></a>1167 <span class="k">sub </span><span class="m">_VectorCosineOperator</span> <span class="s">{</span> | 
|  | 1181 1168   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsVector</span><span class="cm">,</span> <span class="i">$ErrorMsg</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1182 1169 | 
|  | 1183 1170   <span class="i">$ErrorMsg</span> = <span class="q">"_VectorCosineOperator: Vector cos operation failed"</span><span class="sc">;</span> | 
|  | 1184 1171   <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsVector</span><span class="s">)</span> = <span class="i">_ProcessOverloadedOperatorParameters</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">@_</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1185 1172 | 
|  | 1186 1173   <span class="c"># Take the absolute value...</span> | 
|  | 1187 1174   <span class="k">my</span><span class="s">(</span><span class="i">$Vector</span><span class="cm">,</span> <span class="i">$ThisSize</span><span class="cm">,</span> <span class="i">$Index</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1188 1175   <span class="i">$Vector</span> = <span class="i">$This</span><span class="i">->Copy</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1189 1176   <span class="i">$ThisSize</span> = <span class="i">$This</span><span class="i">->GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1190 1177 | 
|  | 1191 1178   <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$ThisSize</span> -<span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1192 1179     <span class="i">$Vector</span>->{<span class="w">Values</span>}[<span class="i">$Index</span>] = <span class="k">cos</span> <span class="i">$This</span>->{<span class="w">Values</span>}[<span class="i">$Index</span>]<span class="sc">;</span> | 
|  | 1193 1180   <span class="s">}</span> | 
|  | 1194 1181   <span class="k">return</span> <span class="i">$Vector</span><span class="sc">;</span> | 
|  | 1195 1182 <span class="s">}</span> | 
|  | 1196 1183 | 
|  | 1197 1184 <span class="c">#</span> | 
|  | 1198 1185 <span class="c"># Vector sine operator returns a vector with values corresponding to sine of values</span> | 
|  | 1199 1186 <span class="c"># in a vector. Input vector values are assumed to be in radians.</span> | 
|  | 1200 1187 <span class="c">#</span> | 
|  | 1201 <a name="_VectorSineOperator-"></a>1188 <span class="k">sub </span><span class="m">_VectorSineOperator</span> <span class="s">{</span> | 
|  | 1202 1189   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsVector</span><span class="cm">,</span> <span class="i">$ErrorMsg</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1203 1190 | 
|  | 1204 1191   <span class="i">$ErrorMsg</span> = <span class="q">"_VectorSineOperator: Vector sin operation failed"</span><span class="sc">;</span> | 
|  | 1205 1192   <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsVector</span><span class="s">)</span> = <span class="i">_ProcessOverloadedOperatorParameters</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">@_</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1206 1193 | 
|  | 1207 1194   <span class="c"># Take the absolute value...</span> | 
|  | 1208 1195   <span class="k">my</span><span class="s">(</span><span class="i">$Vector</span><span class="cm">,</span> <span class="i">$ThisSize</span><span class="cm">,</span> <span class="i">$Index</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1209 1196   <span class="i">$Vector</span> = <span class="i">$This</span><span class="i">->Copy</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1210 1197   <span class="i">$ThisSize</span> = <span class="i">$This</span><span class="i">->GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1211 1198 | 
|  | 1212 1199   <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$ThisSize</span> -<span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1213 1200     <span class="i">$Vector</span>->{<span class="w">Values</span>}[<span class="i">$Index</span>] = <span class="k">sin</span> <span class="i">$This</span>->{<span class="w">Values</span>}[<span class="i">$Index</span>]<span class="sc">;</span> | 
|  | 1214 1201   <span class="s">}</span> | 
|  | 1215 1202   <span class="k">return</span> <span class="i">$Vector</span><span class="sc">;</span> | 
|  | 1216 1203 <span class="s">}</span> | 
|  | 1217 1204 | 
|  | 1218 1205 <span class="c">#</span> | 
|  | 1219 1206 <span class="c"># Vector square root  returns a vector with values corresponding to sqrt of values</span> | 
|  | 1220 1207 <span class="c"># in a vector.</span> | 
|  | 1221 1208 <span class="c">#</span> | 
|  | 1222 <a name="_VectorSquareRootOperator-"></a>1209 <span class="k">sub </span><span class="m">_VectorSquareRootOperator</span> <span class="s">{</span> | 
|  | 1223 1210   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsVector</span><span class="cm">,</span> <span class="i">$ErrorMsg</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1224 1211 | 
|  | 1225 1212   <span class="i">$ErrorMsg</span> = <span class="q">"_VectorSquareRootOperator: Vector sqrt operation failed"</span><span class="sc">;</span> | 
|  | 1226 1213   <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsVector</span><span class="s">)</span> = <span class="i">_ProcessOverloadedOperatorParameters</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">@_</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1227 1214 | 
|  | 1228 1215   <span class="c"># Take the absolute value...</span> | 
|  | 1229 1216   <span class="k">my</span><span class="s">(</span><span class="i">$Vector</span><span class="cm">,</span> <span class="i">$ThisSize</span><span class="cm">,</span> <span class="i">$Index</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1230 1217   <span class="i">$Vector</span> = <span class="i">$This</span><span class="i">->Copy</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1231 1218   <span class="i">$ThisSize</span> = <span class="i">$This</span><span class="i">->GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1232 1219 | 
|  | 1233 1220   <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$ThisSize</span> -<span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1234 1221     <span class="i">$Vector</span>->{<span class="w">Values</span>}[<span class="i">$Index</span>] = <span class="k">sqrt</span> <span class="i">$This</span>->{<span class="w">Values</span>}[<span class="i">$Index</span>]<span class="sc">;</span> | 
|  | 1235 1222   <span class="s">}</span> | 
|  | 1236 1223   <span class="k">return</span> <span class="i">$Vector</span><span class="sc">;</span> | 
|  | 1237 1224 <span class="s">}</span> | 
|  | 1238 1225 | 
|  | 1239 1226 <span class="c"># Turn vector into array for @{$Vector} operation...</span> | 
|  | 1240 <a name="_VectorToArrayOperator-"></a>1227 <span class="k">sub </span><span class="m">_VectorToArrayOperator</span> <span class="s">{</span> | 
|  | 1241 1228   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 1242 1229 | 
|  | 1243 1230   <span class="k">return</span> \<span class="i">@</span>{<span class="i">$This</span>->{<span class="w">Values</span>}}<span class="sc">;</span> | 
|  | 1244 1231 <span class="s">}</span> | 
|  | 1245 1232 | 
|  | 1246 1233 <span class="c"># Turn vector into number for $#Vector operation: It's the size of vector...</span> | 
|  | 1247 <a name="_NumifyVector-"></a>1234 <span class="k">sub </span><span class="m">_NumifyVector</span> <span class="s">{</span> | 
|  | 1248 1235   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 1249 1236 | 
|  | 1250 1237   <span class="k">return</span> <span class="i">$This</span><span class="i">->GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1251 1238 <span class="s">}</span> | 
|  | 1252 1239 | 
|  | 1253 1240 <span class="c"># Process parameters passed to overloaded operators...</span> | 
|  | 1254 1241 <span class="c">#</span> | 
|  | 1255 1242 <span class="c"># For uninary operators, $SecondParameter is not defined.</span> | 
|  | 1256 <a name="_ProcessOverloadedOperatorParameters-"></a>1243 <span class="k">sub </span><span class="m">_ProcessOverloadedOperatorParameters</span> <span class="s">{</span> | 
|  | 1257 1244   <span class="k">my</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">$FirstParameter</span><span class="cm">,</span> <span class="i">$SecondParameter</span><span class="cm">,</span> <span class="i">$ParametersOrderStatus</span><span class="cm">,</span> <span class="i">$CheckVectorSizesStatus</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 1258 1245   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsVector</span><span class="cm">,</span> <span class="i">$CheckVectorSizes</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1259 1246 | 
|  | 1260 1247   <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="s">)</span> =  <span class="s">(</span><span class="i">$FirstParameter</span><span class="cm">,</span> <span class="i">$SecondParameter</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1261 1248   <span class="i">$OrderFlipped</span> = <span class="s">(</span><span class="k">defined</span><span class="s">(</span><span class="i">$ParametersOrderStatus</span><span class="s">)</span> && <span class="i">$ParametersOrderStatus</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 1262 1249   <span class="i">$CheckVectorSizes</span> = <span class="s">(</span><span class="k">defined</span> <span class="i">$CheckVectorSizesStatus</span><span class="s">)</span> ? <span class="i">$CheckVectorSizesStatus</span> <span class="co">:</span> <span class="n">1</span><span class="sc">;</span> | 
|  | 1263 1250 | 
|  | 1264 1251   <span class="i">_ValidateVector</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">$This</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1265 1252 | 
|  | 1266 1253   <span class="i">$OtherIsVector</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 1267 1254   <span class="k">if</span> <span class="s">(</span><span class="k">defined</span><span class="s">(</span><span class="i">$Other</span><span class="s">)</span> && <span class="s">(</span><span class="k">ref</span> <span class="i">$Other</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1268 1255     <span class="c"># Make sure $Other is a vector...</span> | 
|  | 1269 1256     <span class="i">_ValidateVector</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">$Other</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1270 1257     <span class="k">if</span> <span class="s">(</span><span class="i">$CheckVectorSizes</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1271 1258       <span class="i">_ValidateVectorSizesAreEqual</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1272 1259     <span class="s">}</span> | 
|  | 1273 1260     <span class="i">$OtherIsVector</span> = <span class="n">1</span><span class="sc">;</span> | 
|  | 1274 1261   <span class="s">}</span> | 
|  | 1275 1262   <span class="k">return</span> <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsVector</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1276 1263 <span class="s">}</span> | 
|  | 1277 1264 | 
|  | 1278 1265 <span class="c"># Is it a vector object?</span> | 
|  | 1279 <a name="_IsVector-"></a>1266 <span class="k">sub </span><span class="m">_IsVector</span> <span class="s">{</span> | 
|  | 1280 1267   <span class="k">my</span><span class="s">(</span><span class="i">$Object</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 1281 1268 | 
|  | 1282 1269   <span class="k">return</span> <span class="s">(</span><span class="i">Scalar::Util::blessed</span><span class="s">(</span><span class="i">$Object</span><span class="s">)</span> && <span class="i">$Object</span><span class="i">->isa</span><span class="s">(</span><span class="i">$ClassName</span><span class="s">)</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 1283 1270 <span class="s">}</span> | 
|  | 1284 1271 | 
|  | 1285 1272 <span class="c"># Make sure it's a vector reference...</span> | 
|  | 1286 <a name="_ValidateVector-"></a>1273 <span class="k">sub </span><span class="m">_ValidateVector</span> <span class="s">{</span> | 
|  | 1287 1274   <span class="k">my</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">$Vector</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 1288 1275 | 
|  | 1289 1276   <span class="k">if</span> <span class="s">(</span>!<span class="i">_IsVector</span><span class="s">(</span><span class="i">$Vector</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1290 1277     <span class="w">croak</span> <span class="q">"Error: ${ClassName}->${ErrorMsg}: Object must be a vector..."</span><span class="sc">;</span> | 
|  | 1291 1278   <span class="s">}</span> | 
|  | 1292 1279 <span class="s">}</span> | 
|  | 1293 1280 | 
|  | 1294 1281 <span class="c"># Make sure size of the two vectors contain the same number of values...</span> | 
|  | 1295 <a name="_ValidateVectorSizesAreEqual-"></a>1282 <span class="k">sub </span><span class="m">_ValidateVectorSizesAreEqual</span> <span class="s">{</span> | 
|  | 1296 1283   <span class="k">my</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">$Vector1</span><span class="cm">,</span> <span class="i">$Vector2</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 1297 1284 | 
|  | 1298 1285   <span class="k">if</span> <span class="s">(</span><span class="i">$Vector1</span><span class="i">->GetSize</span><span class="s">(</span><span class="s">)</span> != <span class="i">$Vector2</span><span class="i">->GetSize</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1299 1286     <span class="w">croak</span> <span class="q">"Error: ${ClassName}->${ErrorMsg}: Size of the vectors must be same..."</span><span class="sc">;</span> | 
|  | 1300 1287   <span class="s">}</span> | 
|  | 1301 1288 <span class="s">}</span> | 
|  | 1302 1289 | 
|  | 1303 1290 <span class="c"># Return a string containing vector values...</span> | 
|  | 1304 <a name="StringifyVector-"></a>1291 <span class="k">sub </span><span class="m">StringifyVector</span> <span class="s">{</span> | 
|  | 1305 1292   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 1306 1293   <span class="k">my</span><span class="s">(</span><span class="i">$VectorString</span><span class="cm">,</span> <span class="i">$FormatString</span><span class="cm">,</span> <span class="i">$PrintFormat</span><span class="cm">,</span> <span class="i">$Size</span><span class="cm">,</span> <span class="i">@ValuesFormat</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1307 1294 | 
|  | 1308 1295   <span class="i">$PrintFormat</span> = <span class="s">(</span><span class="k">exists</span> <span class="i">$This</span>->{<span class="w">ValueFormat</span>}<span class="s">)</span> ? <span class="i">$This</span>->{<span class="w">ValueFormat</span>} <span class="co">:</span> <span class="i">$ValueFormat</span><span class="sc">;</span> | 
|  | 1309 1296 | 
|  | 1310 1297   <span class="i">@ValuesFormat</span> = <span class="s">(</span><span class="i">$PrintFormat</span><span class="s">)</span> x <span class="k">scalar</span> <span class="i">@</span>{<span class="i">$This</span>->{<span class="w">Values</span>}}<span class="sc">;</span> | 
|  | 1311 1298   <span class="i">$FormatString</span> = <span class="k">join</span> <span class="q">' '</span><span class="cm">,</span> <span class="i">@ValuesFormat</span><span class="sc">;</span> | 
|  | 1312 1299 | 
|  | 1313 1300   <span class="i">$Size</span> = <span class="i">$This</span><span class="i">->GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1314 1301 | 
|  | 1315 1302   <span class="i">$VectorString</span> = <span class="k">sprintf</span> <span class="q">"<Size: $Size; Values: [ $FormatString ] >"</span><span class="cm">,</span> <span class="i">@</span>{<span class="i">$This</span>->{<span class="w">Values</span>}}<span class="sc">;</span> | 
|  | 1316 1303 | 
|  | 1317 1304   <span class="k">return</span> <span class="i">$VectorString</span><span class="sc">;</span> | 
|  | 1318 1305 <span class="s">}</span> | 
|  | 1319 1306 | 
|  | 1320 <a name="EOF-"></a></pre> | 
|  | 1321 <p> </p> | 
|  | 1322 <br /> | 
|  | 1323 <center> | 
|  | 1324 <img src="../../../images/h2o2.png"> | 
|  | 1325 </center> | 
|  | 1326 </body> | 
|  | 1327 </html> |