Jonas Skrevet 4. november 2006 Del Skrevet 4. november 2006 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
GeirGrusom Skrevet 4. november 2006 Del Skrevet 4. november 2006 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
kaffenils Skrevet 4. november 2006 Del Skrevet 4. november 2006 (endret) 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 4. november 2006 av kaffenils Lenke til kommentar
j000rn Skrevet 4. november 2006 Del Skrevet 4. november 2006 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
aadnk Skrevet 4. november 2006 Del Skrevet 4. november 2006 I ditt tilfellet blir nok koden som følger: ' Representerer et punktPrivate 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
GeirGrusom Skrevet 5. november 2006 Del Skrevet 5. november 2006 leste ikke godt nok igjennom... Lenke til kommentar
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå