home *** CD-ROM | disk | FTP | other *** search
-
- ; Examples of turtle graphics procedures.
-
- ; *********************************************************************
- ; turtle ( bit-planes )
- ; Prepare screen, window, and turtle for simple turtle graphics.
-
- if not buriedp "turtle [
- make "turtle [
- procedure [ [ ] [ :d ] ]
- if numberp :d [ ] [ make "d 1 ]
- ( intuition 6 @0 )
- recycle
- make "s1 ( openscreen 3 :d [ turtle ] )
- make "w1 openwindow :s1
- make "t1 openturtle :w1
- setrgb :s1 0 [ 0 0 0 ]
- setrgb :s1 1 [ 14 14 14 ]
- ( intuition 2 @0 0 0 )
- ( intuition 8 @0 550 54 )
- if < 300 peek -2 psum peek 0 :s1 14
- [ ( intuition 1 @0 0 350 ) ]
- [ ( intuition 1 @0 0 150 ) ]
- ( intuition 6 @0 ) ]
- ] [ ]
-
- ; *********************************************************************
- ; starspi
- ; Crazy spirals.
-
- make "starspi [
- procedure [ [ ] [ ] [ :r1 :r2 :a1 :a2 :d :df ] ]
- clean
- home
- setrgb :s1 1 item + 1 random 7 [ [ 15 15 15 ]
- [ 15 0 0 ]
- [ 15 15 0 ]
- [ 0 15 0 ]
- [ 0 15 15 ]
- [ 3 2 15 ]
- [ 15 0 15 ] ]
- make "r1 + 30 random 25
- make "r2 + 3 random 5
- make "a1 * rand 360
- make "a2 * rand 180
- make "d 5
- make "df + 1.05 * 0.25 rand
- repeat :r1 [
- repeat :r2 [
- fd :d
- rt :a2 ]
- make "d * :d :df
- rt :a1 ]
- starspi
- stop ]
-
- ; *********************************************************************
- ; tree size limit factor angle
- ; A simple turtle tree.
- ; tree 50 5 0.5 45
- ; tree 50 2 0.7 90
- ; tree 40 3 0.6 15
-
- make "tree [
- procedure [ [ :size :limit :f :angle ] ]
- if < :size :limit [ fd :size bk :size stop ] [ ]
- fd :size
- rt :angle
- tree * :size :f :limit :f :angle
- lt + :angle :angle
- tree * :size :f :limit :f :angle
- rt :angle
- bk :size ]
-
- ; *********************************************************************
- ; poly size sides
- ; Polygon.
-
- make "poly [
- procedure [ [ :size :sides ] [ ] [ :angle ] ]
- make "angle / 360 :sides
- repeat :sides [ fd :size rt :angle ] ]
-
- ; *********************************************************************
- ; golden-rect size
- ; Golden mean rectangle.
-
- make "golden-rect [
- procedure [ [ :size ] [ ] [ :m1 :m2 ] ]
- make "m1 1.61803398874989
- while [ not = :m1 :m2 ] [
- make "m2 :m1
- make "m1 + / 1 :m1 1 ]
- golden-rect1 :size ]
-
- make "golden-rect1 [
- procedure [ [ :size ] [ ] [ :ms ] ]
- make "ms / :size :m1
- fd :size
- rt 90
- fd :ms
- rt 90
- fd :size
- rt 90
- if < 0.2 :ms [ golden-rect1 :ms stop ] [ ] ]
-
- ; *********************************************************************
- ; s-dragon size limit angle
- ; Size limit dragon.
- ; s-dragon 50 5 45
-
- make "s-dragon [
- procedure [ [ :size :size-limit :angle1 ] [ ] [ :leg1 :leg2 :angle2 ] ]
- make "angle2 - 90 :angle1
- make "leg1 / * 0.5 sin - 180 * 2 :angle1 sin :angle1
- make "leg2 / * 0.5 sin - 180 * 2 :angle2 sin :angle2
- s-dragon1 :size 1 ]
-
- make "s-dragon1 [
- procedure [ [ :size :par ] ]
- if > :size-limit :size [ fd :size stop ] [ ]
- if >0 :par
- [ rt :angle1
- s-dragon1 * :size :leg1 1
- lt 90
- s-dragon1 * :size :leg2 -1
- rt :angle2 ]
- [ lt :angle2
- s-dragon1 * :size :leg2 1
- rt 90
- s-dragon1 * :size :leg1 -1
- lt :angle1 ] ]
-
- ; Lots of dragons.
-
- make "s-dragons [
- procedure [ [ ] [ ] [ :angle :size-limit ] ]
- make "size-limit 80
- while [ make "size-limit / :size-limit 3 > :size-limit 0.5 ] [
- make "angle 0
- while [ make "angle + :angle 5 < :angle 90 ] [
- clean
- home
- pu
- lt 70
- bk 52
- lt 20
- pd
- s-dragon 100 :size-limit :angle ] ] ]
-
- ; *********************************************************************
- ; d-dragon size limit angle
- ; Depth limit dragon
- ; d-dragon 50 5 45
-
- make "d-dragon [
- procedure [ [ :size :depth-limit :angle1 ] [ ] [ :leg1 :leg2 :angle2 ] ]
- make "angle2 - 90 :angle1
- make "leg1 / * 0.5 sin - 180 * 2 :angle1 sin :angle1
- make "leg2 / * 0.5 sin - 180 * 2 :angle2 sin :angle2
- d-dragon1 :size :depth-limit 1 ]
-
- make "d-dragon1 [
- procedure [ [ :size :depth-limit :par ] ]
- if > 1 :depth-limit [ fd :size stop ] [ ]
- make "depth-limit - :depth-limit 1
- if >0 :par
- [ rt :angle1
- d-dragon1 * :size :leg1 :depth-limit 1
- lt 90
- d-dragon1 * :size :leg2 :depth-limit -1
- rt :angle2 ]
- [ lt :angle2
- d-dragon1 * :size :leg2 :depth-limit 1
- rt 90
- d-dragon1 * :size :leg1 :depth-limit -1
- lt :angle1 ] ]
-
- ; Lots of dragons.
-
- make "d-dragons [
- procedure [ [ ] [ ] [ :angle :depth-limit ] ]
- make "depth-limit 3
- while [ make "depth-limit + :depth-limit 3 < :depth-limit 12 ] [
- make "angle 0
- while [ make "angle + :angle 5 < :angle 90 ] [
- clean
- home
- pu
- lt 70
- bk 52
- lt 20
- pd
- d-dragon 100 :depth-limit :angle ] ] ]
-
- ; *********************************************************************
- ; fern size size-limit
- ; A simple fern leaf.
- ; fern 50 0.5
-
- make "fern [
- procedure [ [ :size :limit ] ]
- if > :limit :size [ stop ] [ ]
- fd * 0.18 :size
- rt 4
- fern * 0.82 :size :limit
- rt 58
- fern * 0.3 :size :limit
- lt 122
- fern * 0.3 :size :limit
- rt 60
- bk * 0.18 :size ]
-
- ; *********************************************************************
- ; fern2 size size-limit curl thickness node-spacing branch-angle
- ; A more versatile fern leaf.
- ; fern2 90 3 2 0.2 0.1 60
- ; fern2 90 3 2 0.3 0.18 60
- ; fern2 90 2 4 0.35 0.3 60
-
- make "fern2 [
- procedure [ [ :size :limit :curl :thick :nspace :angle ] [ ]
- [ :d1 :d2 :a1 ] ]
- make "d1 * :size :nspace
- make "d2 * - 1 :nspace :size
- fd :d1
- if > :limit :size
- [ make "a1 atan / :thick - 1 :nspace
- fd :d2
- rt :a1
- bk :d2
- fd :d2
- lt + :a1 :a1
- bk :d2
- fd :d2
- rt :a1
- bk :d2 ]
- [ rt :curl
- fern2 :d2 :limit :curl :thick :nspace :angle
- rt - :angle :curl
- fern2 * :thick :size :limit :curl :thick :nspace :angle
- lt + :angle :angle
- fern2 * :thick :size :limit :curl :thick :nspace :angle
- rt :angle ]
- bk :d1 ]
-
-
-