Y und X - mache ich es falsch?

8

Bei meinen JavaScript-Projekten treten manchmal kleine Probleme auf. Dies liegt daran, dass die meisten integrierten Funktionen von JavaScript X, Y ausführen, wenn Positionen benötigt werden. (In dieser Reihenfolge).

Wenn ich jedoch ein 2D-Array erstelle, beginne ich mit Y, und es erscheint mir logischer, die X-Achse horizontal auszuführen. Wenn ich es schlecht erklären kann, möchte ich Ihnen zeigen:

Geben Sie hier die Bildbeschreibung ein

Meine Loops sehen also so aus:

for(var y = 0; y < 10; y++){
    for(var x = 0; x < 10; x++){
        console.log("Doh!");
    }
}

Ist das so verrückt? Ich möchte zur normalen Praxis übergehen, damit es mir beim Erstellen meines Spiels leichter fällt und ich nicht ständig umschalten muss.

Warum ist es also X vor Y?

Bearbeiten: Hier ist ein weiteres Beispiel und wahrscheinlich der Hauptgrund für meine Verwirrung: X ist horizontal und Y ist vertikal in meinen Büchern.

[
[0,1,2,3,4],
[0,1,2,3,4],
[0,1,2,3,4],
[0,1,2,3,4],
]
Oliver Schöning
quelle
3
Mein erster Instinkt wäre, weil wir Punkte wie (X, Y) auf einer kartesischen Ebene beschriften.
Vaughan Hilts
Ich denke schon, aber schauen Sie sich mein neues Beispielarray an. Sieht für mich so besser aus
Oliver Schöning

Antworten:

8

Nein, wenn es für Sie funktioniert, machen Sie es nicht falsch. Wenn Sie wechseln möchten, tun Sie dies. Die Reihenfolge, in der Sie Zeilen / Spalten verarbeiten, ist manchmal willkürlich, manchmal nicht. Welche Reihenfolge Sie verwenden, hängt vollständig vom verwendeten Algorithmus ab.

Es gibt mehrere verschiedene Kombinationen für die Verarbeitung von X, Y. Es liegt an Ihnen, zu entscheiden, welcher für Ihren Algorithmus richtig ist. In dem Fall, in dem jede Iteration unabhängig von einer anderen ist, können Sie auswählen, welche Sie möchten. Sie können wechseln, was sich in der inneren Schleife befindet, und Sie können auch wechseln, wenn die Schleifen von min nach max oder von max nach min gehen.

Ich stelle mir vor, die Standardeinstellung ist:

for xmin to xmax
    for ymin to ymax

denn so werden die Daten oft im Speicher angeordnet. (Nicht unbedingt für alle Sprachen zutreffend, da sich die Reihenfolge des Index ändern kann).

Zum Beispiel ein Array A[3][3]( A[X][Y]):

Geben Sie hier die Bildbeschreibung ein

Wenn sich der yWert in der inneren Schleife befindet, wird zuerst erhöht und dann "überrollt", um den xWert zu erhöhen . Davon abgesehen ist (X, Y) die Standardmethode, um es in Mathematik zu schreiben.

MichaelHouse
quelle
Prost, nun, es "sieht einfach richtig aus", wenn ich ein Grid
Oliver Schöning
4

Du machst es falsch ... irgendwie. Das Falsche, was Sie tun, ist, die Reihenfolge, in der die Koordinaten geschrieben werden, mit der Reihenfolge zu korrelieren, in der die Schleifen verschachtelt sind. Das sind ganz andere Ideen!

Insbesondere ist das Falsche, dass Ihr Koordinatensystem stark (und spröde) an Ihre Implementierung Ihres Datenspeichers gebunden ist. Das bedeutet, dass Sie aus OO-Sicht schlechten Code entwerfen. Der Datenspeicher sollte für das Objekt, das ihn verwendet, undurchsichtig sein, und das Objekt, das ihn verwendet, sollte sich nicht darum kümmern, wie die Daten gespeichert werden. Der Benutzer der Daten muss nur wissen, wie er die gewünschten Informationen erhält.

Was Sie tun sollten, ist einen Weg zu finden, Ihre verschachtelte Array-Datenstruktur zu abstrahieren und sie in einer Methode wie zu verbergen getPoint(x,y). Dann müssen Sie sich keine Gedanken darüber machen, welches Array in welcher Reihenfolge verschachtelt ist. Sie können Ihre Rückwärtsdatenstruktur genau so lassen, wie sie ist, solange Ihre Getter-Methode weiß, dass sie zuerst das Array y findet und dann darin nach dem Element x sucht. Aber welcher Code auch immer aufruft, getPoint()weiß das nicht. Es muss nur die beiden Koordinaten kennen, an denen es interessiert ist.

Seth Battin
quelle
Mit anderen Worten: "Programmen ist es egal, wie hübsch Ihr Code ist!"
Oliver Schöning
Aber stimmt etwas nicht mit meiner Art, es aufzubewahren, außer auf dem Kopf zu stehen?
Oliver Schöning
Nein, das glaube ich nicht. Die anderen Antworten sind auf diese Weise richtig. In meinem Punkt geht es nur darum, wie es Sie verwirrt, was ich aus der Tatsache abgeleitet habe, dass Sie gefragt haben. Wenn Ihre Implementierung Ihren Code schwer verständlich macht, kapseln Sie diese Verrücktheit hinter einer guten Benutzeroberfläche und vergessen Sie sie.
Seth Battin
1

Es spielt keine Rolle! Ich schreibe auch immer zuerst Y (sieht natürlicher aus). Wenn Sie Ihre Matrix als Zeilen im Array haben, können Sie sogar eine Optimierung durchführen. An Stelle von:

for(var y=0; y<h; y++){
    for(var x=0; x<w; x++){
        m[y*w+x] = a;
    }
}

Sie können dies verwenden:

for(var y=0; y<h; y++){
    var i = y*w;
    for(var x=0; x<w; x++, i++){
        m[i] = a;
    }
}

und vermeiden Sie viele Multiplikationen! :) :)

Ivan Kuckir
quelle
Können Sie mir sagen, was Ihr zweites Beispiel besser macht? : o In JavaScript gibt es keine "echten" 2D-Arrays. Sie müssen ein Array von Arrays erstellen. Ich weiß daher nicht, ob ich das zweite Beispiel verwenden kann.
Oliver Schöning
Angenommen, w = h = 1000. Im ersten Beispiel führen Sie keine 1000000-Multiplikationen durch, während Sie im zweiten Beispiel nur 1000 Multiplikationen durchführen. Die Multiplikation ist sehr schwierig, viele CPUs haben nicht einmal einen Multiplikationsbefehl. Sie emulieren es mit Additions- und Bitoperationen.
Ivan Kuckir
Aha. Aber ich sehe mich einfach nicht in einer solchen Iteration. Meine sehen normalerweise so aus: für (var y ...) {array [y] = [] für (var x ...) {array [y] [x] = a;}}
Oliver Schöning
1
Oh sicher. Aber Sie erstellen 1000 neue JS-Objekte auf dem Heap ... Oh,
egal