Du bist nicht angemeldet.

Werbeanzeige

1

28.11.2011, 11:22

2D karthesisches Koordinatensystem (Map) drehen

Hallo,

Ich habe hier ein Problem, das mich das ganze Wochenende verzweifeln hat lassen. Irgendwie brummt mein Schädel mit irgendwelchen sin/cos Formeln, Rotationmatrixen und was auch immer, aber ich glaub ich hin hier auf dem Holzweg.

Meine "Spielmap" ist sehr trivial aufgebaut in X- und Y-Koordinaten (2D Ansicht, Vogelpersektive). Siehe auch Screenshot...
Nun würde ich diese gerne serverseitig drehen (90,180,270°). Sprich, wenn man vom angehängten Screenshot ausgeht, und die Map nun um 90 Grad dreht, müsste die Koordinate 5/1 zum Beispiel dann ja den Platz von 5/5 einnehmen, etc. Irgendwie fehlt mir aber hier ein Algorithmus/Formel dafür. Ich habe sehr viele Winkelberechnungssachen gefunden, auch im karthesischen Koordinatensystem, aber meist bin ich da nur auf irgendwelche neuen "float" Koordinaten gestossen

Vielleicht hat ja jemand eine Idee und kann mir helfen?
»moumou« hat folgendes Bild angehängt:
  • koordinatensystem.jpg

dot

Supermoderator

Beiträge: 9 850

Wohnort: Graz

  • Private Nachricht senden

2

28.11.2011, 11:37

Wenn es nur um 90°, 180°, 270° geht, dann brauchst du doch nicht wirklich irgendwie kompliziert zu rotieren. Eine Drehung um 90° bedeutet doch nur, dass die Zeilen zu den Spalten werden usw...

3

28.11.2011, 12:00

Wenn es nur um 90°, 180°, 270° geht, dann brauchst du doch nicht wirklich irgendwie kompliziert zu rotieren. Eine Drehung um 90° bedeutet doch nur, dass die Zeilen zu den Spalten werden usw...
Mhm, vielleicht fehlt mir der visuelle Überblick, aber 5/1 würde doch bei 90° zu 5/5 werden. Also ändert sich ja was in der Zeile und Spalte?

dot

Supermoderator

Beiträge: 9 850

Wohnort: Graz

  • Private Nachricht senden

4

28.11.2011, 12:12

Wenn du mich fragst, würde 5/1 zu 1/-5 werden. Das kannst du natürlich Modulo der Spielfeldabmessungen runterschieben, sodass es z.B. bei einem 5x5 Spielfeld zu 1/1, oder z.B. bei einem 6x6 Spielfeld zu 1/2 wird (ich zähl den Rotationswinkel gegen den Uhrzeigersinn, wie es üblich ist)...

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »dot« (28.11.2011, 12:18)


5

28.11.2011, 14:06

Mhm, stimmt ehrlich gesagt würde es natürlich ins "Minus" reinrutschen. Ich hab die Koordinaten ja als Array abgespeichert, also ohne vorzeichen
Bin bei einem C# Hinweis fündig geworden, das klappt super, bei einem 4*4 Array

int [,] newArray = new int[4,4];
for (int i=3;i>=0;--i)
{
for (int j=0;j<4;++j)
{
newArray[j,3-i] = array[i,j];
}
}

Pseudynom

Frischling

Beiträge: 1

Beruf: Student (Informatik)

  • Private Nachricht senden

6

18.03.2015, 13:49

Das Thema ist zwar schon etwas älter, aber trotzdem:
Man könnte es einmal um die Diagonalachse und nochmal um die Vertikalachse spiegeln, dann ist es um 90° gedreht.

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
public class Rotator{
    public static void rotate(int[][] grid){
        if(grid != null){
            int[][] tmp = new int[grid.length][grid[0].length];
            for(int y = 0; y < grid[0].length; y++){
                for(int x = 0; x < grid.length; x++){
                    tmp[x][y] = grid[y][x];
                }
            }
            for(int y = 0; y < grid[0].length; y++){
                for(int x = 0; x < grid.length; x++){
                    grid[x][y] = tmp[grid.length - 1 - x][y];
                }
            }
        }
    }
    public static void printGrid(int[][] grid){
        if(grid != null){
            for(int y = 0; y < grid[0].length; y++){
                for(int x = 0; x < grid.length; x++){
                    System.out.print(grid[x][y]);
                }
                System.out.println();
            }
        }
    }
    public static void main(String[] arguments){
        int[][] grid = new int[5][5];
        for(int y = 0; y < grid[0].length; y++){
            for(int x = 0; x < grid.length; x++){
                grid[x][y] = (int)(Math.random()*10);
            }
        }
        printGrid(grid);
        System.out.println();
        rotate(grid);
        printGrid(grid);
    }
}

Werbeanzeige