TO_mek Opublikowano 3 Marca 2009 Udostępnij Opublikowano 3 Marca 2009 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 Więcej opcji udostępniania...
Marek.S Opublikowano 3 Marca 2009 Udostępnij Opublikowano 3 Marca 2009 nie. możesz co najwyżej: https://forum.gmclan.org/index.php?showtopi...30&hl=grids Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Dawidds Opublikowano 3 Marca 2009 Udostępnij Opublikowano 3 Marca 2009 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 Więcej opcji udostępniania...
TO_mek Opublikowano 3 Marca 2009 Autor Udostępnij Opublikowano 3 Marca 2009 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 Więcej opcji udostępniania...
Rekomendowane odpowiedzi
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ę