- Contents in this wiki are for entertainment purposes only
Dex3D Graphics
Jump to navigation
Jump to search
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