simple lindenmayer systems
Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

76 rindas
2.1KB

  1. #lang racket
  2. (require graphics/value-turtles)
  3. (require file/convertible)
  4. (define start '(X))
  5. (define forward 4)
  6. (define theta 20)
  7. (define generations 7)
  8. (define thick 8)
  9. (define (tend sym)
  10. (cond
  11. [(eq? sym 'F) '(F F)]
  12. [(eq? sym 'X) '(d F m l l X r p X r p F l p F X r m X)]
  13. [else `(,sym)]))
  14. (define (season plant)
  15. (foldr append '()
  16. (map tend plant)))
  17. (define (grow seed years)
  18. (if (<= years 0)
  19. seed
  20. (grow (season seed) (- years 1))))
  21. (define init-turtle
  22. (set-pen-width (turtles 600 800 300 400 (/ pi -2))
  23. thick))
  24. (define state '())
  25. (define (step-turtle op turtle)
  26. (cond
  27. [(eq? op 'F) (draw forward turtle)]
  28. [(eq? op 'm) (turn theta turtle)]
  29. [(eq? op 'p) (turn (* -1 theta) turtle)]
  30. [(eq? op 'u) (set-pen-width turtle
  31. (+ 1 (turtles-pen-width turtle)))]
  32. [(eq? op 'd) (set-pen-width turtle
  33. (- (turtles-pen-width turtle) 1))]
  34. [(eq? op 'l) (begin (set! state
  35. (cons (turtle-state turtle)
  36. state))
  37. (set! thick
  38. (cons (turtles-pen-width turtle)
  39. thick))
  40. turtle)]
  41. [(eq? op 'r) (let ([s (car state)]
  42. [t (car thick)])
  43. (begin
  44. (set! state (cdr state))
  45. (set! thick (cdr thick))
  46. (set-pen-width
  47. (restore-turtle-state turtle s)
  48. t)))]
  49. [else turtle]))
  50. (define (run-turtle plant turtle)
  51. (if (null? plant)
  52. turtle
  53. (run-turtle (cdr plant)
  54. (step-turtle (car plant) turtle))))
  55. (define (write-plant turtle filename)
  56. (let ([file (open-output-file filename #:exists 'replace)]
  57. [pict (convert (turtles-pict turtle) 'png-bytes)])
  58. (write-bytes pict file)))
  59. (define (test-plant)
  60. (let ([plant (grow start generations)])
  61. (begin (set! state '())
  62. (write-plant (run-turtle plant init-turtle)
  63. "test-plant.png"))))
  64. (test-plant)