Нарисуйте шестиугольник в массиве - PullRequest
2 голосов
/ 21 апреля 2020

Мне нужно написать функцию, которая dr aws шестиугольник, как показано ниже, в 2d массив. Я знаю только размер столбца массива, остальное нужно вычислить.

enter image description here

Однако я борюсь с математической матрицей, стоящей за этим.

Это то, что я до сих пор кодировал:

function deg2rad(degrees) {
  const pi = Math.PI;
  return degrees * (pi / 180);
}

function getCos(deg) {
  return Math.cos(deg2rad(deg));
}


function drawHexagon(cols) {
  // upper left corner
  const rows = parseInt(cols * getCos(30), 10);

  const arr = [...Array(rows)].map(() => Array(cols).fill(''));
  for (let i = 0; i < rows; i++) {
    for (let j = 0; j < cols; j++) {
      if (j > Math.floor(cols / 4) - 1 && j < (cols - Math.round(10 / 4))) { // middle section (square)
        arr[i][j] = 1;
        continue;
      }

      if (i < Math.floor(rows / 2)) { // top half

        if (j < Math.floor(cols / 4)) { // left side (triangle)
          if (rows / 2 / (i + 1) < cols / 4 / (cols / 4 - j)) { // seems to be right
            arr[i][j] = 2;
          }
        } else { // right side (triangle)
          if (rows / (i + 1) < cols / (j / 4 + 1)) { // wrong
            arr[i][j] = 2;
          }
        }
      } else { // bottom half

        if (j < Math.floor(cols / 4)) { // Left side
          if (rows / (i + 1) > cols / 4 / (j + 1)) { // seems to be right
            arr[i][j] = 2;
          }
        } else { // bottom right 
          if (rows / 2 / (i + 1) > cols / 4 / (cols - j)) { // wrong
            arr[i][j] = 2;
          }
        }
      }
    }
  }
  console.log(arr); // console.table() not available in snippet
  return arr;
}
drawHexagon(8)

Вывод массива даст мне это:

enter image description here

Итак, левая сторона и середина раздел кажется правильным.

Я был бы очень рад, если бы кто-то мог помочь мне в этом.

1 Ответ

1 голос
/ 22 апреля 2020

Есть две проблемы. Первая состоит в том, что Math.sin () и Math.cos () возвращает результат с некоторой ошибкой f в точке суммирования , Поэтому вычисления не стабильны.

Второе - это геометрия c вычисления , вы забыли гипотенуза , поскольку рисунок показывает, что треугольник должен быть прямоугольным треугольником.

enter image description here

Решение:

1- Рассчитать длину стороны b , как вы, затем получите гипотенузу (c) и проверьте его.

2 - если a² + b² = c² затем (a, b, c) являются допустимыми сторонами, в противном случае самые близкие возможные стороны образуют прямоугольный треугольник.

3- Установите точки внутри массива в виде двумерной сетки ( Как показано на рисунке выше ).

4- Точки подключения . Самое эффективное решение Я полагаю, что нужно получить кратчайший путь , как показано на рисунке, и при обычных соединениях между линиями самый короткий путь - это сама линия.

5 - Вернуть массив, содержащий путь, затем присвоить значение для каждой ячейки в сетке, используя массив путей

Здесь ссылка содержала мою реализацию, но (без функции кратчайшего пути я оставил функцию пустой)

Javascript -Код

...