- Contents in this wiki are for entertainment purposes only
Dex3D Graphics: Difference between revisions
Jump to navigation
Jump to search
XenoEngineer (talk | contribs) No edit summary |
XenoEngineer (talk | contribs) No edit summary |
||
| (One intermediate revision by the same user not shown) | |||
| Line 1: | Line 1: | ||
[[Category: | {{headerQuasiVisual3D}} | ||
[[Category:Dex3D]] | |||
==Dex3D Engine —from the 90s== | ==Dex3D Graphics Engine —from the 90s== | ||
Written by Jerry J. Chen, Ph.D | Written by Jerry J. Chen, Ph.D | ||
Latest revision as of 15:05, 1 January 2024
Dex3D Graphics Engine —from the 90s
Written by Jerry J. Chen, Ph.D
Dex3D is being modified by XenoEngineer as a custom graphics display for QAT prototype work.
Jerry J. Chen's linear algebra module
'Dex3D
'A Visual Basic 3D Engine
'
'Copyright (C) 1999 by Jerry J. Chen
'
'This program is free software; you can redistribute it and/or
'modify it under the terms of the GNU General Public License
'as published by the Free Software Foundation; either version 2
'of the License, or (at your option) any later version.
'
'This program is distributed in the hope that it will be useful,
'but WITHOUT ANY WARRANTY; without even the implied warranty of
'MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
'GNU General Public License for more details.
'
'You should have received a copy of the GNU General Public License
'along with this program; if not, write to the Free Software
'Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
'
'Jerry J. Chen
'onlyuser@hotmail.com
Public Const Pi = 3.14159265358979
Type POINTAPI
X As Long
Y As Long
End Type
Type Vector
X As Single
Y As Single
Z As Single
End Type
Type Vectrix
X As Single
Y As Single
Z As Single
S As Single
End Type
Type Matrix
A As Vectrix
B As Vectrix
C As Vectrix
D As Vectrix
End Type
Type Orientation
Roll As Single
Pitch As Single
Yaw As Single
End Type
Function OrientationReverse(A As Orientation) As Orientation
OrientationReverse = _
VectorToOrientation( _
VectorScale( _
OrientationToVector(A), _
-1 _
) _
)
End Function
Function VectorToVectrix(A As Vector) As Vectrix
VectorToVectrix.X = A.X
VectorToVectrix.Y = A.Y
VectorToVectrix.Z = A.Z
VectorToVectrix.S = 1
End Function
Function VectorToPOINTAPI(A As Vector) As POINTAPI
VectorToPOINTAPI.X = A.X
VectorToPOINTAPI.Y = A.Y
End Function
Function POINTAPIToVector(A As POINTAPI) As Vector
POINTAPIToVector.X = A.X
POINTAPIToVector.Y = A.Y
End Function
Function POINTAPIToVectrix(A As POINTAPI) As Vectrix
POINTAPIToVectrix.X = A.X
POINTAPIToVectrix.Y = A.Y
POINTAPIToVectrix.S = 1
End Function
Function VectrixToVector(A As Vectrix) As Vector
VectrixToVector.X = A.X
VectrixToVector.Y = A.Y
VectrixToVector.Z = A.Z
End Function
Function VectrixToPOINTAPI(A As Vectrix) As POINTAPI
VectrixToPOINTAPI.X = A.X
VectrixToPOINTAPI.Y = A.Y
End Function
Function OrientationAngle(A As Orientation, B As Orientation) As Single
OrientationAngle = _
VectorAngle( _
OrientationToVector(A), _
OrientationToVector(B) _
)
End Function
Function OrientationModulus(A As Orientation) As Single
OrientationModulus = _
VectorAngle( _
OrientationToVector(OrientationNull), _
OrientationToVector(A) _
)
End Function
Function OrientationToVector(A As Orientation) As Vector
Dim Transformation As Matrix
Transformation = MatrixIdentity
Transformation = _
MatrixDotProduct( _
Transformation, _
TransformationRotate(1, A.Pitch) _
)
Transformation = _
MatrixDotProduct( _
Transformation, _
TransformationRotate(2, A.Yaw) _
)
OrientationToVector = _
VectorMatrixDotProductToVector( _
VectorInput( _
0, _
0, _
1 _
), _
Transformation _
)
End Function
Function TransformationRotate(Axis As Integer, Angle As Single) As Matrix
Select Case Axis
Case 1 'x axis
TransformationRotate = _
MatrixInput( _
VectrixInput(1, 0, 0, 0), _
VectrixInput(0, Cos(Angle), Sin(Angle), 0), _
VectrixInput(0, -Sin(Angle), Cos(Angle), 0), _
VectrixInput(0, 0, 0, 1) _
)
Case 2 'y axis
TransformationRotate = _
MatrixInput( _
VectrixInput(Cos(Angle), 0, -Sin(Angle), 0), _
VectrixInput(0, 1, 0, 0), _
VectrixInput(Sin(Angle), 0, Cos(Angle), 0), _
VectrixInput(0, 0, 0, 1) _
)
Case 3 'z axis
TransformationRotate = _
MatrixInput( _
VectrixInput(Cos(Angle), Sin(Angle), 0, 0), _
VectrixInput(-Sin(Angle), Cos(Angle), 0, 0), _
VectrixInput(0, 0, 1, 0), _
VectrixInput(0, 0, 0, 1) _
)
End Select
End Function
Function TransformationScale(Factor As Vector) As Matrix
TransformationScale = _
MatrixInput( _
VectrixInput(Factor.X, 0, 0, 0), _
VectrixInput(0, Factor.Y, 0, 0), _
VectrixInput(0, 0, Factor.Z, 0), _
VectrixInput(0, 0, 0, 1) _
)
End Function
Function TransformationTranslate(Distance As Vector) As Matrix
TransformationTranslate = _
MatrixInput( _
VectrixInput(1, 0, 0, 0), _
VectrixInput(0, 1, 0, 0), _
VectrixInput(0, 0, 1, 0), _
VectrixInput(Distance.X, Distance.Y, Distance.Z, 1) _
)
End Function
Function VectorToOrientation(A As Vector) As Orientation
VectorToOrientation.Yaw = _
ArcCos( _
VectorAngle( _
VectorInput(A.X, 0, A.Z), _
VectorInput(0, 0, 1) _
) _
)
VectorToOrientation.Pitch = _
ArcCos( _
VectorAngle( _
VectorInput(A.X, A.Y, A.Z), _
VectorInput(A.X, 0, A.Z) _
) _
)
If A.X < 0 Then VectorToOrientation.Yaw = -VectorToOrientation.Yaw
If A.Y > 0 Then VectorToOrientation.Pitch = -VectorToOrientation.Pitch
End Function
Function OrientationInput(Roll As Single, Pitch As Single, Yaw As Single) As Orientation
OrientationInput.Roll = Roll
OrientationInput.Pitch = Pitch
OrientationInput.Yaw = Yaw
End Function
Function OrientationNull() As Orientation
OrientationNull = OrientationInput(0, 0, 0)
End Function
Function OrientationRandom() As Orientation
Randomize
OrientationRandom.Roll = (2 * Rnd - 1) * Pi
OrientationRandom.Pitch = (2 * Rnd - 1) * Pi
OrientationRandom.Yaw = (2 * Rnd - 1) * Pi
End Function
Function OrientationScale(A As Orientation, B As Single) As Orientation
OrientationScale.Roll = A.Roll * B
OrientationScale.Pitch = A.Pitch * B
OrientationScale.Yaw = A.Yaw * B
End Function
Function OrientationAdd(A As Orientation, B As Orientation) As Orientation
OrientationAdd.Roll = A.Roll + B.Roll
OrientationAdd.Pitch = A.Pitch + B.Pitch
OrientationAdd.Yaw = A.Yaw + B.Yaw
End Function
Function OrientationInvert(A As Orientation) As Orientation
OrientationInvert.Roll = 1 / A.Roll
OrientationInvert.Pitch = 1 / A.Pitch
OrientationInvert.Yaw = 1 / A.Yaw
End Function
Function OrientationSubtract(A As Orientation, B As Orientation) As Orientation
OrientationSubtract.Roll = A.Roll - B.Roll
OrientationSubtract.Pitch = A.Pitch - B.Pitch
OrientationSubtract.Yaw = A.Yaw - B.Yaw
End Function
Function OrientationPrint(A As Orientation) As String
OrientationPrint = A.Roll & vbTab & A.Pitch & vbTab & A.Yaw
End Function
Function OrientationCompare(A As Orientation, B As Orientation) As Boolean
If _
A.Roll = B.Roll And _
A.Pitch = B.Pitch And _
A.Yaw = B.Yaw _
Then _
OrientationCompare = True
End Function
Function _
Matrix2By2Determinant( _
A As Single, B As Single, _
C As Single, D As Single _
) As _
Single
Matrix2By2Determinant = _
A * D - _
B * C
End Function
Function _
Matrix3By3Determinant( _
A As Single, B As Single, C As Single, _
D As Single, E As Single, F As Single, _
G As Single, H As Single, I As Single _
) As _
Single
Matrix3By3Determinant = _
A * Matrix2By2Determinant(E, F, H, I) - _
B * Matrix2By2Determinant(D, F, G, I) + _
C * Matrix2By2Determinant(D, E, G, H)
End Function
Function _
Matrix4By4Determinant( _
A As Single, B As Single, C As Single, D As Single, _
E As Single, F As Single, G As Single, H As Single, _
I As Single, J As Single, K As Single, L As Single, _
M As Single, N As Single, O As Single, P As Single _
) As _
Single
Matrix4By4Determinant = _
A * Matrix3By3Determinant(F, G, H, J, K, L, N, O, P) - _
B * Matrix3By3Determinant(E, G, H, I, K, L, M, O, P) + _
C * Matrix3By3Determinant(E, F, H, I, J, L, M, N, P) - _
D * Matrix3By3Determinant(E, F, G, I, J, K, M, N, O)
End Function
Function MatrixCompare(A As Matrix, B As Matrix) As Boolean
If _
VectrixCompare(A.A, B.A) = True And _
VectrixCompare(A.B, B.B) = True And _
VectrixCompare(A.C, B.C) = True And _
VectrixCompare(A.D, B.D) = True _
Then _
MatrixCompare = True
End Function
Function MatrixDeterminant(A As Matrix) As Single
MatrixDeterminant = _
Matrix4By4Determinant( _
A.A.X, A.A.Y, A.A.Z, A.A.S, _
A.B.X, A.B.Y, A.B.Z, A.B.S, _
A.C.X, A.C.Y, A.C.Z, A.C.S, _
A.D.X, A.D.Y, A.D.Z, A.D.S _
)
End Function
Function MatrixDivide(A As Matrix, B As Matrix) As Matrix
MatrixDivide = MatrixDotProduct(A, MatrixInvert(B))
End Function
Function MatrixTranspose(A As Matrix) As Matrix
MatrixTranspose.A.X = A.A.X
MatrixTranspose.A.Y = A.B.X
MatrixTranspose.A.Z = A.C.X
MatrixTranspose.A.S = A.D.X
MatrixTranspose.B.X = A.A.Y
MatrixTranspose.B.Y = A.B.Y
MatrixTranspose.B.Z = A.C.Y
MatrixTranspose.B.S = A.D.Y
MatrixTranspose.C.X = A.A.Z
MatrixTranspose.C.Y = A.B.Z
MatrixTranspose.C.Z = A.C.Z
MatrixTranspose.C.S = A.D.Z
MatrixTranspose.D.X = A.A.S
MatrixTranspose.D.Y = A.B.S
MatrixTranspose.D.Z = A.C.S
MatrixTranspose.D.S = A.D.S
End Function
Function MatrixIdentity() As Matrix
MatrixIdentity = _
MatrixInput( _
VectrixInput(1, 0, 0, 0), _
VectrixInput(0, 1, 0, 0), _
VectrixInput(0, 0, 1, 0), _
VectrixInput(0, 0, 0, 1) _
)
End Function
Function MatrixInvert(A As Matrix) As Matrix
Dim B As Matrix
B.A.X = _
Matrix3By3Determinant( _
A.B.Y, A.B.Z, A.B.S, _
A.C.Y, A.C.Z, A.C.S, _
A.D.Y, A.D.Z, A.D.S _
)
B.A.Y = - _
Matrix3By3Determinant( _
A.B.X, A.B.Z, A.B.S, _
A.C.X, A.C.Z, A.C.S, _
A.D.X, A.D.Z, A.D.S _
)
B.A.Z = _
Matrix3By3Determinant( _
A.B.X, A.B.Y, A.B.S, _
A.C.X, A.C.Y, A.C.S, _
A.D.X, A.D.Y, A.D.S _
)
B.A.S = - _
Matrix3By3Determinant( _
A.B.X, A.B.Y, A.B.Z, _
A.C.X, A.C.Y, A.C.Z, _
A.D.X, A.D.Y, A.D.Z _
)
B.B.X = - _
Matrix3By3Determinant( _
A.A.Y, A.A.Z, A.A.S, _
A.C.Y, A.C.Z, A.C.S, _
A.D.Y, A.D.Z, A.D.S _
)
B.B.Y = _
Matrix3By3Determinant( _
A.A.X, A.A.Z, A.A.S, _
A.C.X, A.C.Z, A.C.S, _
A.D.X, A.D.Z, A.D.S _
)
B.B.Z = - _
Matrix3By3Determinant( _
A.A.X, A.A.Y, A.A.S, _
A.C.X, A.C.Y, A.C.S, _
A.D.X, A.D.Y, A.D.S _
)
B.B.S = _
Matrix3By3Determinant( _
A.A.X, A.A.Y, A.A.Z, _
A.C.X, A.C.Y, A.C.Z, _
A.D.X, A.D.Y, A.D.Z _
)
B.C.X = _
Matrix3By3Determinant( _
A.A.Y, A.A.Z, A.A.S, _
A.B.Y, A.B.Z, A.B.S, _
A.D.Y, A.D.Z, A.D.S _
)
B.C.Y = - _
Matrix3By3Determinant( _
A.A.X, A.A.Z, A.A.S, _
A.B.X, A.B.Z, A.B.S, _
A.D.X, A.D.Z, A.D.S _
)
B.C.Z = _
Matrix3By3Determinant( _
A.A.X, A.A.Y, A.A.S, _
A.B.X, A.B.Y, A.B.S, _
A.D.X, A.D.Y, A.D.S _
)
B.C.S = - _
Matrix3By3Determinant( _
A.A.X, A.A.Y, A.A.Z, _
A.B.X, A.B.Y, A.B.Z, _
A.D.X, A.D.Y, A.D.Z _
)
B.D.X = - _
Matrix3By3Determinant( _
A.A.Y, A.A.Z, A.A.S, _
A.B.Y, A.B.Z, A.B.S, _
A.C.Y, A.C.Z, A.C.S _
)
B.D.Y = _
Matrix3By3Determinant( _
A.A.X, A.A.Z, A.A.S, _
A.B.X, A.B.Z, A.B.S, _
A.C.X, A.C.Z, A.C.S _
)
B.D.Z = - _
Matrix3By3Determinant( _
A.A.X, A.A.Y, A.A.S, _
A.B.X, A.B.Y, A.B.S, _
A.C.X, A.C.Y, A.C.S _
)
B.D.S = _
Matrix3By3Determinant( _
A.A.X, A.A.Y, A.A.Z, _
A.B.X, A.B.Y, A.B.Z, _
A.C.X, A.C.Y, A.C.Z _
)
MatrixInvert = MatrixTranspose(MatrixScale(B, 1 / MatrixDeterminant(A)))
End Function
Function MatrixPrint(A As Matrix) As String
MatrixPrint = _
A.A.X & vbTab & A.A.Y & vbTab & A.A.Z & vbTab & A.A.S & vbCrLf & _
A.B.X & vbTab & A.B.Y & vbTab & A.B.Z & vbTab & A.B.S & vbCrLf & _
A.C.X & vbTab & A.C.Y & vbTab & A.C.Z & vbTab & A.C.S & vbCrLf & _
A.D.X & vbTab & A.D.Y & vbTab & A.D.Z & vbTab & A.D.S
End Function
Function MatrixRandom() As Matrix
MatrixRandom.A = VectrixRandom
MatrixRandom.B = VectrixRandom
MatrixRandom.C = VectrixRandom
MatrixRandom.D = VectrixRandom
End Function
Function MatrixNull() As Matrix
MatrixNull = _
MatrixInput( _
VectrixInput(0, 0, 0, 0), _
VectrixInput(0, 0, 0, 0), _
VectrixInput(0, 0, 0, 0), _
VectrixInput(0, 0, 0, 0) _
)
End Function
Function MatrixUnit() As Matrix
MatrixUnit.A = VectrixUnit
MatrixUnit.B = VectrixUnit
MatrixUnit.C = VectrixUnit
MatrixUnit.D = VectrixUnit
End Function
Function RadianToDegree(AngleRadian As Single) As Single
RadianToDegree = AngleRadian * 180 / Pi
End Function
Function DegreeToRadian(AngleDegree As Single) As Single
DegreeToRadian = AngleDegree * Pi / 180
End Function
'returns the cosine of an angle
Function VectorAngle(A As Vector, B As Vector) As Single
If _
VectorCompare(A, VectorNull) = False And _
VectorCompare(B, VectorNull) = False _
Then
VectorAngle = _
VectorDotProduct( _
VectorNormalize(A), _
VectorNormalize(B) _
)
End If
End Function
Function VectorCompare(A As Vector, B As Vector) As Boolean
If _
A.X = B.X And _
A.Y = B.Y And _
A.Z = B.Z _
Then _
VectorCompare = True
End Function
Function VectrixCompare(A As Vectrix, B As Vectrix) As Boolean
If _
A.X = B.X And _
A.Y = B.Y And _
A.Z = B.Z And _
A.S = B.S _
Then _
VectrixCompare = True
End Function
Function POINTAPICompare(A As POINTAPI, B As POINTAPI) As Boolean
If _
A.X = B.X And _
A.Y = B.Y _
Then _
POINTAPICompare = True
End Function
'returns vector component of A orthogonal to B
Function VectorComponentOrthogonal(A As Vector, B As Vector) As Vector
VectorComponentOrthogonal = _
VectorSubtract( _
A, _
VectorComponentAlong(A, B) _
)
End Function
Function VectorCrossProduct(A As Vector, B As Vector) As Vector
VectorCrossProduct.X = Matrix2By2Determinant(A.Y, A.Z, B.Y, B.Z)
VectorCrossProduct.Y = -Matrix2By2Determinant(A.X, A.Z, B.X, B.Z)
VectorCrossProduct.Z = Matrix2By2Determinant(A.X, A.Y, B.X, B.Y)
End Function
Function VectorDistance(A As Vector, B As Vector) As Single
VectorDistance = VectorModulus(VectorSubtract(A, B))
End Function
Function VectorInvert(A As Vector) As Vector
VectorInvert.X = 1 / A.X
VectorInvert.Y = 1 / A.Y
VectorInvert.Z = 1 / A.Z
End Function
Function VectrixInvert(A As Vectrix) As Vectrix
VectrixInvert.X = 1 / A.X
VectrixInvert.Y = 1 / A.Y
VectrixInvert.Z = 1 / A.Z
VectrixInvert.S = 1 / A.S
End Function
Function POINTAPIInvert(A As POINTAPI) As POINTAPI
POINTAPIInvert.X = 1 / A.X
POINTAPIInvert.Y = 1 / A.Y
End Function
Function VectorMatrixDivide(A As Vector, B As Matrix) As Vector
VectorMatrixDivide = VectorMatrixDotProductToVector(A, MatrixInvert(B))
End Function
Function VectorDotProduct(A As Vector, B As Vector) As Single
VectorDotProduct = A.X * B.X + A.Y * B.Y + A.Z * B.Z
End Function
Function VectorDivide(A As Vector, B As Vector) As Single
VectorDivide = VectorDotProduct(A, VectorInvert(B))
End Function
Function VectrixDivide(A As Vectrix, B As Vectrix) As Single
VectrixDivide = VectrixDotProduct(A, VectrixInvert(B))
End Function
Function POINTAPIDivide(A As POINTAPI, B As POINTAPI) As Single
POINTAPIDivide = POINTAPIDotProduct(A, POINTAPIInvert(B))
End Function
Function VectorMultiply(A As Vector, B As Vector) As Vector
VectorMultiply.X = A.X * B.X
VectorMultiply.Y = A.Y * B.Y
VectorMultiply.Z = A.Z * B.Z
End Function
Function VectrixMultiply(A As Vectrix, B As Vectrix) As Vectrix
VectrixMultiply.X = A.X * B.X
VectrixMultiply.Y = A.Y * B.Y
VectrixMultiply.Z = A.Z * B.Z
VectrixMultiply.S = A.S * B.S
End Function
Function POINTAPIMultiply(A As POINTAPI, B As POINTAPI) As POINTAPI
POINTAPIMultiply.X = A.X * B.X
POINTAPIMultiply.Y = A.Y * B.Y
End Function
Function VectorPrint(A As Vector) As String
VectorPrint = A.X & vbTab & A.Y & vbTab & A.Z
End Function
'returns vector component of A along B
Function VectorComponentAlong(A As Vector, B As Vector) As Vector
VectorComponentAlong = _
VectorScale( _
VectorNormalize(B), _
VectorDotProduct( _
A, _
VectorNormalize(B) _
) _
)
End Function
Function VectrixDotProduct(A As Vectrix, B As Vectrix) As Single
VectrixDotProduct = A.X * B.X + A.Y * B.Y + A.Z * B.Z + A.S * B.S
End Function
Function POINTAPIDotProduct(A As POINTAPI, B As POINTAPI) As Single
POINTAPIDotProduct = A.X * B.X + A.Y * B.Y
End Function
'returns reflection of A off of B
Function VectorReflect(A As Vector, B As Vector) As Vector
If VectorAngle(A, B) < 0 Then _
VectorReflect = _
VectorAdd( _
A, _
VectorScale(VectorComponentAlong(A, B), -2) _
)
End Function
Function VectorScale(A As Vector, B As Single) As Vector
VectorScale.X = A.X * B
VectorScale.Y = A.Y * B
VectorScale.Z = A.Z * B
End Function
Function VectrixScale(A As Vectrix, B As Single) As Vectrix
VectrixScale.X = A.X * B
VectrixScale.Y = A.Y * B
VectrixScale.Z = A.Z * B
VectrixScale.S = A.S * B
End Function
Function POINTAPIScale(A As POINTAPI, B As Single) As POINTAPI
POINTAPIScale.X = A.X * B
POINTAPIScale.Y = A.Y * B
End Function
Function MatrixScale(A As Matrix, B As Single) As Matrix
MatrixScale.A = VectrixScale(A.A, B)
MatrixScale.B = VectrixScale(A.B, B)
MatrixScale.C = VectrixScale(A.C, B)
MatrixScale.D = VectrixScale(A.D, B)
End Function
Function VectorModulus(A As Vector) As Single
VectorModulus = (A.X ^ 2 + A.Y ^ 2 + A.Z ^ 2) ^ (1 / 2)
End Function
Function VectrixMatrixDotProduct(A As Vectrix, B As Matrix) As Vectrix
Dim C As Matrix
C = MatrixTranspose(B)
VectrixMatrixDotProduct.X = VectrixDotProduct(A, C.A)
VectrixMatrixDotProduct.Y = VectrixDotProduct(A, C.B)
VectrixMatrixDotProduct.Z = VectrixDotProduct(A, C.C)
VectrixMatrixDotProduct.S = VectrixDotProduct(A, C.D)
End Function
Function VectorMatrixDotProductToVector(A As Vector, B As Matrix) As Vector
Dim C As Vectrix
Dim D As Matrix
C = VectorToVectrix(A)
D = MatrixTranspose(B)
VectorMatrixDotProductToVector.X = VectrixDotProduct(C, D.A)
VectorMatrixDotProductToVector.Y = VectrixDotProduct(C, D.B)
VectorMatrixDotProductToVector.Z = VectrixDotProduct(C, D.C)
End Function
Function VectorMatrixDotProductToVectrix(A As Vector, B As Matrix) As Vectrix
Dim C As Vectrix
Dim D As Matrix
C = VectorToVectrix(A)
D = MatrixTranspose(B)
VectorMatrixDotProductToVectrix.X = VectrixDotProduct(C, D.A)
VectorMatrixDotProductToVectrix.Y = VectrixDotProduct(C, D.B)
VectorMatrixDotProductToVectrix.Z = VectrixDotProduct(C, D.C)
VectorMatrixDotProductToVectrix.S = VectrixDotProduct(C, D.D)
End Function
Function MatrixDotProduct(A As Matrix, B As Matrix) As Matrix
Dim C As Matrix
C = MatrixTranspose(B)
MatrixDotProduct.A.X = VectrixDotProduct(A.A, C.A)
MatrixDotProduct.A.Y = VectrixDotProduct(A.A, C.B)
MatrixDotProduct.A.Z = VectrixDotProduct(A.A, C.C)
MatrixDotProduct.A.S = VectrixDotProduct(A.A, C.D)
MatrixDotProduct.B.X = VectrixDotProduct(A.B, C.A)
MatrixDotProduct.B.Y = VectrixDotProduct(A.B, C.B)
MatrixDotProduct.B.Z = VectrixDotProduct(A.B, C.C)
MatrixDotProduct.B.S = VectrixDotProduct(A.B, C.D)
MatrixDotProduct.C.X = VectrixDotProduct(A.C, C.A)
MatrixDotProduct.C.Y = VectrixDotProduct(A.C, C.B)
MatrixDotProduct.C.Z = VectrixDotProduct(A.C, C.C)
MatrixDotProduct.C.S = VectrixDotProduct(A.C, C.D)
MatrixDotProduct.D.X = VectrixDotProduct(A.D, C.A)
MatrixDotProduct.D.Y = VectrixDotProduct(A.D, C.B)
MatrixDotProduct.D.Z = VectrixDotProduct(A.D, C.C)
MatrixDotProduct.D.S = VectrixDotProduct(A.D, C.D)
End Function
Function MatrixMultiply(A As Matrix, B As Matrix) As Matrix
MatrixMultiply.A = VectrixMultiply(A.A, B.A)
MatrixMultiply.B = VectrixMultiply(A.B, B.B)
MatrixMultiply.C = VectrixMultiply(A.C, B.C)
MatrixMultiply.D = VectrixMultiply(A.D, B.D)
End Function
Function MatrixAdd(A As Matrix, B As Matrix) As Matrix
MatrixAdd.A = VectrixAdd(A.A, B.A)
MatrixAdd.B = VectrixAdd(A.B, B.B)
MatrixAdd.C = VectrixAdd(A.C, B.C)
MatrixAdd.D = VectrixAdd(A.D, B.D)
End Function
Function MatrixSubtract(A As Matrix, B As Matrix) As Matrix
MatrixSubtract.A = VectrixSubtract(A.A, B.A)
MatrixSubtract.B = VectrixSubtract(A.B, B.B)
MatrixSubtract.C = VectrixSubtract(A.C, B.C)
MatrixSubtract.D = VectrixSubtract(A.D, B.D)
End Function
Function VectorNormalize(A As Vector) As Vector
Dim Length As Single
Length = VectorModulus(A)
If Length <> 0 Then VectorNormalize = VectorScale(A, 1 / Length)
End Function
Function VectorInterpolate(A As Vector, B As Vector, Alpha As Single) As Vector
VectorInterpolate.X = A.X + Alpha * (B.X - A.X)
VectorInterpolate.Y = A.Y + Alpha * (B.Y - A.Y)
VectorInterpolate.Z = A.Z + Alpha * (B.Z - A.Z)
End Function
Function VectrixInterpolate(A As Vectrix, B As Vectrix, Alpha As Single) As Vectrix
VectrixInterpolate.X = A.X + Alpha * (B.X - A.X)
VectrixInterpolate.Y = A.Y + Alpha * (B.Y - A.Y)
VectrixInterpolate.Z = A.Z + Alpha * (B.Z - A.Z)
VectrixInterpolate.S = A.S + Alpha * (B.S - A.S)
End Function
Function POINTAPIInterpolate(A As POINTAPI, B As POINTAPI, Alpha As Single) As POINTAPI
POINTAPIInterpolate.X = A.X + Alpha * (B.X - A.X)
POINTAPIInterpolate.Y = A.Y + Alpha * (B.Y - A.Y)
End Function
Function MatrixInterpolate(A As Matrix, B As Matrix, Alpha As Single) As Matrix
MatrixInterpolate.A = VectrixInterpolate(A.A, B.A, Alpha)
MatrixInterpolate.B = VectrixInterpolate(A.B, B.B, Alpha)
MatrixInterpolate.C = VectrixInterpolate(A.C, B.C, Alpha)
MatrixInterpolate.D = VectrixInterpolate(A.D, B.D, Alpha)
End Function
Function VectorAdd(A As Vector, B As Vector) As Vector
VectorAdd.X = A.X + B.X
VectorAdd.Y = A.Y + B.Y
VectorAdd.Z = A.Z + B.Z
End Function
Function VectrixAdd(A As Vectrix, B As Vectrix) As Vectrix
VectrixAdd.X = A.X + B.X
VectrixAdd.Y = A.Y + B.Y
VectrixAdd.Z = A.Z + B.Z
VectrixAdd.S = A.Z + B.S
End Function
Function POINTAPIAdd(A As POINTAPI, B As POINTAPI) As POINTAPI
POINTAPIAdd.X = A.X + B.X
POINTAPIAdd.Y = A.Y + B.Y
End Function
Function VectorSubtract(A As Vector, B As Vector) As Vector
VectorSubtract.X = A.X - B.X
VectorSubtract.Y = A.Y - B.Y
VectorSubtract.Z = A.Z - B.Z
End Function
Function VectrixSubtract(A As Vectrix, B As Vectrix) As Vectrix
VectrixSubtract.X = A.X - B.X
VectrixSubtract.Y = A.Y - B.Y
VectrixSubtract.Z = A.Z - B.Z
VectrixSubtract.S = A.S - B.S
End Function
Function POINTAPISubtract(A As POINTAPI, B As POINTAPI) As POINTAPI
POINTAPISubtract.X = A.X - B.X
POINTAPISubtract.Y = A.Y - B.Y
End Function
Function VectorInput(X As Single, Y As Single, Z As Single) As Vector
VectorInput.X = X
VectorInput.Y = Y
VectorInput.Z = Z
End Function
Function VectorRandom() As Vector
Randomize
VectorRandom.X = 2 * Rnd - 1
VectorRandom.Y = 2 * Rnd - 1
VectorRandom.Z = 2 * Rnd - 1
End Function
Function VectrixRandom() As Vectrix
Randomize
VectrixRandom.X = 2 * Rnd - 1
VectrixRandom.Y = 2 * Rnd - 1
VectrixRandom.Z = 2 * Rnd - 1
VectrixRandom.S = 2 * Rnd - 1
End Function
Function POINTAPIRandom() As POINTAPI
Randomize
POINTAPIRandom.X = 2 * Rnd - 1
POINTAPIRandom.Y = 2 * Rnd - 1
End Function
Function MatrixInput(A As Vectrix, B As Vectrix, C As Vectrix, D As Vectrix) As Matrix
MatrixInput.A = A
MatrixInput.B = B
MatrixInput.C = C
MatrixInput.D = D
End Function
Function VectorUnit() As Vector
VectorUnit = VectorInput(1, 1, 1)
End Function
Function VectrixUnit() As Vectrix
VectrixUnit = VectrixInput(1, 1, 1, 1)
End Function
Function VectrixPrint(A As Vectrix) As String
VectrixPrint = A.X & vbTab & A.Y & vbTab & A.Z & vbTab & A.S
End Function
Function POINTAPIUnit() As POINTAPI
POINTAPIUnit = POINTAPIInput(1, 1)
End Function
Function POINTAPIPrint(A As POINTAPI) As String
POINTAPIPrint = A.X & vbTab & A.Y
End Function
Function POINTAPINull() As POINTAPI
POINTAPINull = POINTAPIInput(0, 0)
End Function
Function VectrixNull() As Vectrix
VectrixNull = VectrixInput(0, 0, 0, 0)
End Function
Function VectorNull() As Vector
VectorNull = VectorInput(0, 0, 0)
End Function
Function VectrixInput(X As Single, Y As Single, Z As Single, S As Single) As Vectrix
VectrixInput.X = X
VectrixInput.Y = Y
VectrixInput.Z = Z
VectrixInput.S = S
End Function
Function POINTAPIInput(X As Long, Y As Long) As POINTAPI
POINTAPIInput.X = X
POINTAPIInput.Y = Y
End Function