Skocz do zawartości

Diagonalny odczyt danych z tablicy


TO_mek

Rekomendowane odpowiedzi

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

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

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

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

  • Administratorzy

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

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

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ę...