'000000000000000000000000000000000000000000000000000000000000000000000

'000000000000000000011000000000011000000000000000000000000000000000000

'000000011111100000101000110000111000011000000000001111110000000000000

'000000100001100001010000110001110000110000000000001000111100000000000

'000011000001100010100001110011010000110000000000001100001100000000000

'000011000011000111000000100010100001110000001110001100111000010000000

'000110000011001110100000100011000000100000110100001111000001111000000

'000110000000001101100111100110000101100000110001111100000010011011000

'000011000000111110111001111001111001100011111110011111001100010100000

'000011111111001100000001100001100001111110001000010001110000111000000

'000000011000000000000000000000000001111000000000010000011100111000000

'000000000000000000000000000000000000000000000000000000000001011000000

'000000000000000000000000000000000000000000000000000000000010110000000

'(c) 2002 - 2004 by - Chillers of Entropy

 

'-> If the comments below look garbled then change font to COURIER NEW

 

'                                                 ,  ,

'                                                / \/ \

'                                              (/ //_ \_

'     .-._                                      \||  .  \

'      \  '-._                            _,:__.-"/---\_ \

' ______/___  '.    .--------------------'~-'--.)__( , )\ \

'`'--.___  _\  /    | VectorMatrix3D (Module) ,'    \)|\ `\|

'     /_.-' _\ \ _:,_                               " ||   (

'   .'__ _.' \'-/,`-~`                                |/

'       '. ___.> /=,| 22/5/2002 - Riley T. Perry      |

'        / .-'/_ )  '---------------------------------'

