For Programmers: Free Programming Magazines  


Home > Archive > Scheme > March 2006 > Savannah tree









You are viewing an archived Text-only version of the thread. To view this thread in it's original format and/or if you want to reply to this thread please [click here]

 

Author Savannah tree
tux

2006-03-13, 7:00 pm

Hi,
I'm completely stuck on my programming project.I'm trying to draw the
savannah tree but everytime I fail, because the code I wrote somehow
misses all right or left branches completely.Any tips would be great.

(define posn-dist
(lambda (p1 p2)
(sqrt (+ (sqr (- (posn-x p1) (posn-x p2)))
(sqr (- (posn-y p1) (posn-y p2)))))))

(define mid-point
(lambda (p1 p2)
(make-posn (/ (+ (posn-x p1) (posn-x p2)) 2)
(/ (+ (posn-y p1) (posn-y p2)) 2))))

(define start-savannah
(lambda (sp ep angle rl)
(let (
(l (posn-dist sp ep)))
(and
(draw-solid-line sp ep)
(savannah (mid-point sp (mid-point sp ep)) angle (* l rl) rl -)
(savannah (mid-point sp ep) angle (* l rl) rl +)
(savannah (mid-point ep (mid-point sp ep)) angle (* l rl) rl
-)))))

(define savannah
(lambda (sp angle l rl f)
(let (
(ep (custom-circle-pt f angle l sp)))
(cond
((> 5 l) #t)
(else
(and
(draw-solid-line sp ep 'red)
(savannah (mid-point sp (mid-point sp ep)) angle (* l rl) rl -)
(savannah (mid-point sp ep) angle (* l rl) rl +)
(savannah (mid-point ep (mid-point sp ep)) angle (* l rl) rl -))))
)))

(define custom-circle-pt
(lambda (f angle r center)
(make-posn
(f (posn-x center) (* (cos angle) r))
(- (posn-y center) (* (sin angle) r)))))

(and
(start 500 500)
(start-savannah (make-posn 250 300) (make-posn 250 100) (/ (* pi 30)
180) 0.6))

Jens Axel Søgaard

2006-03-14, 7:00 pm

tux wrote:
> Hi,
> I'm completely stuck on my programming project.I'm trying to draw the
> savannah tree but everytime I fail, because the code I wrote somehow
> misses all right or left branches completely.Any tips would be great.


First you need to narrow down what goes wrong. To do that you need
to find the simplest case where things go wrong.

> (define posn-dist
> (lambda (p1 p2)
> (sqrt (+ (sqr (- (posn-x p1) (posn-x p2)))
> (sqr (- (posn-y p1) (posn-y p2)))))))
>
> (define mid-point
> (lambda (p1 p2)
> (make-posn (/ (+ (posn-x p1) (posn-x p2)) 2)
> (/ (+ (posn-y p1) (posn-y p2)) 2))))
>
> (define start-savannah
> (lambda (sp ep angle rl)
> (let (
> (l (posn-dist sp ep)))
> (and
> (draw-solid-line sp ep)
> (savannah (mid-point sp (mid-point sp ep)) angle (* l rl) rl -)
> (savannah (mid-point sp ep) angle (* l rl) rl +)
> (savannah (mid-point ep (mid-point sp ep)) angle (* l rl) rl
> -)))))
>
> (define savannah
> (lambda (sp angle l rl f)
> (let (
> (ep (custom-circle-pt f angle l sp)))
> (cond
> ((> 5 l) #t)
> (else
> (and
> (draw-solid-line sp ep 'red)
> (savannah (mid-point sp (mid-point sp ep)) angle (* l rl) rl -)
> (savannah (mid-point sp ep) angle (* l rl) rl +)
> (savannah (mid-point ep (mid-point sp ep)) angle (* l rl) rl -))))
> )))


Change the 5 to 100 and examine the drawing. Where there too few or
too many branches? Do the branches point in the right direction?

--
Jens Axel Søgaard
Lukas Imstepf

2006-03-15, 9:58 pm

"tux" wrote
> I'm completely stuck on my programming project.I'm trying to draw the
> savannah tree but everytime I fail, because the code I wrote somehow
> misses all right or left branches completely.Any tips would be great.


I didn't look at your code, but perhaps I can help you with this link:
http://non.sense.ch/index.php?id=201&project=savannah

Thats my own solution for rendering some savannah trees (source code
included).

best regards,
Lukas





Sponsored Links







Also available: Server administration forum archive | Web Design forum archive | Software forum archive | Hardware reviews archive

Copyright 2008 codecomments.com