За последние 24 часа нас посетили 53398 программистов и 1715 роботов. Сейчас ищут 944 программиста ...

"Ulam spiral" с помощью GD

Тема в разделе "Прочие вопросы по PHP", создана пользователем Vladson, 19 мар 2007.

  1. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Кто не знает что есть "Ulam spiral" вот полезная ссылочка http://en.wikipedia.org/wiki/Ulam_spiral хотя в общем вопрос скорее не в спирали этого Ulam-а а в рисовании спирали вообще...

    Теперь по порядку...

    Меня не интересует нахождение "простых чисел" это я сделал.
    Волнует только вопрос как реализовать "рисование".

    - есть картинка 100х100
    - есть координаты $x и $y (50 и 50)
    - есть цикл (от одного до 10000)

    Вопрос как шагая по циклу вовремя менять $x и $y в нужном направлении ?

    Интуитивно понимаю что надо добавить пару переменных, а "родить" не могу...

    Всё это выглядит примерно так.

    PHP:
    1. <?php
    2. include "функция.рнр";
    3. $primes = функция();
    4.  
    5. // картинка
    6. $im = imagecreate(100, 100);
    7. $white = imagecolorallocate($im, 255, 255, 255);
    8. $black = imagecolorallocate($im, 0, 0, 0);
    9. /**********/
    10.  
    11. // примерные координаты центра картинки
    12. $x=50;
    13. $y=50;
    14. /**********/
    15.  
    16. // направление "рисования"
    17. $dir = 0;
    18. /**********/
    19.  
    20. for($i=1; $i<=10000; $i++) {
    21.     // бежим по картинке
    22.     if (in_array($i, $primes)) {
    23.         // Если надо рисуем пиксель
    24.         imagesetpixel($im, $x, $y, $black);
    25.     }
    26.     if ($dir == 0) {
    27.         // шаг вправо
    28.         $x++;
    29.     } elseif ($dir == 1) {
    30.         // шаг вверх
    31.         $y--;
    32.     } elseif ($dir == 2) {
    33.         // шаг влево
    34.         $x--;
    35.     } elseif ($dir == 3) {
    36.         // шаг вниз
    37.         $y++;
    38.     }
    39.     // а вот тут то и загвоздка никак
    40.     // не могу придумать как узнать
    41.     // когда делать $dir++
    42. }
    43. /**********/
    44.  
    45. // "конец фильма".
    46. imagepng($im);
    47. /**********/
    48. ?>
    (мозги болят от всей этой математики, а бросать на пол пути не хочется)
     
  2. Amian

    Amian Активный пользователь

    С нами с:
    15 мар 2007
    Сообщения:
    189
    Симпатии:
    0
    За корректость кода не ручаюсь т.к. никогда не занимался "рисованием" но алгоритм примерно такой:

    PHP:
    1. for($i=1; $i<=10000; $i++) {
    2.      // бежим по картинке
    3.      if (in_array($i, $primes)) {
    4.          // Если надо рисуем пиксель
    5.      
    6.          // шаг вправо
    7.         $x= $x+$i+$x*($i-1); //margin
    8.          imagesetpixel($im, $x, $y, $black);
    9.  
    10.          // шаг вверх
    11.         $y= $y-$i-$y*($i-1);  //margin
    12.          imagesetpixel($im, $x, $y, $black);
    13.  
    14.          // шаг влево
    15.         $x= $x-$i-$x*$i; //margin
    16.          imagesetpixel($im, $x, $y, $black);
    17.  
    18.          // шаг вниз
    19.         $y= $y+$i+$x*$i; //margin
    20.          imagesetpixel($im, $x, $y, $black);     
    21.      }
    22.  }
     
  3. Mavir

    Mavir Guest

    Такая закономерность:

    1 шаг, поворот, 1 шаг, поворот
    2 шага, поворот, 2 шага, поворот
    3 шага, поворот, 3 шага, поворот
    4 шага, поворот, 4 шага, поворот
     
  4. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    В звязи со смертью бабушки я не скоро вернусь к написанию этого кода (сначала много возни с похоронами, потом ухожу в запой) но всёже если кто помог реализовать этот код было бы не плохо...

    Рабочих примеров у меня несколько но я считаю их скорее "квадратными велосипедами" (с кучей левых и ненужных циклов) хотелось бы "разработать" не только рабочий но и "красивый" код...