vb 2017 : matrix 4 x 4 class

Status
Niet open voor verdere reacties.

blua tigro

Gebruiker
Lid geworden
21 apr 2009
Berichten
48
dit heb ik nodig voor mijn 3dengine

i denk niet dat ik .scale() nodig heb
maar voor anderen kan t nuttig zijn

.inverse() heb ik gekopieerd uit n freebasic file

t zou alemaal moeten werken
Code:
'' bluatigro 29 aug 2017
'' matrix 4 x 4 class

Public Class m4x4

    Public m(3, 3) As Double
    Private Const deg2rad as Double = Math.pi / 180

    Public Sub New()
        Dim i as Integer
        Dim j as Integer
        For i = 0 to 3
            For j = 0 to 3
                m(i, j) = 0.0
            Next j
            m(i, i) = 1.0
        Next i
    End Sub

    Public Shared Operator *(a As m4x4, b As m4x4) As m4x4
        Dim uit As m4x4
        Dim i as Int16
        Dim j as Int16
        Dim k as Int16
        For i = 0 to 3
            For j = 0 to 3
                uit.m(i, j) = 0.0
                For k = 0 to 3
                    uit.m(i, j) += a.m(i, k) * b.m(k, j)
                Next k
            Next j
        Next i
        Return uit
    End Operator

    public function inverse() as m4x4
    '' for the inverse rotation matrix
    '' it wil NOT calculate inverse translation
        dim d as double 
        dim uit as m4x4 
        dim q as m4x4 = Me
  
        d = q.m(0,0)*q.m(1,1)*q.m(2,2) _
          - q.m(0,0)*q.m(2,1)*q.m(1,2) _
          + q.m(1,0)*q.m(2,1)*q.m(0,2) _
          - q.m(1,0)*q.m(0,1)*q.m(2,2) _
          + q.m(2,0)*q.m(0,1)*q.m(1,2) _
          - q.m(2,0)*q.m(1,1)*q.m(0,2)
    
        uit.m(0,0)=(q.m(1,1)*q.m(2,2)-q.m(1,2)*q.m(2,1))/d
        uit.m(1,0)=(q.m(0,1)*q.m(2,2)-q.m(0,2)*q.m(2,1))/d
        uit.m(2,0)=(q.m(0,1)*q.m(1,2)-q.m(0,2)*q.m(1,1))/d
        uit.m(0,1)=(q.m(1,0)*q.m(2,2)-q.m(1,2)*q.m(2,0))/d
        uit.m(1,1)=(q.m(0,0)*q.m(2,2)-q.m(0,2)*q.m(2,0))/d
        uit.m(2,1)=(q.m(0,0)*q.m(1,2)-q.m(0,2)*q.m(1,0))/d
        uit.m(0,2)=(q.m(1,0)*q.m(2,1)-q.m(1,1)*q.m(2,0))/d
        uit.m(1,2)=(q.m(0,0)*q.m(2,1)-q.m(0,1)*q.m(2,0))/d
        uit.m(2,2)=(q.m(0,0)*q.m(1,1)-q.m(0,1)*q.m(1,2))/d
  
        return uit
  
    end function

    Public Sub translate(x As Double _
    ,y As Double ,z As Double)
        m(3, 0) = x
        m(3, 1) = y
        m(3, 2) = z
    End Sub

    Public Sub rotate(deg As Double _
    , ax As Int16 = 0)
        Dim a As Int16 = 1
        Dim b As Int16 = 2
        If ax = 1 Then
            a = 0
            b = 2
        End If
        If ax = 2 Then
            a = 0
            b = 1
        End If
        m(a, a) = Math.cos(deg * deg2rad)
        m(a, b) = -Math.sin(deg * deg2rad)
        m(b, a) = Math.sin(deg * deg2rad)
        m(b, b) = Math.cos(deg * deg2rad)
    End Sub

    Public Sub scale(x As Double _
    ,y As Double ,z As double)
        m(0, 0) = x
        m(1, 1) = y
        m(2, 2) = z
    End Sub
 
wat vegeten

voeg toe :
Code:
    public shared operator *(m as m4x4, v as dbl3d) as dbl3d
        return new dbl3d(v.x*m.m(0,0)+v.y*m.m(1,0) _
                        +v.z*m.m(2,0)+m.m(3,0) _
                        ,v.x*m.m(0,1)+v.y*m.m(1,1)  _
                        +v.z*m.m(2,1)+m(3,1) _
                        ,v.x*m.m(0,2)+v.y*m.m(1,2) _
                        +v.z*m.m(2,2)+m.m(3,2))
    end operator
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan