Y dan X - Apakah saya salah melakukannya?

8

Saya terkadang mengalami masalah kecil saat melakukan proyek JavaScript. Itu karena sebagian besar fungsi built in JavaScript dijalankan X, Y jika diperlukan posisi. (Dalam urutan itu).

Tetapi ketika saya membangun 2D Array saya mulai dengan Y, tampaknya lebih logis bagi saya untuk menjalankan sumbu X horizontal. Jika saya buruk dalam menjelaskannya, izinkan saya menunjukkan kepada Anda:

masukkan deskripsi gambar di sini

Jadi loop saya terlihat seperti ini:

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

Apakah ini gila? Saya ingin mengonversi ke praktik normal sehingga saya memiliki waktu yang lebih mudah saat membangun permainan saya dan tidak harus melakukan switcherroos konstan.

Jadi mengapa X sebelum Y?

Sunting: Ini adalah contoh lain, dan mungkin alasan utama kebingungan saya: X adalah Horizontal, dan Y adalah Vertikal dalam buku-buku saya ..

[
[0,1,2,3,4],
[0,1,2,3,4],
[0,1,2,3,4],
[0,1,2,3,4],
]
Oliver Schöning
sumber
3
Naluri pertamaku adalah karena kita memberi label poin seperti (X, Y) di Cartesian Plane.
Vaughan Hilts
Saya kira begitu, tetapi lihat contoh array baru saya. Terlihat lebih benar bagi saya seperti itu
Oliver Schöning

Jawaban:

8

Tidak, jika itu bekerja untuk Anda, Anda tidak melakukan kesalahan. Jika Anda ingin beralih, daripada melakukannya. Urutan yang Anda proses baris / kolom kadang-kadang sewenang-wenang, kadang-kadang tidak. Pesanan mana yang Anda gunakan bergantung sepenuhnya pada algoritma yang Anda gunakan.

Ada beberapa kombinasi berbeda untuk memproses X, Y. Terserah Anda untuk memilih mana yang benar untuk algoritma Anda. Dalam kasus di mana setiap iterasi independen dari yang lain, Anda dapat memilih mana yang Anda inginkan. Anda dapat beralih yang ada di loop dalam dan Anda juga dapat beralih jika loop beralih dari min ke max atau max ke min.

Saya membayangkan defaultnya adalah:

for xmin to xmax
    for ymin to ymax

karena ini sering kali bagaimana data disusun dalam memori. (Tidak harus benar untuk semua bahasa karena urutan indeks dapat berubah).

Misalnya, sebuah array A[3][3]( A[X][Y]):

masukkan deskripsi gambar di sini

Di mana ynilai berada di kenaikan loop dalam terlebih dahulu dan kemudian "berguling" untuk menambah xnilai. Selain itu, (X, Y) adalah cara standar untuk menuliskannya dalam matematika.

MichaelHouse
sumber
Cheers, well itu hanya "terlihat benar" ketika saya sedang membangun Grid:
Oliver Schöning
4

Anda melakukan itu salah ... semacam. Hal yang salah yang Anda lakukan adalah mengkorelasikan urutan koordinat yang ditulis dengan urutan loop. Itu adalah ide yang sangat berbeda!

Lebih khusus, yang salah adalah bahwa sistem koordinat Anda terikat dengan cara yang kuat (dan rapuh) untuk implementasi penyimpanan data Anda. Itu berarti Anda merancang kode buruk dari sudut pandang OO. Penyimpanan data harus buram pada hal yang menggunakannya, dan hal yang menggunakannya seharusnya tidak peduli bagaimana data disimpan. Pengguna data hanya perlu tahu cara mendapatkan informasi yang diinginkan.

Yang harus Anda lakukan adalah menemukan cara untuk mengabstraksi struktur data array bersarang Anda, dan menyembunyikannya dalam metode seperti getPoint(x,y). Maka Anda tidak perlu khawatir tentang array mana yang bersarang dalam urutan mana. Anda bisa membiarkan struktur data mundur Anda persis seperti itu, selama metode pengambil Anda tahu untuk pertama menemukan array y, dan kemudian mencari di dalamnya untuk elemen x. Tetapi kode apa pun yang menelepon getPoint()tidak tahu itu. Hanya perlu mengetahui dua koordinat yang diminati.

Seth Battin
sumber
Dengan kata lain: "Program tidak peduli seberapa cantik kode Anda!"
Oliver Schöning
Tetapi apakah ada yang salah dengan cara saya menyimpannya selain terbalik?
Oliver Schöning
Tidak, saya kira tidak; jawaban yang lain benar seperti itu. Maksud saya hanya tentang bagaimana hal itu menyebabkan Anda kebingungan, yang saya simpulkan dari fakta yang Anda tanyakan. Jika implementasi Anda membuat kode Anda sulit dipahami, maka enkapsulasi keanehan di balik antarmuka yang baik dan lupakan.
Seth Battin
1

Tidak masalah! Saya juga selalu menulis Y dulu (terlihat lebih alami). Ketika Anda memiliki matriks dalam array sebagai baris, Anda bahkan dapat melakukan optmisasi. Alih-alih ini:

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

Anda bisa menggunakan ini:

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

dan hindari banyak perkalian! :)

Ivan Kuckir
sumber
Bisakah Anda memberi tahu saya apa yang dilakukan contoh kedua Anda dengan lebih baik? : o Dalam JavaScript tidak ada array 2D "nyata", Anda harus membuat array array. Karena itu saya tidak tahu apakah saya bisa menggunakan contoh kedua.
Oliver Schöning
Katakanlah, w = h = 1000. Dalam contoh pertama, Anda melakukan 1000000 perkalian, sedangkan dalam contoh kedua, Anda hanya melakukan 1000 perkalian. Perkalian sangat sulit, banyak CPU bahkan tidak memiliki perintah perkalian. Mereka meniru dengan operasi penambahan dan bit.
Ivan Kuckir
Saya melihat. Tapi saya tidak melihat diri saya melakukan iterasi seperti itu. Tambang saya biasanya terlihat seperti ini: for (var y ...) {array [y] = [] untuk (var x ...) {array [y] [x] = a;}}
Oliver Schöning
1
Tentu Tetapi Anda membuat 1000 objek JS baru di heap ... oh tidak apa-apa, Anda mungkin tidak mengimplementasikan Adobe Photoshop di JS, jadi tetap gunakan iterasi Anda :)
Ivan Kuckir