Matrix indizierbar machen?

Gast #6015255
Lesenswert?

Hallo,

ist etwas schwierig mit der Rubrik, da es einfach nur ein "C" Thema ist. 
Bei meiner "Game of Live" Simulation möchte ich sog. Gleiter erzeugen 
und zwar in allen 4 Richtungen.

Das Dumme ist nur, dass ich statt glider0 etc. gern da auch einen Index 
hätte. Es sind hier nur 4, könnten aber auch 100 sein.

Geht da in C etwas in der Richtung? Und zwar MIT Einstellung der Werte?
Ein typeof struct ist mir wohl bekannt aber nicht wie ich da Werte 
voreinstelle.

Vorschweben würde mir sowas wie orientation[0..3].glider[x][y] aber das 
ist nur eine Idee

1
  static   /* Bytemuster eines Gleiters in allen 4 Richtungen */ 
2
  const uint8_t glider0[3][3] = {  1,1,1,  //  [0][0..2]
3
                                   0,0,1,  //  [1][0..2]
4
                                   0,1,0};  //  [2][0..2]
5

6
  const uint8_t glider1[3][3] = {  0,1,0,  //  [0][0..2]
7
                                   0,0,1,  //  [1][0..2]
8
                                   1,1,1};  //  [2][0..2]
9

10
  const uint8_t glider2[3][3] = {  1,0,0  //  [0][0..2]
11
                                   1,0,1,  //  [1][0..2]
12
                                   1,1,0};  //  [2][0..2]
13

14
  const uint8_t glider3[3][3] = {  1,1,1,  //  [0][0..2]
15
                                   1,0,0,  //  [1][0..2]
16
                                   0,1,0};  //  [2][0..2]
Gast #6015359
Lesenswert?

Christian J. schrieb:

> Das Dumme ist nur, dass ich statt glider0 etc. gern da
> auch einen Index hätte. Es sind hier nur 4, könnten aber
> auch 100 sein.

Hmm.
Und wozu braucht man so etwas?

Also präziser: Wozu braucht man Hunderte kleine Feldchen,
in denen jeweils dasselbe (bzw. eins von vier) Bitmuster(n)
abgespeichert ist?
Gast #6015369
Lesenswert?

Christian J. schrieb:
> Und die Initialisierung?

Ich hätte mal gesagt: einfach weiter so, wie in deinem Code mit 2 
Dimensionen schon begonnen:
1
  const uint8_t glider{3][3][3] = {1,1,1,  //  [0][0][0..2]
2
                                   0,0,1,  //  [0][1][0..2]
3
                                   0,1,0,  //  [0][2][0..2]
4
                                   0,1,0,  //  [1][0][0..2]
5
                                   0,0,1,  //  [1][1][0..2]
6
                                   1,1,1,  //  [1][2][0..2]
7
                                   1,0,0,  //  [2][0][0..2]
8
                                   1,0,1,  //  [2][1][0..2]
9
                                   1,1,0,  //  [2][2][0..2]
10
                                   1,1,1,  //  [3][0][0..2]
11
                                   1,0,0,  //  [3][1][0..2]
12
                                   0,1,0}; //  [3][2][0..2]

(Ich bin in C aber nicht verlässlich :-) )
Gast #6018058
Lesenswert?

Eric B. schrieb:
> Dann entstehen die
> Glider (und andere Muster) von alleine.

Ah ja... und irgendwann hören sie auf. Nicht gut für ein "Wand-Bild", 
was ständig laufen soll.

https://www.youtube.com/watch?v=WSc9vmUSVzU

Ein Glider Kanone wird übrigens nie zufällig entstehen, das sind alle 
"erforschte Muster", von allein entstehen nur Stillleben, Blinker und 
Gider, sowie einige sternförmige Pulsare, die sich aufblasen und dann 
wieder "verglühen". Es bleiben immer so ein Gekrümel übrig und Zeugs was 
blinkt.

