2012-04-14 11 views
2

Ich verwende einen 1D-Vektor zur Darstellung einer 3D-Datenstruktur mit Indizes 0 bis x * y * z, wobei x, y und z die Anzahl der Zellen in jeder Richtung sind.1D-Vektor - 3D-Indizes

Um eine bestimmte Zelle [xi] indiziert [yi] [zi], die ich benutze:

index = xi + x*yi + x*y*zi ; 

Mein Problem ist, ich kann Sie nicht arbeiten, wie in die andere Richtung zu gehen!

z.B. Ich mag die einzelnen Koordinaten in Index vertreten erhalten 43.

Ich glaube, ich habe gearbeitet, wie xi zu erhalten:

xi = index % x ; 

aber ich kann nicht für das Leben von mir, die andere bekommen .. .:/

EDIT: Hmmm. Ist das richtig?

xi = index % x; 
yi = ((index - xi)/x) % y; 
zi = ((index - xi - x*yi)/x)/y ; 
+0

Ihre Bearbeitung ist richtig, aber die Subtraktionen sind wegen der Ganzzahldivision unnötig – SirGuy

Antwort

4

Versuchen Sie folgendes:

xi = index % x; 
yi = (index/x) % y; 
zi = ((index/x)/y) % z; 

Diese leicht verallgemeinert werden kann, wie man erwarten könnte.

+0

Das '% z' ist unnötig, aber es zeigt deutlich, wie dies zu verallgemeinern ist. Der Himmel verbietet jemandem 4, 5 oder 6-dimensionale Arrays! – SirGuy

+0

Ich habe gehört, dass "sie" ~ 7 dimensionale Arrays in Schachprogrammen verwenden, also wer weiß;) Ich finde das '% z' nicht schlecht, weil es eine automatische zyklische Array-Indizierung erlaubt, was sehr praktisch sein kann. – Anthales

+0

Ich bin mir nicht sicher, ob ich die zyklische Array-Indizierung befürworte, meistens (zumindest für mich), wenn mein Index größer ist als mein Array, was ein Fehler ist, aber das Radfahren würde das verbergen. Obwohl es unter anderen Umständen praktisch ist, ist es praktisch und ich würde es begrüßen. – SirGuy

1

Einige modulare Arithmetik sollte den Trick tun.

index % x = (xi + x*yi + x*y*zi) % x = xi % x, 
    but 0 <= xi < x therefore xi % x = xi. 

Dann für yi:

(index/x) % y = yi. 

Dann endlich:

index/(x * y) = zi. 

EDIT:

In Code (wie oben zu Mathe gegen) wäre es:

xi = index % x; 
    yi = (index/x) % y; 
    zi = index/(x * y); 
+0

gute Antwort ... da dies eine Codierungsseite ist, vielleicht machen zumindest die letzten Gleichungen wie etwas, das Code sein könnte? (Ich habe noch nie einen solchen Zuweisungsoperator gesehen.) – Shep

+0

@Shep, du hast Recht, ich genieße Mathefragen so sehr, dass ich die kleinen Details vergesse. Bearbeitet die Antwort – SirGuy