1 Quadrant des Koordinatensystems

dariusberlin

Mitglied
Ich möchte ein nichtgrafisches Koordinatensystem implementieren. Alle Koordinaten sollen 0 zurück liefern, es sei denn, es werden andere Werte zugewiesen. Was muß ich tun um zunächst den 1. Quadranten zu implementieren? Ich verstehe es nicht und bin schon länger da dran.
Java:
package langton;


public class Board {
  
  
  int Matrix1 [][]= { {0,0,0,0,0}, {0,0,0,0,0}, {0,0,0,0,0}, {0,0,0,0,0},{0,0,0,0,0} }; //1. Quadrant
  int Matrixa [][]=new int [10000][10000];
  int Matrix2 [][]= { {0,0,0,0,0}, {0,0,0,0,0}, {0,0,0,0,0}, {0,0,0,0,0},{0,0,0,0,0} };  //2.
  int Matrix3 [][]= { {0,0,0,0,0}, {0,0,0,0,0}, {0,0,0,0,0}, {0,0,0,0,0},{0,0,0,0,0} };  //3.
  int Matrix4 [][]= { {0,0,0,0,0}, {0,0,0,0,0}, {0,0,0,0,0}, {0,0,0,0,0},{0,0,0,0,0} };  //4.
public int getstate (int x, int y){
int result=0;

if (x>=0 && x <=5 &&  y>=0 && y <= 5){                                      //1. Quadrant

              

  result=  Matrix1[x][y];

  }else

  if (x >=5 || y >= 5){int Matrixa [][]=new int[Matrix1.length+x][Matrix1[0].length+y];
  result=Matrixa[Matrix1.length+x][Matrix1[0].length+y];
  } 

  
if (x<0 && y>=0){                   //2. Quadrant
  result= Matrix2[-1*x][y];
}
if (x<= 0 && y <0){                   //3. Quadrant
  result= Matrix3[-1*x][-1*y];
}
if (x>0 && y<0){                   //4. Quadrant
  result=Matrix4[x][-1*y];
}
return result;
}


public void setstate(int x,int y, int state1){
  if (x>=0 && x<=5 && y>=0 &&y<=5){
   Matrix1[x][y]=state1;}
  
  else
     if(x>=5 || y>=5){
      Matrixa[x][y]=state1;
     }
  
  if (x<=0 && y<0){                   //Im 3. Quadrant Werte setzen
    Matrix3[-1*x][-1*y]=state1;
  }
  if (x>0 && y<0){                   //Im 4. Quadrant Werte setzen
   Matrix4[x][-1*y]=state1;
  
  }
}}
 
Zuletzt bearbeitet von einem Moderator:

dariusberlin

Mitglied
Wenn ich die getter-methode mit Koordinaten für den 1. Quadrant , mit int -Werten aufrufe, funktioniert das noch nicht richtig. Ich kann nur Werte zwischen 0-4 aufrufen, größere Werte aber nicht. Ich weiß auch nicht genau, was ich verändern muß, damit ich alle int -werte aufrufen kann. Wahrscheinlich muß ich eine kopie von Matrix1 machen und das neue Array sollte aber um etwa 5 größer sein als der Wert, der abgefragt werden soll und 0 zurückliefern, falls durch die setter-methode kein anderer Wert zugewiesen wurde.
 

Harry Kane

Top Contributor
In deinen Beiträgen hast du von einem "unendlich großen" Koordinatensystem gesprochen. Es scheint mir, als ginge es immer noch darum.
Ich würde so ein Korodinatensystem wahrscheinlich als HashMap<java.awt.Point, Integer> implementieren.
Jede x,y-Koordinate lässt sich in einen Instanz von java.awt.Point umwandeln. Wenn die HashMap zu dem Point-key keine value hat, ist das Feld leer.
 

Jardcore

Top Contributor
Ich würde so ein Korodinatensystem wahrscheinlich als HashMap<java.awt.Point, Integer>

Wenn man ein unendlich großes Koordinatensystem erstellen möchte, sollte man auf jeden Fall nicht zu einer HashMap greifen. Der Overhead wird Java einfach mal super schnell überfordern und die HeapSize überschreiten. Wenn man dann noch Operationen ausführen möchte, dann schießt man sich ganz schnell das System ab.

@dariusberlin: Ich verstehe deine Ambition noch nicht und die bisherigen Beschreibungen bringen mich bisher nicht weiter :)
Könntest du vielleicht eine textuelle Beschreibung abgeben ohne Codespezifisch zu werden... Also was genau ist dein Wunsch?
 

Harry Kane

Top Contributor
Wenn man ein unendlich großes Koordinatensystem erstellen möchte, sollte man auf jeden Fall nicht zu einer HashMap greifen.
Die Größe des Koordinatensystem hat nicht unbedingt was mit der Menge der darauf eingezeichneten/gespeicherten Koordinaten zu tun. Wenn es sehr viele Punkt werden, hast du recht, wird eine HashMap schneller unbenutzbar werden als ein Array. Wenn es aber darum geht, eine begrenzte Anzahl von Punkten auf einem Koordinatensystem zu speichern, bei dem der x und der y Index unabhängig voneinander von Integer.MAX_VALUE bis Integer.MIN_VALUE gehen können, würde ich mir eine HashMap mal anschauen.
 

