VBA
Discuss AutoCAD ActiveX and VBA (Visual Basic for Applications) questions here.
cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

Invert a Transformation Matrix

0 REPLIES 0
Reply
Message 1 of 1
lando7189
310 Views, 0 Replies

Invert a Transformation Matrix

Just posting VBA code to invert a 4x4 matrix:

 

 

 

 

Public Function InvertMatrix(ByVal MatrixIn As Variant, ByRef MatrixOut As Variant) As Boolean
    ''## This code dervied from code found here:
    ''##  https://stackoverflow.com/questions/1148309/inverting-a-4x4-matrix
    ''##  Both of the above parameters are 4x4 arrays (0 to 3, 0 to 3)

    ''##  These just help with visibility/alignment by using a leading 'O' since i can't use leading zeroes...
    Dim O0 As Integer: O0 = 0
    Dim O1 As Integer: O1 = 1
    Dim O2 As Integer: O2 = 2
    Dim O3 As Integer: O3 = 3
    Dim O4 As Integer: O4 = 4
    Dim O5 As Integer: O5 = 5
    Dim O6 As Integer: O6 = 6
    Dim O7 As Integer: O7 = 7
    Dim O8 As Integer: O8 = 8
    Dim O9 As Integer: O9 = 9

    Dim m00 As Double: m00 = MatrixIn(0, 0)
    Dim m01 As Double: m01 = MatrixIn(0, 1)
    Dim m02 As Double: m02 = MatrixIn(0, 2)
    Dim m03 As Double: m03 = MatrixIn(0, 3)
    Dim m04 As Double: m04 = MatrixIn(1, 0)
    Dim m05 As Double: m05 = MatrixIn(1, 1)
    Dim m06 As Double: m06 = MatrixIn(1, 2)
    Dim m07 As Double: m07 = MatrixIn(1, 3)
    Dim m08 As Double: m08 = MatrixIn(2, 0)
    Dim m09 As Double: m09 = MatrixIn(2, 1)
    Dim m10 As Double: m10 = MatrixIn(2, 2)
    Dim m11 As Double: m11 = MatrixIn(2, 3)
    Dim m12 As Double: m12 = MatrixIn(3, 0)
    Dim m13 As Double: m13 = MatrixIn(3, 1)
    Dim m14 As Double: m14 = MatrixIn(3, 2)
    Dim m15 As Double: m15 = MatrixIn(3, 3)

    Dim inv(0 To 15) As Double
    Dim out(0 To 15) As Double
    Dim det As Double
    Dim i As Integer
    
    
    inv(O0) = 0 + (m05 * m10 * m15) - (m05 * m11 * m14) - (m09 * m06 * m15) + (m09 * m07 * m14) + (m13 * m06 * m11) - (m13 * m07 * m10)
    inv(O4) = 0 - (m04 * m10 * m15) + (m04 * m11 * m14) + (m08 * m06 * m15) - (m08 * m07 * m14) - (m12 * m06 * m11) + (m12 * m07 * m10)
    inv(O8) = 0 + (m04 * m09 * m15) - (m04 * m11 * m13) - (m08 * m05 * m15) + (m08 * m07 * m13) + (m12 * m05 * m11) - (m12 * m07 * m09)
    inv(12) = 0 - (m04 * m09 * m14) + (m04 * m10 * m13) + (m08 * m05 * m14) - (m08 * m06 * m13) - (m12 * m05 * m10) + (m12 * m06 * m09)
    inv(O1) = 0 - (m01 * m10 * m15) + (m01 * m11 * m14) + (m09 * m02 * m15) - (m09 * m03 * m14) - (m13 * m02 * m11) + (m13 * m03 * m10)
    inv(O5) = 0 + (m00 * m10 * m15) - (m00 * m11 * m14) - (m08 * m02 * m15) + (m08 * m03 * m14) + (m12 * m02 * m11) - (m12 * m03 * m10)
    inv(O9) = 0 - (m00 * m09 * m15) + (m00 * m11 * m13) + (m08 * m01 * m15) - (m08 * m03 * m13) - (m12 * m01 * m11) + (m12 * m03 * m09)
    inv(13) = 0 + (m00 * m09 * m14) - (m00 * m10 * m13) - (m08 * m01 * m14) + (m08 * m02 * m13) + (m12 * m01 * m10) - (m12 * m02 * m09)
    inv(O2) = 0 + (m01 * m06 * m15) - (m01 * m07 * m14) - (m05 * m02 * m15) + (m05 * m03 * m14) + (m13 * m02 * m07) - (m13 * m03 * m06)
    inv(O6) = 0 - (m00 * m06 * m15) + (m00 * m07 * m14) + (m04 * m02 * m15) - (m04 * m03 * m14) - (m12 * m02 * m07) + (m12 * m03 * m06)
    inv(10) = 0 + (m00 * m05 * m15) - (m00 * m07 * m13) - (m04 * m01 * m15) + (m04 * m03 * m13) + (m12 * m01 * m07) - (m12 * m03 * m05)
    inv(14) = 0 - (m00 * m05 * m14) + (m00 * m06 * m13) + (m04 * m01 * m14) - (m04 * m02 * m13) - (m12 * m01 * m06) + (m12 * m02 * m05)
    inv(O3) = 0 - (m01 * m06 * m11) + (m01 * m07 * m10) + (m05 * m02 * m11) - (m05 * m03 * m10) - (m09 * m02 * m07) + (m09 * m03 * m06)
    inv(O7) = 0 + (m00 * m06 * m11) - (m00 * m07 * m10) - (m04 * m02 * m11) + (m04 * m03 * m10) + (m08 * m02 * m07) - (m08 * m03 * m06)
    inv(11) = 0 - (m00 * m05 * m11) + (m00 * m07 * m09) + (m04 * m01 * m11) - (m04 * m03 * m09) - (m08 * m01 * m07) + (m08 * m03 * m05)
    inv(15) = 0 + (m00 * m05 * m10) - (m00 * m06 * m09) - (m04 * m01 * m10) + (m04 * m02 * m09) + (m08 * m01 * m06) - (m08 * m02 * m05)
        
    det = m00 * inv(O0) + _
          m01 * inv(O4) + _
          m02 * inv(O8) + _
          m03 * inv(12)
    
    If det = 0 Then
        InvertMatrix = False
    Else
        det = 1# / det
        For i = 0 To 15
            out(i) = inv(i) * det
        Next
    End If

    MatrixOut(0, 0) = out(0)
    MatrixOut(0, 1) = out(1)
    MatrixOut(0, 2) = out(2)
    MatrixOut(0, 3) = out(3)
    MatrixOut(1, 0) = out(4)
    MatrixOut(1, 1) = out(5)
    MatrixOut(1, 2) = out(6)
    MatrixOut(1, 3) = out(7)
    MatrixOut(2, 0) = out(8)
    MatrixOut(2, 1) = out(9)
    MatrixOut(2, 2) = out(10)
    MatrixOut(2, 3) = out(11)
    MatrixOut(3, 0) = out(12)
    MatrixOut(3, 1) = out(13)
    MatrixOut(3, 2) = out(14)
    MatrixOut(3, 3) = out(15)

    InvertMatrix = True
End Function

 

 

 

 

Tags (2)
0 REPLIES 0

Can't find what you're looking for? Ask the community or share your knowledge.

Post to forums  

AutoCAD Inside the Factory


Autodesk Design & Make Report