2011-08-23 16 views
10

Biorąc pod uwagę siatkę, w której znam liczbę wierszy (która jest stała) i znam aktualną liczbę kolumn (które mogą rosnąć dowolnie), w jaki sposób obliczyć wiersz i kolumnę kwadratu z jego indeksu?Jak obliczyć wiersz/col z pozycji siatki?

  + + + + + 
Cols ---> | 0 | 1 | 2 | 3 | ... 
     +--+---|---|---|---|--- 
     0 | 0 | 3 | 6 | 9 | ... 
     +--+---|---|---|---|--- 
Rows 1 | 1 | 4 | 7 | A | ... 
     +--+---|---|---|---|--- 
     2 | 2 | 5 | 8 | B | ... 
     +--+---|---|---|---|--- 
     . . . . . ... 
     . . . . . . 
     . . . . . . 

więc, biorąc pod uwagę:

final int mRowCount = /* something */; 
int mColCount; 

A biorąc pod uwagę pewną funkcję:

private void func(int index) { 

    int row = index % mRowCount; 
    int col = ??? 

Jak prawidłowo obliczyć col? Musi to być funkcja zarówno liczby kolumn, jak i wierszy. Ale mój mózg mnie zawodzi.

Próbka: Jeśli index == 4, to row = 1, col = 1. Jeśli index == 2 następnie row = 2, col = 0.

Dzięki.

Odpowiedz

7

int col = index/mRowCount;

4

wierzę kolumna zostanie uzyskane przez podzielenie całkowitej:

int col = index/mRowCount; 

Byłoby możliwe ograniczenie do jednego podziału (wyeliminować operację modulo) przez zastąpienie jej rozmnażania i odejmowanie. Nie jestem pewien, czy to mniej kosztowne; prawdopodobnie nie ma znaczenia, w większości przypadków:

int col = index/mRowCount; 
int row = index - col * mRowCount; 
5

index = col * mRowCount + row

następnie

row = index % mRowCount;

col = index/mRowCount;

0
column = index/max_rows; 
row = index % max_rows; 
0

wiersz = wskaźnik/numberOfColumns

i

kolumna = wskaźnik% numberOfColumns

1

Czy naprawdę nie zrozumieć konfigurację ale jeśli masz normalną siatkę z progresywnym indeksie jak w Androidzie GridLayout:

+-------------------+ 
| 0 | 1 | 2 | 3 | 4 | 
|---|---|---|---|---| 
| 5 | 6 | 7 | 8 | 9 | 
|---|---|---|---|---| 
| 10| 11| 12| 13| 14| 
|---|---|---|---|---| 
| 15| 16| 17| 18| 19| 
+-------------------+ 

Obliczenia jest:

int col = index % colCount; 
int row = index/colCount; 

Na przykład:

row of index 6 = 6/5 = 1 
column of index 12 = 12 % 5 = 2