TO_mek Opublikowano 20 Października 2012 Udostępnij Opublikowano 20 Października 2012 Witam! Pewnie prosta sprawa. Jak odczytać wartości z tablicy ukośnie czyli jakby po przekreceniu jej o 45 stopni. Przykładowo mam tablice 8x8 (tradycyjną szachownice) z której potrzebuje odczytać wartości po ukosie czyli te linie po których w szachach chodzą gońce (laufry). Interesuje mnie utworzenie 2 nowych tablic (8x8) jedna zawierajaca dane tylko z białych pól + dane nadmiarowe oraz druga z polami czrnymi + dane nadmiarowe. Moze prościej na przykładzie mniejszej tablicy: A B C D E F G H I J K L M N O P Wynik (zera to dane nadmiarowe): 0 A 0 0 I F C 0 N K H 0 0 P 0 0 0 E B 0 M J G D 0 O L 0 0 0 0 0 Tablice będą mogły być różnej wielkości choćby i 100 x 100 więc potrzebna mi jakaś sensowna pętla która to automatem zrobi. A i jeszcze też potrzebuje w druga stronę czyli z tych 2 tablic (z danymi nadmiarowymi) zrobić tablice źródłową. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Jakim Opublikowano 21 Października 2012 Udostępnij Opublikowano 21 Października 2012 Załóżmy, że masz macierz 8x8 o indeksach od 0 do 7, gdzie wiersze będą i, a kolumny j. Dodatkowo, pole (0,0) jest białe. Zatem wszystkie pola białe (lub czarne analogicznie) to zbiór takich pól, że spełniony jest warunek: GML (i + j) mod 2 == 0 Jeżeli chcesz wziąć konkretną linię diagonalną, to spełnia ona prosty warunek: GML i (+-) j = k dla pewnej wybranej stałej k i określonego znaku. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
M@ILOSZ Opublikowano 22 Października 2012 Udostępnij Opublikowano 22 Października 2012 Jeśli stoisz na jakimś konkretnym polu, o współrzędnych x i y, to łatwo można odczytać wartości po ukosie za pomocą pętli: GML for (a = 1; szerokosc_tablicy; a += 1)//mało to optymalne, wiem { if (x-a >= 0) { if (y-a >= 0) {tablica[x-a,y-a]} if (y+a < wysokosc_tablicy){tablica[x-a,y+a]} } else if (x+a < szerokosc_tablicy) { if (y-a >= 0) {tablica[x+a,y-a]} if (y+a < wysokosc_tablicy) {tablica[x+a,y+a]} } } Tam gdzie masz tablica[...,...] w klamerkach to wpisz jakie działania chcesz wykonać, albo co chcesz sprawdzić, a użyj właśnie takich zmiennych. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
TO_mek Opublikowano 22 Października 2012 Autor Udostępnij Opublikowano 22 Października 2012 Ok poszperałem jeszcze i zrobiłem na razie samo sumowanie przekątnych, reszta to już z górki. Dla tablicy 10x10 GML var _i, _j, _ROZMIAR, _sumaprz; _ROZMIAR:=10; //aktualnie 0-9 kolumn/wierszy czyli (ds_grid_width lub height bo tabela jest kwadratowa) _sumaprz:=0; for(_j = -(_ROZMIAR-1); _j <= (_ROZMIAR-1); _j+=1){ //WYLICZA SUMY PRZEKATNYCH if(_j > 0) then { for(_i = 0; _i < _ROZMIAR - _j; _i+=1){ _sumaprz += ds_grid_get(tablica,_i,_i+_j); //to liczy POD przekatna } draw_text(32+16+(9-_j)*32, 360, string(_sumaprz)); _sumaprz:=0; }else { for(_i = 0; _i < _ROZMIAR - abs(_j); _i+=1){ _sumaprz += ds_grid_get(tablica, _i+abs(_j), _i); //to liczy NAD przekatna } draw_text(360, 32+16+(_j+9)*32, string(_sumaprz)); _sumaprz:=0; } } Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Administratorzy gnysek Opublikowano 22 Października 2012 Administratorzy Udostępnij Opublikowano 22 Października 2012 Ja bym proponował coś takiego - działa w każdą stronę, aczkolwiek nie dodaje zer czy cos - nie mniej powinno przyblizyc do rozwiązania GML var i,j,add,mx,suma,dir; suma = ''; i = argument0;//pierwszy indeks j = argument1;//drugi indeks mx = argument2 - 1;//ilosc elementów tablicy dir = argument3;//kierunek, np. 45 add = 0; for(add = 0; add < mx; add+=1) { var ni, nj; ni = i + add * lenghtdir_x(1, dir); nj = j + add * lenghtdir_y(1, dir); if (ni > mx or nj > mx or ni < 0 or nj < 0) break; suma += string( tablica[ni, nj]; } return suma; Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Sernat Opublikowano 22 Października 2012 Udostępnij Opublikowano 22 Października 2012 lenght Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
TO_mek Opublikowano 22 Października 2012 Autor Udostępnij Opublikowano 22 Października 2012 Sernat, jak już się bawisz w kompilator to brakuje jeszcze prawego nawiasa w linijce suma += string( tablica[ni, nj]; :) Gnysek wydaje mi się, że w przypadku liczenia od punktu 0,0 jednak mx powinien wynosic dokładnie tyle ile elementów tablicy a nie pomniejszony o 1 Po drugie działa to dla kolumn i wierszy ale na skosy juz nie bardzo gdyż wartości ni oraz nj przyjmują wartości rzeczywiste a nie naturalne gdyz tu juz powinno byc zwykle przypisanie ni:= i + add; oraz nj:= j + add; bez lengthdirow (dla 45, 45+90, 45+180, 45+270 stopni) 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ę