JStein52

Top Contributor
Ich nehme mal an wenn hier von Koordinatensystem die Rede ist dann ist das Spielfeld gemeint ?! Dass es unendlich gross sein soll, davon steht bisher noch in keinem Beitrag des TE ein Wort. Und wenn ich das richtig verstehe willst du dir für jede mögliche Koordinate (x,y) nur abspeichern ob das Feld schwarz oder weiss ist. Dabei könnte z.B. weiss bedeuten kein Eintrag zu dieser Koordinate gespeichert, und schwarz könnte bedeuten es gibt einen Eintrag zu dieser Koordinate. (in besagter HashMap oder ArrayList oder was auch immer). Und genau so könnten deine Getter und Setter funktionieren. Mit diesen erstellst du entweder einen Eintrag zu diesen Koordinaten wenn es noch keinen zu diesen Koordinaten gibt oder du löschst ihn wenn es schon einen gibt. (=Setter) Oder du lieferst true oder false zurück je nachdem ob es einen Eintrag gibt oder nicht (= Getter). Was du mit den vier Matrizen von oben vorhattest war mir unklar denn das ergibt ja höchstens ein 10x10-Spielfeld oder habe ich da was falsch verstanden.
 

dariusberlin

Mitglied
@Jardcore
Also ich möchte das "Spielfeld" der Langton Ameise nichtgrafisch abbilden. Man kann sich dieses Spielfeld auch als nichtgrafisches Koordinatensystem vorstellen was aus Arrays von Arrays besteht. Alle 4 Quadranten liefern von 0-4 Werte zurück sollen aber theoretisch ins unendliche gehen. Es kommt ganz darauf an in welche Richtung sich später die Ameise bewegt. Ich denke die Arrays sollten mit einer Schleife kopiert werden, falls nicht groß genug und dann ein neues Erzeugt werden, was etwas größer ist als das geforderte. Ich bin grade mit dem 1. Quadranten beschäftigt und weiß einfach nicht, wie ich das vorhandene Array in ein größereres kopieren soll und alle Werte 0 ergeben, es sei denn, es werden durch die setter-methode Werte zugewiesen.
 

Jardcore

Top Contributor
Ein Array kopieren geht wie folgt:
Java:
int[] originalArray = new int[] {1, 2, 3, 4, 5, 6, 7}

int size = 10;
int[] biggerArray = Arrays.copyOf(originalArray, size);

Damit ist dein neues Array um 3 größer, und beinhaltet alle Werte des originalArray.
Die neuen Werte müssten theoretisch alle mit 0 initialisiert worden sein.

Da ich gerade auf der Arbeit bin kann ich mich leider nicht in das Problem der Langton Ameise einlesen.

Edit: Verdammt jetzt hab ich doch gewikipediat... sieht bisschen aus wie game of life :)
Wieso brauchst du eigentlich die Quadranten, sollte da nicht ein zwei-Dimensionales boolean Array ausreichen?
Java:
boolean[][] spielfeld;
Dann kannst du sagen false beschreibt den Zustand Weiß und true den Zustand Schwarz. Wenn du dann deine Ameise bewegst guckst du ob true oder false und suchst dir anhand davon dein neues Feld aus.
 
Zuletzt bearbeitet:

dariusberlin

Mitglied
Nein das geht nicht. Weil ich mehr Werte als nur schwarz oder weiß brauche. Du hast mir jetzt erklärt wie ich ein eindimensionales Array kopiere und erweitere. In meinem Fall sind es aber mehrdimensionale Arrays von denen entweder die erste Dimension und/oder die zweite Dimension kopiert und erweitert werden muss. Wie mache ich das? Bezogen auf die Implementierung, die ich bis jetzt schon gemacht habe?
 

Jardcore

Top Contributor
Quick and dirty, musst es nach deinen Wünschen natürlich anpassen.
Java:
public class Array2DCopyTester {
    private int[][] array2D = {
            {   1,   2,   3,   4,   5,   6,   7,   8,   9},
            {  10,  20,  30,  40,  50,  60,  70,  80,  90},
            { 100, 200, 300, 400, 500, 600, 700, 800, 900},
            {1000,2000,3000,4000,5000,6000,7000,8000,9000},
        };
 
    public void expandInnerArray(int index, int size) {
        int[] arrayYouWantToChange = array2D[index];
        int[] tmp = Arrays.copyOf(arrayYouWantToChange, arrayYouWantToChange.length + size);
        array2D[index] = tmp;
    }
 
    public void expandOuterArray(int outerSize, int innerSize) {
        int[][] tmp = Arrays.copyOf(array2D, array2D.length + outerSize);
     
        for(int i = array2D.length; i < tmp.length; i++) {
            tmp[i] = new int[innerSize];
        }
     
        array2D = tmp;
    }
}
 

Jardcore

Top Contributor
Ich weiß nur nicht ob das ein gutes Design ist wenn du ständig irgendwelche Arrays erweiterst.
Überlegt dir vielleicht ob du nicht lieber objektorientierter rangehst.
 

Neue Themen


Oben