Tetris Rotation Steine

Diskutiere Tetris Rotation Steine im Mathematik Forum; Hallo, ich habe versucht die bei Tetris die Steine zu rotieren, aber ich bekomme immer eine ArrayIndexOutofBounds Exception, weil die Koordinaten...

  1. Java xyrse123
    Java xyrse123 Mitglied
    Hallo,
    ich habe versucht die bei Tetris die Steine zu rotieren, aber ich bekomme immer eine ArrayIndexOutofBounds Exception, weil die Koordinaten negativ werden. Jeder SpielStein ist aus 4 Teilquadraten mit jeweils x und y Koordinate zusammengesetzt.

    Code (Java):

    SpielStein.x1 = (int) (SpielStein.x1 * Math.cos(Math.PI / 2) - (SpielStein.y1 * Math.sin(Math.PI / 2)));
    SpielStein.y1 = (int) (SpielStein.x1 * Math.sin(Math.PI / 2) + (SpielStein.y1 * Math.cos(Math.PI / 2)));

    SpielStein.x2 = (int) Math.abs(SpielStein.x2 * Math.cos(Math.PI / 2) - (SpielStein.y2 * Math.sin(Math.PI / 2)));
    SpielStein.y2 = (int) Math.abs(SpielStein.x2 * Math.sin(Math.PI / 2) + (SpielStein.y2 * Math.cos(Math.PI / 2)));
    ...
     
    Wo liegt der Fehler bei der Rotation?
    Schonmal Danke im Vorraus.
     
  2. Vielleicht hilft dir diese Seite hier weiter (Klick!)
  3. Meniskusschaden
    Meniskusschaden Bekanntes Mitglied
    Warum ist die Formel denn so kompliziert? sin(PI/2) ist doch sowieso 1 und cos(PI/2) ergibt 0. Da fällt also jede Menge weg.
    Willst du z.B. den neuen Wert von y1 wirklich aus dem neuen x1 berechnen oder doch eher aus dem alten?
     
    Java xyrse123 gefällt das.
  4. Elenteria
    Elenteria Mitglied
    Du willst den Stein um seinen Mittelpunkt drehen nehme ich mal an. Dafür musst du ihn erst ins Zentrum des Koordinatensystems translatieren, dann Rotieren und dann zurück translatieren.

    Im Übrigen kannst du, da Tetrissteine immer um 90° gedreht werden deine Rotation stark vereinfachen. Wenn du in deine Formel mal 90° einsetzt wirst du feststellen da da überall cos(90) = 0 bzw sin(90) = 1 steht .
    oder kurz
    Code (Java):
    x1 =  -y1
    y1 = x1
    Außerdem solltest du die x und y werte mit denen du rechnest in Varibalen auslagern, da du sosnt mit falschen werten weiterrechnest. Aktuell wäre das in etwa so
    Code (Text):
    x1 =1
    y1 = 2

    x1 = -y1 //x1 wert = -2
    y1 = x1 // y1 wert = -2
    korrekt wäre es so
    Code (Text):
    x1 =1
    y1 = 2

    x1_temp = x1
    y1_temp = y1

    x1 = -y1_temp //x1 wert = -2
    y1 = x1_temp // y1 wert = 1
     
    Java xyrse123 gefällt das.
  5. Meniskusschaden
    Meniskusschaden Bekanntes Mitglied
    So wie ich das sehe führt das ganze zu einer Rotation um den Ursprung des Koordinatensystems. Das bedeutet, dass sich das Objekt dadurch ziemlich weit von seiner Ausgangsposition entfernen kann.
     
    Java xyrse123 gefällt das.
  6. Java xyrse123
    Java xyrse123 Mitglied
    Ich habe jetzt versucht es so umzusetzen.
    Code (Java):

    int x1_temp = SpielStein.x1; int y1_temp = SpielStein.y1;
      SpielStein.x1 = -y1_temp;
      SpielStein.y1 = x1_temp;
     
    So bekomme ich wieder negative Koordinaten und eine ArrayIndexoutofBounds Exception.
    Wenn ich die - vor dem -y1_temp wegnehme, dreht sich der Stein, aber "springt" dann auf dem SpielFeld in und her.
     
  7. Meniskusschaden
    Meniskusschaden Bekanntes Mitglied
    Zur Veranschaulichung und Herleitung der Formeln würde ich mal ein Rechteck in ein Koordinatensystem einzeichnen, den Mittelpunkt des Rechtecks bestimmen und das darum rotierte Rechteck ebenfalls einzeichnen. So erschließt sich ganz gut, wie die neuen x- und y-Werte berechnet werden können. Die x-Werte sind vorher eine halbe Breite des ursprünglichen Rechtecks vom x-Wert des Rotationspunktes entfernt und danach eine halbe Höhe.
     
  8. Java xyrse123
    Java xyrse123 Mitglied
    Ich habe es mir jetzt mal aufgemalt. Wenn ich aber den Drehpunkt von z.B dem länglichen Rechteck genau in die Mitte setze, bekomme ich nach der Drehung keine ganzzahligen Koordinaten. Dann müsste ich den Mittelpunkt auf die Mitte der unteren oder oberen länglichen Seite setzen. Wie kann ich den Mittelpunkt von jedem Stein bestimmen?
     
  9. Meniskusschaden
    Meniskusschaden Bekanntes Mitglied
    Im Raster wird es nicht immer einen exakten Mittelpunkt geben, insofern wird man irgendwann runden müssen. Ich könnte mir vorstellen, dass es genügt, den Mittelpunkt exakt zu berechnen und die resultierenden x- und y-Koordinaten des Rechtecks einfach auf ganze Zahlen abzuschneiden. Da müsste ja eigentlich eine Darstellung mit den richtigen Proportionen heraus kommen. Eventuell muss man sich noch etwas überlegen, damit sich der Stein nach vier Rotationen noch an der richtigen Position befindet und nicht abdriftet. Letztendlich kann es ohnehin keine "perfekten" Mittelpunkt-Rotationen geben, weil man z.B. einen 2x3-Stein so nicht auf 3x2 rotieren kann, wenn man im Raster bleiben muss. Da muss man sich eben entscheiden, ob von den drei Spalten die linke oder die rechte wegfallen soll.

    Vielleicht ist es aber auch einfacher, die Struktur jeden Spielsteins in ein quadratisches Array zu legen, und das Array dann je nach gewünschter Orientierung anders zu durchlaufen.
     
    Java xyrse123 gefällt das.
  10. Java xyrse123
    Java xyrse123 Mitglied
    Ok, danke.
    So werde ich es jetzt versuchen.
     
  11. Java xyrse123
    Java xyrse123 Mitglied
    Ich hatte mir jetzt überlegt den aktuellen Spielstein in eine Array zutun und eine Methode zumachen, die ein Array um 90 Grad zudrehen.


    Code (Java):


    public Point[][] rotationsMatrix(int längeStein, Point Stein[][]) {
        for(int i=0; i<längeStein; i++) {
            for(int j=0; j<längeStein; j++) {
                Stein[i][j]=Stein[längeStein-1-j][i];
            }
        }
         return Stein; // rotiertes Array
    }

    public void rotiereStein(Stein SpielStein) {

      Point rotierterStein3[][] = new Point[3][3]; für 3er Steine
      Point rotierterStein4[][] = new Point[4][4]; für 4er Stein

      if(SpielStein.farbcode==2)  { //    aktuellen Spielstein erausfinden, Z-teil
          rotierterStein3[0][0]=new Point(SpielStein.x1,SpielStein.y1);
          rotierterStein3[0][1]=new Point(SpielStein.x2,SpielStein.y2);
          rotierterStein3[1][1]=new Point(SpielStein.x3,SpielStein.y3);
          rotierterStein3[1][2] = new Point(SpielStein.x4, SpielStein.y4);
          löscheStein(SpielStein);
          rotierterStein3= rotationsMatrix(3,rotierterStein3);
      }
    }
     
    In dem Array rotieterterStein3 sind dann ja die neuen Koordinaten von dem Spielstein, aber wie kann ich diese dann umrechnen, dass sie aud dem Spielfeld aktualisiert werden?
     
  12. Java xyrse123
    Java xyrse123 Mitglied
    Ich habe die Drehung jetzt doch anders gemacht,jedenfalls klappt es so:
    Den Punkt x1,y1 habe ich als Drehpunkt definiert.
    Code (Java):

     public void dreheStein() {
            int tmp_x1, tmp_y1;
            int tmp_x2, tmp_y2;
            int tmp_x3, tmp_y3;

            tmp_x1 = drehe_Um_x1(y2);
            tmp_y1 = drehe_Um_y1(x2);
            x2 = tmp_x1;
            y2 = tmp_y1;

            tmp_x2 = drehe_Um_x1(y3);
            tmp_y2 = drehe_Um_y1(x3);
            x3 = tmp_x2;
            y3 = tmp_y2;

            tmp_x3 = drehe_Um_x1(y4);
            tmp_y3 = drehe_Um_y1(x4);
            x4 = tmp_x3;
            y4 = tmp_y3;
        }

        public int drehe_Um_x1( int y) {
            return x1 + y - y1;
        }

        public int drehe_Um_y1(int x) {
            return y1 - x + x1;
        }
     
     
  13. Hinweis: Du möchtest Java lernen? Vielleicht hilft dir dieses Training hier weiter. Sichere dir hier den Zugriff auf umfangreiches Java-Know How und starte richtig durch!
Die Seite wird geladen...

Tetris Rotation Steine - Ähnliche Themen

Tetris: Rotation der Tetrominos
Tetris: Rotation der Tetrominos im Forum Spiele- und Multimedia-Programmierung
Tetris Rotation?
Tetris Rotation? im Forum Spiele- und Multimedia-Programmierung
"Tetris" - Problem bei der Grafik
"Tetris" - Problem bei der Grafik im Forum Java Basics - Anfänger-Themen
Tetris Probleme bei Klassen
Tetris Probleme bei Klassen im Forum Allgemeine Java-Themen
Tetris anfang
Tetris anfang im Forum Java Basics - Anfänger-Themen
Thema: Tetris Rotation Steine