Look I know it's a bit late... but I haven't been
all that well the last two weeks, and I moved house
and stuff...

rebol [
        Title: "Christmas tree AGG"
        File: %Christmas-tree-AGG.r
        Date: 31-Dec-2004
        Version: 1.0.0
        Needs: [View]
        Author: "Anton Rolls"
        Language: 'English
        Purpose: {Display a christmas tree using AGG Draw dialect}
        Usage: {}
        ToDo: {
        - collect all the draw commands in one block and draw all at once
          - can then perform global transforms
        - colour gradients
        - star on top, presents at the bottom :) sparkles, baubles and snow
        }
        History: [
                1.0.0 [31-Dec-2004 {First version} "Anton"]
        ]
        Notes: {}
]

; taken from library/trigonometry.r
angle: func ["calculate angle given x and y - returns positive angles in
degrees"
        x y
        /local a
][
        a: either x = 0 [either y < 0 [270][90]][
                arctangent y / x
        ]
        ; left of centre? arctangent won't be quite right then.
        if x < 0 [a: a + 180]
        ; this should fix "quirkiness"
        return (a + 720) // 360
]

draw-branch: func [
        image [image!]
        start [pair!]
        grow [pair!]
        n [integer!]
        /locals base left right top colour fill-colour ang dang dist curve 
rcurve
code
][
        if n > 0 [
                ;print [n start]
                base: (-1x1 * reverse grow) * 0.05 ; 5% perpendicular of growth 
direction
                left: start - base
                right: start + base
                top: start + grow

                colour: green
                fill-colour: leaf

                draw image [
                        line-width 1 pen colour fill-pen fill-colour
                        polygon left right top
                ]

                ; recurse

                ;left: 1x-1 * reverse grow  ; simple 90 degree turn
                ;right: -1x1 * reverse grow ; simple 90 degree turn

                ; arbitrary angle turns
                ang: angle grow/x grow/y
                ;dist2: grow * grow
                ;dist: square-root dist2/x + dist2/y
                dist: square-root ((grow/x * grow/x) + (grow/y * grow/y))

                code: copy []
                repeat i 9 [

                        dang: i + 1 * -2 + 90
                        left:  as-pair dist * cosine (ang + dang) dist * sine 
(ang + dang)
                        right: as-pair dist * cosine (ang - dang) dist * sine 
(ang - dang)

                        curve: square-root (i * 0.1)
                        rcurve: (1 - square-root (i * 0.1)) * 0.7

                        append code reduce [
                                'draw-branch image (grow * curve + start) (left 
* rcurve) (n - 1)
                                'draw-branch image (grow * curve + start) 
(right * rcurve) (n - 1)
                        ]
                ]
                do code
        ]
]

img: make image! 400x400
draw-branch img 200x370 0x-360 3

view center-face layout [image img]

-- 
To unsubscribe from the list, just send an email to rebol-request
at rebol.com with unsubscribe as the subject.

Reply via email to