Вложенные циклы WHILE работают не так, как ожидалось - Javascript / Google Apps Script

У меня есть функция, которая работает не так, как задумано. Прежде чем продолжить, я хотел бы предисловить это тем фактом, что я обычно программирую в Mathematica и мне было поручено перенести функцию Mathematica (которую я написал) на JavaScript, чтобы ее можно было использовать в электронной таблице Google Docs. У меня около 3 часов опыта работы с JavaScript ...

Весь (небольшой) проект рассчитывает общее количество кристаллов на пластину, учитывая размер пластины и кристалла (среди других входных данных). В части, которая не работает, я проверяю, не выходит ли какой-либо угол матрицы за пределы эффективного радиуса Reff.

Функция принимает список координат X и Y, которые при объединении создают индивидуальные координаты XY центра матрицы. Затем это помещается в отдельную функцию maxDistance, которая вычисляет расстояние до каждого из 4 углов и возвращает максимальное значение. Это максимальное значение сверяется с Reff. Если максимум находится внутри радиуса, к счету кубиков добавляется 1.

// Take a list of X and Y values and calculate the Gross Die per Wafer
function CoordsToGDW(Reff,xSize,ySize,xCoords,yCoords) {

  // Initialize Variables
  var count = 0;

  // Nested loops create all the x,y coords of the die centers
  for (var i = 0; i < xCoords.length; i++) {
    for (var j = 0; j < yCoords.length, j++) {         
      // Add 1 to the die count if the distance is within the effective radius
      if (maxDistance(xCoords[i],yCoords[j],xSize,ySize) <= Reff) {count = count + 1}
    }
  }

  return count;
}

Вот несколько примеров того, что я получаю:

xArray={-52.25, -42.75, -33.25, -23.75, -14.25, -4.75, 4.75, 14.25, 23.75, 33.25, 42.75, 52.25, 61.75}
yArray={-52.5, -45.5, -38.5, -31.5, -24.5, -17.5, -10.5, -3.5, 3.5, 10.5, 17.5, 24.5, 31.5, 38.5, 45.5, 52.5, 59.5}
CoordsToGDW(45,9.5,7.0,xArray,yArray)
  returns: 49 (should be 72)

xArray={-36, -28, -20, -12, -4, 4, 12, 20, 28, 36, 44}
yArray={-39, -33, -27, -21, -15, -9, -3, 3, 9, 15, 21, 27, 33, 39, 45}
CoordsToGDW(32.5,8,6,xArray,yArray)
  returns: 39 (should be 48)

Я знаю, что maxDistance () возвращает правильные значения. Итак, в чем моя простая ошибка?

Кроме того, простите, пожалуйста, за то, что я написал некоторые вещи в нотации Mathematica ...

Изменить № 1: Немного форматирования.

Редактировать №2: Per showi, я изменил циклы WHILE на циклы FOR и заменил ‹= на‹. Все еще неправильный ответ. Хотя это немного прибрало ...

Редактировать № 3: То, что я, по сути, пытаюсь сделать, это взять [a, b] и [a, b, c] и вернуть [[a, a], [a, b], [a, c], [b , a], [b, b], [b, c]]

Изменить №4:

Итак, мои вложенные циклы работают правильно: когда я удаляю функцию maxDistance и заменяю ее на 1 (так что 1 ‹= Reff всегда истинно), я обнаруживаю, что общее количество выполнений цикла верно.

Как я это нашел: я добавил код, который просто распечатывает, что функция делает на каждой итерации цикла, и увидел, что X и Y были правильными, но функция maxDistance возвращала NaN или очень большое значение, когда X || Y были положительными. Я изучу эту функцию.

Спасибо всем за помощь!


person dthor    schedule 04.12.2012    source источник


Ответы (3)


Если я не ошибаюсь, вы берете на один элемент больше, чем фактический размер массива, когда делаете

while (i ‹= xCoords.length) {

Должен быть

while (i ‹xCoords.length) {

но я предпочитаю

для (var i = 0; i ‹xCoords.length; i ++)

Не знаю, может ли это помочь :)

И когда вы выполняете var a = {10, 9, 8, 7}, это не массив, а объект, вы, вероятно, имеете в виду var a = []; или это математика :)

person showi    schedule 04.12.2012
comment
1. Да, {} - это обозначение в системе Mathematica для списков (массивов). 2. Цикл FOR, безусловно, уменьшает количество строк. Я отредактировал свой код, чтобы отразить это 3. Сделал изменение «меньше / меньше чем равно». - person dthor; 04.12.2012

while (i < xCoords.length) {
    j = 0;
    while (j < yCoords.length) {  

попробуй это

person Shamis Shukoor    schedule 04.12.2012

Итак, мои вложенные циклы работают правильно: когда я удаляю функцию maxDistance и заменяю ее на 1 (так что 1 ‹= Reff всегда истинно), я обнаруживаю, что общее количество выполнений цикла верно.

Как я это нашел: я добавил код, который просто распечатывает, что функция делает на каждой итерации цикла, и увидел, что X и Y были правильными, но функция maxDistance возвращала NaN или очень большое значение, когда X || Y были положительными. Я изучу эту функцию.

person dthor    schedule 04.12.2012