БлогNot. Простая спираль Улама на Javascript

Простая спираль Улама на Javascript

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

Вот какая вышла картинка для границы поиска в 100000 чисел.

Первые 100000 чисел спирали Улама
Спираль Улама при границе поиска 100000

Если сохранить показанный ниже код как файл типа .html, он сработает, естественно, довольно медленно, так как на JS.

<div id="wrapper"></div>
<style>
#wrapper { position: relative; }
.number { 
 position: absolute; 
 width: 2px; height: 2px;
 line-height: 2px;
 font-size: 2px;
 text-align: center;
 color: #ffffff;
 border-radius: 1px;
}
.prime {
 color: #000000;
 font-weight: bold;
 background-color: #000000;
}
.first {
 background-color: #800000;
}
</style>
<script>
var isPrime = function (n) { //true, если n - простое
 var i, l;
 if (n == 1) return false;
 if (n == 2) return true;
 if (n % 2 == 0) return false;
 for (i = 3, l = Math.sqrt(n); i <= l; i += 2) {
  if (n % i == 0) return false;
 }
 return true;
};

var appendNum = (function () { //Добавляет элемент в DOM
 var doc = document;
 var wrapper = document.getElementById('wrapper');
 var first = true;
 return function (num, highlight, x, y) {
  var div = doc.createElement('div');
  var className = 'number';
  className += highlight ? ' prime' : '';
  className += first ? ' first' : '';
  first = false;
  div.className = className;
  div.style.left = x + 'px';
  div.style.top = y + 'px';
  wrapper.appendChild(div);
 };
}());

var size = 2; //размер точки, соответствует размеру из стиля
var offsetX = 400; //начальная позиция в пикселах
var offsetY = 350;

var dir = 0;  //направление
var limit = 1; //лимит для смены направления
var counter = 0; //сколько прошли в текущем направлении
var turns = 0; //счетчик поворотов

for (var i = 1; i < 100000; i++) { //граница поиска
 appendNum(i, isPrime(i), offsetX, offsetY);
 switch (dir) {
  case 0: offsetX += size; break; //вправо
  case 1: offsetY -= size; break; //вверх
  case 2: offsetX -= size; break; //влево
  case 3: offsetY += size; break; //вниз
 }
 counter++;
 if (counter >= limit) {
  counter = 0;
  turns = (turns + 1) % 2;
  dir = (dir + 1) % 4;
  if (turns == 0) limit++;
 }
}
</script>
<noscript>You need Javascript to run it</noscript>

06.01.2019, 16:06 [1706 просмотров]


теги: javascript графика числа

К этой статье пока нет комментариев, Ваш будет первым