Skocz do zawartości

Operacje na tablicach dwuwymiarowych


Rekomendowane odpowiedzi

Witam!

Czy GML posiada jakies funkce operujace na tablicach? Chodzi mi np. o "obracanie elementow tablicy". Powiedzmy mam tablice 3x3:

 

A1 A2 A3

B1 B2 B3

C1 C2 C3

 

i chce otrzymac (obrot w lewo):

 

A2 A3 B3

A1 B2 C3

B1 C1 C2

 

 

albo transponowanie (tak sie to chyba zwie)

 

A1 B1 C1

A2 B2 C2

A3 B3 C3

 

Tablice 3x3 to tylko przyklada ale generalnie interesuja mnie duze tablice kwadratowe (ewentualnie prostokatne dopelnione zerami)

Odnośnik do komentarza
Udostępnij na innych stronach

Lol, sam se to możesz napisać... -.-

 

I taka jedna sprawa - w GMie na pewno nie będziesz miał tablicy 3x3 :P

A jak koniecznie potrzebujesz 3x3, to poczytaj o gridach - jak się do nich dorobi kilka funkcji do stają się całkiem przydatne xP

 

Ed: Lol, nie słuchajcie mnie. Popipsyło mi się... Chodziło mi o to, że gm oferuje max 2-wymiarowe tablice ... xd

Odnośnik do komentarza
Udostępnij na innych stronach

Moge sam :)

 

Skrypt OBROT:

//rotating square array
min_x:=argument0;
min_y:=argument1;
max_x:=argument2;
max_y:=argument3;
kierunek:=argument4; //1-right, -1-left   
//argument5 - nazwa tablicy 

if (variable_global_exists(argument5)) then stop:=0 else stop:=1000;
if ((min_x) >= (max_x)) then stop:=10;
if ((min_y) >= (max_y)) then stop:=100;

tmp0:=variable_global_array2_get(argument5,max_x,min_y);
i:=min_x;
j:=min_y;
a:=((max_x+1)div 2); //dla 1->0 2,3->1 4,5->2
b:=max_x-min_x;

repeat (stop=0) {//start obrotu
repeat ( b ) { //z B=max_x robimy przesuniecie calej kolumny i wiersza (zewnetrznych)

i:=max_x;
j:=min_y;
for (i=max_x; i>=min_x; i+=-1) { //gora: z prawej (2) do lewej (0)
   tmp1:=variable_global_array2_get(argument5,i,j);
   variable_global_array2_set(argument5,i,j,tmp0);
   tmp0:=tmp1;}//i=min_x=0 j=min_y=0 
   //i,j,tmp1,var>tmp0,tmp0 2,0,X3,>X3,X3=X3   1,0,X2,>X3,X2   0,0,X1,>X2,X1
i:=min_x;
j:=min_y+1;    
for (j=min_y+1; j<=max_y; j+=1) { //lewa: z gory (0) do dolu (2)  (j=0; j<=2; j+=1)
           tmp1:=variable_global_array2_get(argument5,i,j);
           variable_global_array2_set(argument5,i,j,tmp0);
           tmp0:=tmp1;}//i=min_x=0 j=max_y=2
           //0,0 

i:=min_x;
j:=max_y;    
for (i=min_x+1; i<=max_x; i+=1) {//dol: z lewej (0) do prawej (2)
                   tmp1:=variable_global_array2_get(argument5,i,j);
                   variable_global_array2_set(argument5,i,j,tmp0);
                   tmp0:=tmp1;}//i=max_x=2 j=max_y=2

i:=max_x;
j:=max_y;
for (j=max_x-1; j>=min_x; j+=-1) {//prawa: z dolu (2) do gory (0)
                           tmp1:=variable_global_array2_get(argument5,i,j);
                           variable_global_array2_set(argument5,i,j,tmp0);
                           tmp0:=tmp1;}//i=max_x=2 j=min_y=0


}// koniec petli z B (przesuniecie calej kolumny)
min_x+=1; //1
max_x-=1; //1
min_y+=1; //1
max_y-=1; //1
if ((min_x >= max_x) or (min_y >= max_y)) then stop+=1;

}//koniec jednego obrotu

 

 

Wywołanie skryptu OBROT:

min_tab:=0;
max_tab:=5;

for (z=min_tab; z<=(max_tab div 2); z+=1) {
   obrot(z,z,(max_tab-z),(max_tab-z),-1,'Test');
}

 

gdzie min_tab i max_tab to wielkosc tablicy (minimum i maksimum), Test to tablica DWUWYMIAROWA (w tym przypadku 6x6)

 

Skrypt powinien dzialac na dowolnej tablicy kwadratowej dwuwymiarowej. Oczywiscie pewnie mozna to napisac duzo lepiej i krocej ale to mialo zadzialac a optymalizacji na chwile obecna nie potrzebuje. Jesli ktos ma ochote to moze to poprawic.

 

TOmek

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...