Иногда я сталкиваюсь с небольшими проблемами при выполнении моих проектов JavaScript. Это потому, что большинство встроенных функций JavaScript запускают X, Y, если требуются позиции. (В этой последовательности).
Но когда я строю 2D-массив, я начинаю с Y, мне кажется более логичным запустить горизонтальную ось X. Если я плохо объясню это, позвольте мне показать вам:
Так что мои петли выглядят так:
for(var y = 0; y < 10; y++){
for(var x = 0; x < 10; x++){
console.log("Doh!");
}
}
Это так безумно? Я хотел бы перейти на обычную практику, чтобы мне было легче строить свою игру и не делать постоянных переключений.
Так почему же X до Y?
Редактировать: Вот еще один пример, и, вероятно, главная причина моего замешательства: X горизонтальный, а Y вертикальный в моих книгах ..
[
[0,1,2,3,4],
[0,1,2,3,4],
[0,1,2,3,4],
[0,1,2,3,4],
]
javascript
Оливер Шенинг
источник
источник
Ответы:
Нет, если это работает для вас, вы не делаете это неправильно. Если вы хотите переключиться, чем это сделать. Порядок обработки строк / столбцов иногда произвольный, иногда нет. Какой порядок вы используете, полностью зависит от используемого вами алгоритма.
Есть несколько разных комбинаций для обработки X, Y. Вам решать, какой из них подходит для вашего алгоритма. В случае, когда каждая итерация независима от любой другой, вы можете выбрать, какую из них вы хотите. Вы можете переключаться, который находится во внутреннем цикле, и вы также можете переключаться, если циклы переходят от минимального к максимальному или от максимального к минимальному.
Я предполагаю, что по умолчанию:
потому что это часто, как данные расположены в памяти. (Не обязательно верно для всех языков, так как порядок индекса может измениться).
Например, массив
A[3][3]
(A[X][Y]
):Когда
y
значение находится во внутреннем цикле, сначала увеличивается, а затем «переворачивается», чтобы увеличитьx
значение. Кроме этого, (X, Y) является стандартным способом написать это в математике.источник
Вы делаете это неправильно ... вроде. Неправильно, что вы делаете, это коррелирует порядок, в котором записываются координаты, с порядком, в котором циклы вложены. Это совершенно разные идеи!
Точнее говоря, неправильно то, что ваша система координат сильно (и хрупко) связана с вашей реализацией вашего хранилища данных. Это означает, что вы разрабатываете плохой код с точки зрения ОО. Хранилище данных должно быть непрозрачным для того, кто его использует, и тому, кто его использует, не должно волновать, как хранятся данные. Пользователь данных должен знать только то, как получить необходимую ему информацию.
Что вам нужно сделать, так это найти способ абстрагировать структуру данных вашего вложенного массива и спрятать ее таким способом
getPoint(x,y)
. Тогда вам не нужно беспокоиться о том, какой массив вложен в каком порядке. Вы можете оставить свою структуру данных в обратном направлении точно такой, какая она есть, если ваш метод получения знает, что сначала нужно найти массив y, а затем искать в нем элемент x. Но какой бы код ни вызывал,getPoint()
он этого не знает. Нужно знать только две координаты, которые его интересуют.источник
Это не имеет значения! Я также всегда пишу Y первым (выглядит более естественно). Когда у вас есть матрица в виде строк, вы даже можете сделать некоторую оптимизацию. Вместо этого:
Вы можете использовать это:
и избегайте большого умножения! :)
источник