Gå til innhold
🎄🎅❄️God Jul og Godt Nyttår fra alle oss i Diskusjon.no ×

Matte - Rotere matriser


Anbefalte innlegg

Hei mattegenier!

 

Har kommet til der hvor jeg viste jeg ville få problemer med Tetris-klonen. Jeg ønsker nemlig å rotere brikken når venstre/høyre tast trykkes, men hvordan i all verden gjøres det? Har sett litt på en del formler, men jeg har ikke fått så mye ut av de enda.

 

Jeg har et array bestående av 3*3 (9) elementer

 

010
111
000

 

Og ønsker å rotere det 90° / -90°, med midterste element som roteringspunkt.

 

(Forumet støtter vist ikke *.rar, endret filendelse til *.txt)

Tetris.txt

Lenke til kommentar
Videoannonse
Annonse

Public Function Rot(input As Point, nullpoint As Point) As Point
Return new Point(nullpoint.X + cos(angle * (PI / 180)) * input.X, nullpoint.Y + sin(angle * (PI / 180)) * input.X)
End Function

vanligvis bruker man matriser til å rotere, men jeg sitter ikke på min egen maskin, og kan ikke slå det opp.

 

Håper dette hjelper litt.

Lenke til kommentar

En trenger ikke å kunne matte for å rotere et bitmap eller en 2 dimensjonal array 90 grader.

 

Det du må gjøre er å kopiere rader til kolonner.

 

Dim Figur(2,2) as boolean
Dim FigurRotert(2,2) as boolean
Dim x as int
Dim y as int

' Her legger du inn din egen kode for å fylle Figur.


' Kopier til FigurRotert med 90 graders rotasjon mot venstre
for x=0 to 2
  for y=0 to 2
     FigurRotert(y,2-x)=Figur(x,y)
  next y
next x

 

Tror dette skal virke, men har ikke testet.

 

EDIT: Jonas, siden du nevnte Tetris og det sannsynligvis er en figur du har definert med arrayen, så vil jeg heller si at det er et bitmap du har. En matrise brukes som regel for å definere koordinater i et koordinatsystem. Det er iellafall kun det jeg har brukt det til, og det er det GeirGrusom har gitt deg rotasjonsformel for.

Endret av kaffenils
Lenke til kommentar

Hvis brikkene dine alltid er 3x3, og de alltid roteres med 90 grader er det også ganske overkill og "rotere" dem.

 

Rotere til clockwise:

for(int y = 0; y < 3; y++)

for(int x = 0; x < 3; x++)

{

rotated[x, y] = original[y, 2-x];

}

 

Rotere counter-clockwise:

for(int y = 0; y < 3; y++)

for(int x = 0; x < 3; x++)

{

rotated[x, y] = original[2-y, x];

}

Lenke til kommentar

I ditt tilfellet blir nok koden som følger:

' Representerer et punkt

Private Type Point

    X As Single

    Y As Single

End Type

 

' Nødvendige konstanter

Const Pi = 3.14159265358979

Const Radian = (Pi / 180)

 

Public Sub RotateArray(Arr() As Long, Angle As Double)

 

    Dim aNew() As Long, X As Long, Y As Long, cX As Long, cY As Long

    Dim Min1 As Long, Min2 As Long, Max1 As Long, Max2 As Long

    Dim destPoint As Point, Center As Point

   

    ' Hent størrelser

    Min1 = LBound(Arr, 1)

    Min2 = LBound(Arr, 2)

    Max1 = UBound(Arr, 1)

    Max2 = UBound(Arr, 2)

   

    ' Kalkuler senterpunktet

    With Center

        .X = (Max1 / 2) + (Min1 / 2)

        .Y = (Max2 / 2) + (Min2 / 2)

    End With

 

    ' Vi må lage en midlertidig array for å kunne overskrive arrayen

    ReDim aNew(Min1 To Max1, Min2 To Max2)

   

    ' Deretter går vi igjennom alle punkter

    For X = Min1 To Max1

        For Y = Min2 To Max2

   

            ' Ikke nødvendig å roterere tomme celler

            If Arr(X, Y) <> 0 Then

   

                ' Roter punktet om senterpunktet

                destPoint = RotatePoint(CreatePoint(X, Y), Center, Angle)

               

                ' Flytt element

                aNew(destPoint.X, destPoint.Y) = Arr(X, Y)

   

            End If

   

        Next

    Next

   

    ' Kopier innholdet i den midlertidige arrayen over til den andre

    For X = Min1 To Max1

        For Y = Min2 To Max2

            Arr(X, Y) = aNew(X, Y)

        Next

    Next

 

End Sub

 

Private Function CreatePoint(X As Long, Y As Long) As Point

   

    ' Returner punktet

    With CreatePoint

        .X = X

        .Y = Y

    End With

 

End Function

 

Private Function RotatePoint(Source As Point, Origin As Point, Angle As Double) As Point

 

    With RotatePoint

        .X = Origin.X + (Cos(Angle * Radian) * (Source.X - Origin.X) - _

              Sin(Angle * Radian) * (Source.Y - Origin.Y))

        .Y = Origin.Y + (Sin(Angle * Radian) * (Source.X - Origin.X) + _

              Cos(Angle * Radian) * (Source.Y - Origin.Y))

    End With

   

End Function

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...