2013-08-09 4 views
1

enter image description here Если мы хотим нарисовать рекурсивное искусство в схеме, подобной приведенной выше, как мы должны подходить к ней?Как нарисовать рекурсивный шестиугольник в схеме?

Вот черновик, который у меня есть (не совсем работает на данный момент), отредактированный из треугольника sierpinski в схеме.

Спасибо!

(define (hax fn) 
    (repeat 6 (lambda() (fn) (lt 60)))) 

(define (haxa d k) 
    (hax (lambda() 
      (if (= k 1) (fd d) (haxaleg d k))))) 

(define (haxaleg d k) 
    (haxa (/ d 2) (- k 1)) 
    (penup) 
    (fd (* d 1.72)) 
    (lt 120) 
    (pendown)) 
+0

Видя, как вы не можете нарезать шестиугольник на целое число шестиугольников, не можете увидеть, как вы можете найти простое рекурсивное описание, например, sierpinkski –

ответ

3

Как вы, кажется, хотят, чтобы рекурсивно рисовать меньшие шестиугольники на каждом втором повороте вокруг шестиугольника, следующий метод Шоуда работы.

  1. Draw шестиугольник нужного размера, возвращаясь в исходное положение и направление
  2. Задерните меньшие шестиугольники в текущей позиции
  3. Переместить обе стороны вперед, поворачивая после каждого перемещения
  4. Повторите пункт 2 и 3 раза более

В вашем диалекте схеме, то это должно быть

(define (hexagon length) 
    (pendown) 
    (repeat 6 (lambda() 
       (fd length) 
       (lt 60))) 
    (penup)) 

(define (hexagons length levels) 
    (hexagon length) ;; Draw big hexagon 
    (if (> levels 1) 
     (repeat 3 (lambda() 
        (hexagons (/ length 2) (- levels 1)) ;; Then smaller ones, 
        (repeat 2 (lambda()     ;; move to next corner 
          (fd length) 
          (lt 60))))))) 
+0

Спасибо, много Terje! Кстати, у вас было что-то другое раньше? Я помню, в вашем исходном коде ваша шестиугольная функция не имеет лямбда. На моем диалекте моя схема его типа трудно описать процесс –

+0

@IannWu Я не могу вспомнить, отредактировав код. Ярмды в этом коде просто группируют утверждения, которые нужно повторить, например, как «begin» будет использоваться с другой конструкцией итерации. Btw: Если вы вызываете 'pendown' перед вызовом шестиугольников, вы можете опустить вызов' hexagon'. –