'        )'  ( /(/             Riley@deliverance.com.au

'             \\ "

'              '=='

'

' *--------------------------------------------------------*

' * Vector and Matrix Types and Operations. Based on a C++ *

' * class by Kevin Suffern                                 *

' *--------------------------------------------------------*

'

'                                            .---.

'                                           /  .  \

'                                          |\_/|   |

'                                          |   |  /|

'   .--------------------------------------------' |

'  /  .-.                                          |

' |  /   \          Types and variables            |

' | |\_.  |         -------------------            |

' |\|  | /|                                       /

' | `---' |--------------------------------------'

' \       |

'  \     /

'   `---'

 

'**** A vector type ****

 

Public Type Vector3D

 

    x As Double

    y As Double

    z As Double

   

    xv As Double

    yv As Double

    zv As Double

   

    xp As Double

    yp As Double

 

End Type

 

'**** A matrix type ****

 

Public Type Matrix3D

 

    Elements(1 To 4, 1 To 4) As Double

 

End Type

'                                            .---.

'                                           /  .  \

'                                          |\_/|   |

'                                          |   |  /|

'   .--------------------------------------------' |

'  /  .-.   ZeroVector()                           |

' |  /   \  ------------                           |

' | |\_.  | Generates a zero vector                |

' |\|  | /|                                       /

' | `---' |--------------------------------------'

' \       | Parameters:

'  \     /  1.>> Vector3D

'   `---'

'           Returns:

'           1.<< v1 = Vector3D with x,y and z set to 0

'

Public Sub ZeroVector(ByRef v1 As Vector3D)

 

    '*------------------------------------------*

    '*           Generate Zero Vector           *

    '*------------------------------------------*

   

    v1.x = 0#

    v1.y = 0#

    v1.z = 0#

 

End Sub

'                                            .---.

'                                           /  .  \

'                                          |\_/|   |

'                                          |   |  /|

'   .--------------------------------------------' |

'  /  .-.   EqualVector()                          |

' |  /   \  ------------                           |

' | |\_.  | Generates a vector with x=y=z=n        |

' |\|  | /|                                       /

' | `---' |--------------------------------------'

' \       | Parameters:

'  \     /  1.>> Vector3D

'   `---'   2.>> n

'

'           Returns:

'           1.<< v1 = Vector3D with x,y and z set to n

'

Public Sub EqualVector(ByRef v1 As Vector3D, ByVal N As Double)

 

    '*------------------------------------------*

    '*           Generate Equal Vector          *

    '*------------------------------------------*

   

    v1.x = N

    v1.y = N

    v1.z = N

  

End Sub

'                                            .---.

'                                           /  .  \

'                                          |\_/|   |

'                                          |   |  /|

'   .--------------------------------------------' |

'  /  .-.   AddVectors()                           |

' |  /   \  ------------                           |

' | |\_.  | Adds 2 Vectors                         |

' |\|  | /|                                       /

' | `---' |--------------------------------------'

' \       | Parameters:

'  \     /  1.>> v1

'   `---'   2.>> v2

'

'           Returns:

'           1.<< v1 + v2

'

Public Function AddVectors(ByRef v1 As Vector3D, ByRef v2 As Vector3D) As Vector3D

 

    '*------------------------------------------*

    '*              Adds 2 Vectors              *

    '*------------------------------------------*

   

    Dim v3 As Vector3D

   

    v3.x = v1.x + v2.x

    v3.y = v1.y + v2.y

    v3.z = v1.z + v2.z

   

    AddVectors = v3

   

End Function

'                                            .---.

'                                           /  .  \

'                                          |\_/|   |

'                                          |   |  /|

'   .--------------------------------------------' |

'  /  .-.   SubtractVectors()                      |

' |  /   \  -----------------                      |

' | |\_.  | Subtraction on 2 Vectors               |

' |\|  | /|                                       /

' | `---' |--------------------------------------'

' \       | Parameters:

'  \     /  1.>> v1

'   `---'   2.>> v2

'

'           Returns:

'           1.<< v1 - v2

'

Public Function SubtractVectors(ByRef v1 As Vector3D, ByRef v2 As Vector3D) As Vector3D

 

    '*------------------------------------------*

    '*            Subtract 2 Vectors            *

    '*------------------------------------------*

   

    Dim v3 As Vector3D

   

    v3.x = v1.x - v2.x

    v3.y = v1.y - v2.y

    v3.z = v1.z - v2.z

   

    SubtractVectors = v3

   

End Function

'                                            .---.

'                                           /  .  \

'                                          |\_/|   |

'                                          |   |  /|

'   .--------------------------------------------' |

'  /  .-.   NegateVector()                         |

' |  /   \  --------------                         |

' | |\_.  | Negate a Vector                        |

' |\|  | /|                                       /

' | `---' |--------------------------------------'

' \       | Parameters:

'  \     /  1.>> v1

'   `---'

'           Returns:

'           1.<< v1 = -v1

'

Public Sub NegateVector(ByRef v1 As Vector3D)

 

    '*------------------------------------------*

    '*              Negate a Vector             *

    '*------------------------------------------*

   

    v1.x = -v1.x

    v1.y = -v1.y

    v1.z = -v1.z

   

End Sub

'                                            .---.

'                                           /  .  \

'                                          |\_/|   |

'                                          |   |  /|

'   .--------------------------------------------' |

'  /  .-.   AddScalarToVector()                    |

' |  /   \  -------------------                    |

' | |\_.  | Add Scalar to a Vector                 |

' |\|  | /|                                       /

' | `---' |--------------------------------------'

' \       | Parameters:

'  \     /  1.>> v1

'   `---'   2.>> n

'

'           Returns:

'           1.<< v1 = n + (v1)

'

Public Sub AddScalarToVector(ByRef v1 As Vector3D, ByVal N As Double)

 

    '*------------------------------------------*

    '*            Add Scalar To Vector          *

    '*------------------------------------------*

   

    v1.x = v1.x + N

    v1.y = v1.y + N

    v1.z = v1.z + N

   

End Sub

'                                            .---.

'                                           /  .  \

'                                          |\_/|   |

'                                          |   |  /|

'   .--------------------------------------------' |

'  /  .-.   MultiplyVectorByScalar()               |

' |  /   \  ------------------------               |

' | |\_.  | Multiply vector by a scalar            |

' |\|  | /|                                       /

' | `---' |--------------------------------------'

' \       | Parameters:

'  \     /  1.>> v1

'   `---'   2.>> n

'

'           Returns:

'           1.<< v1 = n * (v1)

'

Public Sub MultiplyVectorByScalar(ByRef v1 As Vector3D, ByVal N As Double)

 

    '*------------------------------------------*

    '*       Multiply vector by a scalar        *

    '*------------------------------------------*

   

    v1.x = v1.x * N

    v1.y = v1.y * N

    v1.z = v1.z * N

   

End Sub

'                                            .---.

'                                           /  .  \

'                                          |\_/|   |

'                                          |   |  /|

'   .--------------------------------------------' |

'  /  .-.   DivideVectorByScalar()                 |

' |  /   \  ----------------------                 |

' | |\_.  | Divide vector by a scalar              |

' |\|  | /|                                       /

' | `---' |--------------------------------------'

' \       | Parameters:

'  \     /  1.>> v1

'   `---'   2.>> n

'

'           Returns:

'           1.<< v1 = (v1)/n

'

Public Sub DivideVectorByScalar(ByRef v1 As Vector3D, ByVal N As Double)

 

    '*------------------------------------------*

    '*        Divide vector by a scalar         *

    '*------------------------------------------*

   

    v1.x = v1.x / N

    v1.y = v1.y / N

    v1.z = v1.z / N

   

End Sub

'                                            .---.

'                                           /  .  \

'                                          |\_/|   |

'                                          |   |  /|

'   .--------------------------------------------' |

'  /  .-.   CrossProduct()                         |

' |  /   \  --------------                         |

' | |\_.  | Cross product of 2 Vectors             |

' |\|  | /|                                       /

' | `---' |--------------------------------------'

' \       | Parameters:

'  \     /  1.>> v1

'   `---'   2.>> v2

'

'           Returns:

'           1.<< v1 x v2

'

Public Function CrossProduct(ByRef v1 As Vector3D, ByRef v2 As Vector3D) As Vector3D

 

    '*------------------------------------------*

    '*        Cross product of 2 vectors        *

    '*------------------------------------------*

   

    Dim v3 As Vector3D

   

    v3.x = v1.y * v2.z - v1.z * v2.y

    v3.y = v1.z * v2.x - v1.x * v2.z

    v3.z = v1.x * v2.y - v1.y * v2.x

   

    CrossProduct = v3

   

End Function

'                                            .---.

'                                           /  .  \

'                                          |\_/|   |

'                                          |   |  /|

'   .--------------------------------------------' |

'  /  .-.   DistanceBetweenTwoVectors()            |

' |  /   \  ---------------------------            |

' | |\_.  | Distance between 2 vectors             |

' |\|  | /|                                       /

' | `---' |--------------------------------------'

' \       | Parameters:

'  \     /  1.>> v1

'   `---'   2.>> v2

'

'           Returns:

'           1.<< Distance between v1 and v2

'

Public Function DistanceBetweenTwoVectors(ByRef v1 As Vector3D, ByRef v2 As Vector3D) As Double

 

    '*------------------------------------------*

    '*       Distance between v1 and v2         *

    '*------------------------------------------*

   

    DistanceBetweenTwoVectors = Sqr((v1.x - v2.x) * (v1.x - v2.x) + _

                                (v1.y - v2.y) * (v1.y - v2.y) + _

                                (v1.z - v2.z) * (v1.z - v2.z))

   

End Function

'                                            .---.

'                                           /  .  \

'                                          |\_/|   |

'                                          |   |  /|

'   .--------------------------------------------' |

'  /  .-.   NormaliseVector()                      |

' |  /   \  -----------------                      |

' | |\_.  | Convert to a unit vector               |

' |\|  | /|                                       /

' | `---' |--------------------------------------'

' \       | Parameters:

'  \     /  1.>> v1

'   `---'

'           Returns:

'           1.<< v1 = Unit vector of v1

'

Public Sub NormaliseVector(ByRef v1 As Vector3D)

 

    '*------------------------------------------*

    '*               Normalise v1               *

    '*------------------------------------------*

   

    Dim Length As Double

   

    Length = Sqr((v1.x * v1.x) + (v1.y * v1.y) + (v1.z * v1.z))

  

    v1.x = v1.x / Length

    v1.y = v1.y / Length

    v1.z = v1.z / Length

   

End Sub

'                                            .---.

'                                           /  .  \

'                                          |\_/|   |

'                                          |   |  /|

'   .--------------------------------------------' |

'  /  .-.   VectorLength()                         |

' |  /   \  --------------                         |

' | |\_.  | Get the length of a vector             |

' |\|  | /|                                       /

' | `---' |--------------------------------------'

' \       | Parameters:

'  \     /  1.>> v1

'   `---'

'           Returns:

'           1.<< Length of v1

'

Public Function VectorLength(ByRef v1 As Vector3D) As Double

 

    '*------------------------------------------*

    '*               Normalise v1               *

    '*------------------------------------------*

   

    VectorLength = Sqr(v1.x * v1.x + v1.y * v1.y + v1.z * v1.z)

   

End Function

'                                            .---.

'                                           /  .  \

'                                          |\_/|   |

'                                          |   |  /|

'   .--------------------------------------------' |

'  /  .-.   DotProduct()                           |

' |  /   \  ------------                           |

' | |\_.  | Dot product of 2 Vectors               |

' |\|  | /|                                       /

' | `---' |--------------------------------------'

' \       | Parameters:

'  \     /  1.>> v1

'   `---'   2.>> v2

'

'           Returns:

'           1.<< v1 . v2

'

Public Function DotProduct(ByRef v1 As Vector3D, ByRef v2 As Vector3D) As Double

 

    '*------------------------------------------*

    '*         Dot product of 2 vectors         *

    '*------------------------------------------*

 

    DotProduct = v1.x * v2.x + v1.y * v2.y + v1.z * v2.z

   

End Function

'                                            .---.

'                                           /  .  \

'                                          |\_/|   |

'                                          |   |  /|

'   .--------------------------------------------' |

'  /  .-.   MakeIdentityMatrix()                   |

' |  /   \  -------------------                    |

' | |\_.  | Make an identity matrix                |

' |\|  | /|                                       /

' | `---' |--------------------------------------'

' \       | Parameters:

'  \     /  1.>> Matrix3D

'   `---'

'           Returns:

'           1.<< m1 = m1 as identity matrix

'

Public Sub MakeIdentityMatrix(ByRef m1 As Matrix3D)

 

    '*------------------------------------------*

    '*          Generate Identity Matrix        *

    '*------------------------------------------*

   

    Dim I As Integer

    Dim j As Integer

   

    '**** Iterate through all matrix elements ****

 

    For I = 1 To 4

       

        For j = 1 To 4

               

            '**** check for an identity element ****

           

            If I = j Then

               

                m1.Elements(I, j) = 1

                   

            Else

               

                m1.Elements(I, j) = 0

                   

            End If

               

        Next j

           

    Next I

 

End Sub

'                                            .---.

'                                           /  .  \

'                                          |\_/|   |

'                                          |   |  /|

'   .--------------------------------------------' |

'  /  .-.   MultiplyMatrixByMatrix()               |

' |  /   \  ------------------------               |

' | |\_.  | Make an identity matrix                |

' |\|  | /|                                       /

' | `---' |--------------------------------------'

' \       | Parameters:

'  \     /  1.>> m1 (Matrix3D)

'   `---'   2.>> m2 (Matrix3D)

'

'           Returns:

'           1.<< m1 * m2

'

Public Function MultiplyMatrixByMatrix(ByRef m1 As Matrix3D, ByRef m2 As Matrix3D) As Matrix3D

 

    '*------------------------------------------*

    '*      Multiply a matrix by a matrix       *

    '*------------------------------------------*

   

    Dim I As Integer

    Dim j As Integer

    Dim k As Integer

    Dim value As Double

 

    Dim m3 As Matrix3D

   

    '**** Iterate through all matrix elements ****

 

    For I = 1 To 4

   

        For j = 1 To 4

       

            value = 0#

           

            For k = 1 To 4

           

                '**** multiply individual elements ****

           

                value = value + m1.Elements(I, k) * m2.Elements(k, j)

               

            Next k

           

            m3.Elements(I, j) = value

           

        Next j

       

    Next I

   

    MultiplyMatrixByMatrix = m3

   

End Function