Um optisch was zu erzeugen muss man schon deren Startmuster abspeichern 
und einspielen!

Die Gleiter erzeuge ich künstlich in allen 4 Flug-Richtungen und schieße 
sie ins Feld, 3 Stück, je 90 Grad gedreht, damit ihre Kollisionen neue 
Muster erzeugen. Den Fall 3 parallel fliegende Gleiter zu haben, die 
niemals kollidieren hatte ich schon bei dem kleinen Feld.
Angehängte Dateien:
#6018174
Lesenswert?

Christian J. schrieb:
> Ah ja... und irgendwann hören sie auf. Nicht gut für ein "Wand-Bild",
> was ständig laufen soll.

Dass du diese Bedingung in deinem Eingangspost nicht erwähnst, kannst du 
mir nicht vorwerfen ;-)

Dein Code hat jetzt doch schon die 4 Glider als indizierbare Muster da; 
was ist denn genau das Problem? Mehrere Muster unterschiedlicher Größe?

EDITH: Das verlinkte Youtube Video hat sogar einen Link auf den 
Source-Code!
Gast #6018224
Lesenswert?

Eric B. schrieb:
> Dein Code hat jetzt doch schon die 4 Glider als indizierbare Muster da;
> was ist denn genau das Problem? Mehrere Muster unterschiedlicher Größe?

Alles ist gut. Du hast sehr spät auf den Beitrag reagiert. Wollte aber 
antworten. Und das Video ist ja von mir.... mit dem Code :-)
Gast #6019118
Lesenswert?

Christian J. schrieb:
> Ah ja... und irgendwann hören sie auf. Nicht gut für ein "Wand-Bild",
> was ständig laufen soll.

Um das zu vermeiden, hat man schon in den späten 70er Jahren des vorigen 
Jahrhunderts angefangen, ab und zu zufällig ein paar Pixel einzustreuen.
Das wirkt stationären Endzuständen entgegen.
Gast #6019154
Lesenswert?

Wieso machst du nicht eine Initalisierungsfunktion "AddGlider(x,y, 
direction)", die einen Glider in entsprechende Stelle der Matrix 
kopiert. Dann kannst du eine entsprechenden x,y,direction in einem Array 
speichern\ initialisieren.
Gast #6019310
Lesenswert?

micha schrieb:
> Wieso machst du nicht eine Initalisierungsfunktion "AddGlider(x,y,
> direction)", die einen Glider in entsprechende Stelle der Matrix
> kopiert.

Schonmal in die tools.c oben geschaut?
1
/* Erzeugt eine definierbare Anzahl von Gleitern mit
2
   zufälliger Flugrichtung  */
3

4
static void CreateGliders(uint8_t n)
5
{
6
    static int orientation = 0;
7

8
     static
9
    const uint8_t glider[4][3][3] = { { {1,1,1}, {0,0,1}, {0,1,0}  },
10
                                      { {0,1,0}, {0,0,1}, {1,1,1}  },
11
                                      { {1,0,0}, {1,0,1}, {1,1,0}  },
12
                                      { {1,1,1}, {1,0,0}, {0,1,0}}
13
                  };
14

15
  /* Erzeuge n zufällige Positionen und Ausrichtungen */
16
  while (n--) {
17

18
    /* Zufalls Koordinaten-Paar mit 3px Abstand */
19
    int x = 5 + (rand() % (MAX_X-5));
20
    int y = 5 + (rand() % (MAX_Y-5));
21

22
    /* Zufällige Ausrichtung, 0..3 */
23
    //int zufall = rand() % 4;
24
        for (int xp = 0; xp <= 2; xp++)
25
            for (int yp = 0; yp <= 2; yp++)
26
                feld.last[x + xp][y + yp] = glider[orientation][xp][yp];
27

28
        orientation = (orientation + 1) % 4;
29
  };
30

31
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren