Кто не знает что есть "Ulam spiral" вот полезная ссылочка http://en.wikipedia.org/wiki/Ulam_spiral хотя в общем вопрос скорее не в спирали этого Ulam-а а в рисовании спирали вообще... Теперь по порядку... Меня не интересует нахождение "простых чисел" это я сделал. Волнует только вопрос как реализовать "рисование". - есть картинка 100х100 - есть координаты $x и $y (50 и 50) - есть цикл (от одного до 10000) Вопрос как шагая по циклу вовремя менять $x и $y в нужном направлении ? Интуитивно понимаю что надо добавить пару переменных, а "родить" не могу... Всё это выглядит примерно так. PHP: <?php include "функция.рнр"; $primes = функция(); // картинка $im = imagecreate(100, 100); $white = imagecolorallocate($im, 255, 255, 255); $black = imagecolorallocate($im, 0, 0, 0); /**********/ // примерные координаты центра картинки $x=50; $y=50; /**********/ // направление "рисования" $dir = 0; /**********/ for($i=1; $i<=10000; $i++) { // бежим по картинке if (in_array($i, $primes)) { // Если надо рисуем пиксель imagesetpixel($im, $x, $y, $black); } if ($dir == 0) { // шаг вправо $x++; } elseif ($dir == 1) { // шаг вверх $y--; } elseif ($dir == 2) { // шаг влево $x--; } elseif ($dir == 3) { // шаг вниз $y++; } // а вот тут то и загвоздка никак // не могу придумать как узнать // когда делать $dir++ } /**********/ // "конец фильма". imagepng($im); /**********/ ?> (мозги болят от всей этой математики, а бросать на пол пути не хочется)
За корректость кода не ручаюсь т.к. никогда не занимался "рисованием" но алгоритм примерно такой: PHP: for($i=1; $i<=10000; $i++) { // бежим по картинке if (in_array($i, $primes)) { // Если надо рисуем пиксель // шаг вправо $x= $x+$i+$x*($i-1); //margin imagesetpixel($im, $x, $y, $black); // шаг вверх $y= $y-$i-$y*($i-1); //margin imagesetpixel($im, $x, $y, $black); // шаг влево $x= $x-$i-$x*$i; //margin imagesetpixel($im, $x, $y, $black); // шаг вниз $y= $y+$i+$x*$i; //margin imagesetpixel($im, $x, $y, $black); } }
Такая закономерность: 1 шаг, поворот, 1 шаг, поворот 2 шага, поворот, 2 шага, поворот 3 шага, поворот, 3 шага, поворот 4 шага, поворот, 4 шага, поворот
В звязи со смертью бабушки я не скоро вернусь к написанию этого кода (сначала много возни с похоронами, потом ухожу в запой) но всёже если кто помог реализовать этот код было бы не плохо... Рабочих примеров у меня несколько но я считаю их скорее "квадратными велосипедами" (с кучей левых и ненужных циклов) хотелось бы "разработать" не только рабочий но и "красивый" код...