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]
|
|
|
| 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
|
|
|
|
|