Dex3D Graphics
Jump to navigation
Jump to search
Dex3D 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