-
Notifications
You must be signed in to change notification settings - Fork 0
/
dragon.rkt
62 lines (50 loc) · 1.77 KB
/
dragon.rkt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
;; Énoncé
;; [dragon] Courbe du dragon
;; Écrire une fonction nommée dragon qui dessine la courbe dite du
;; dragon. La courbe se dessine comme suit. On choisit 2 points A et B
;; de coordonnées xa, ya et xb, yb. On détermine le point M tel que le
;; triangle AMB soit isocèle rectangle en M, on dessine la courbe du
;; dragon entre A et M puis entre B et M. les coordonnées de M sont
;; xm, ym définies comme suit:
;; (let ((xm (+ (/ (+ xa xb) 2) (/ (- yb ya) 2)))
;; (ym (- (/ (+ ya yb) 2) (/ (- xb xa) 2))) )
;; ... )
;; Afin d'arrêter la régression infinie on ajoute un paramètre rang
;; tel que lorsqu'il est égal à 1, la courbe se réduit au segment
;; AB. Les appels récursifs à la courbe du dragon s'effectuent en
;; décrémentant le rang. Voici les courbes des dragonneaux de rang 2
;; et 3 puis celle d'un dragon de rang 11:
(require lang/posn)
(require 2htdp/image)
(define (dragon xa ya xb yb n)
(if (= n 0)
(list (list xb yb xa ya))
(let ((xm (+ (/ (+ xa xb) 2) (/ (- yb ya) 2)))
(ym (- (/ (+ ya yb) 2) (/ (- xb xa) 2))) )
(append (dragon xb yb xm ym (- n 1))
(dragon xa ya xm ym (- n 1)))
)))
(define X 200)
(define Y 300)
(define (draw-dragon xa ya xb yb n)
(define (rec s l)
(if (null? l)
s
(let ((p (car l)))
(let ((x-a (first p))
(y-a (second p))
(x-b (third p))
(y-b (fourth p)))
(rec
(scene+line
s
(+ x-a X)
(+ y-a Y)
(+ x-b X)
(+ y-b Y)
"red")
(cdr l))))))
(let ((points (dragon xa ya xb yb n))
(pic (empty-scene 800 800)))
(rec pic points)))
(draw-dragon 0 0 300 300 15)