canvas.gauche-tk.scm 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. (define-record-type <canvas>
  2. (make-canvas params)
  3. canvas?
  4. (params get-params))
  5. (define current-canvas (make-canvas '()))
  6. (define (set-canvas! new-canvas)
  7. (set! current-canvas new-canvas))
  8. (define (canvas-image-rotate x y theta1 delta-theta)
  9. (define sign (if (negative? delta-theta) - +))
  10. (let loop ((current-theta 0))
  11. (when (< current-theta (abs delta-theta))
  12. (redraw-turtle x y (sign theta1 current-theta) 24)
  13. (let ((p (run-process "sleep" (* sleep-period 3))))
  14. (process-wait p))
  15. (loop (+ current-theta 14))))
  16. (redraw-turtle x y (+ theta1 delta-theta) 24))
  17. (define sleep-period 0.01)
  18. (define (canvas-bg-color color)
  19. (if (memq color valid-colors)
  20. (tk-call '.canvas
  21. 'configure
  22. '-bg
  23. color)
  24. (error "bg-color" "Not a valid color")))
  25. (define (clear-screen)
  26. (tk-call '.canvas 'delete "all"))
  27. (define (canvas-line-color color)
  28. (if (memq color valid-colors)
  29. (set! current-line-color color)
  30. (error "bg-color" "Not a valid color")))
  31. (define current-line-width 1)
  32. (define (canvas-line-width width)
  33. (set! current-line-width width))
  34. (define current-line-color 'white)
  35. (define valid-colors
  36. '(white black red yellow green cyan blue magenta
  37. grey darkred darkgreen darkblue violet))
  38. (define (draw-turtle-line x1 y1 x2 y2 pen-down shown)
  39. (define dist (sqrt (+ (square (- x2 x1))
  40. (square (- y2 y1)))))
  41. (define xtrav (if (= x1 x2)
  42. 0
  43. (/ (- x2 x1) dist 0.32)))
  44. (define ytrav (if (= y1 y2)
  45. 0
  46. (/ (- y2 y1) dist 0.32)))
  47. (define dtrav (sqrt (+ (square xtrav)
  48. (square ytrav))))
  49. (define theta (* (/ 180 3.1415926)
  50. (if (negative? (- x2 x1))
  51. (- (atan (/ (- y2 y1) (- x2 x1))) 3.1415)
  52. (atan (/ (- y2 y1) (- x2 x1))))))
  53. (when (> dist 1e-10)
  54. (if shown
  55. (redraw-turtle x1 y1 theta 24)
  56. (tk-call '.canvas 'delete 'turtle))
  57. (cond
  58. (shown
  59. (let loop ((curd 0)
  60. (curx x1)
  61. (cury y1))
  62. (when (< curd dist)
  63. (let ((p (run-process "sleep" sleep-period)))
  64. (process-wait p))
  65. (tk-call '.canvas 'move 'turtle xtrav (- ytrav))
  66. (if pen-down
  67. (draw-line curx cury (+ curx xtrav) (+ cury ytrav)))
  68. (loop (+ curd dtrav) (+ curx xtrav) (+ cury ytrav)))))
  69. (pen-down
  70. (draw-line x1 y1 x2 y2))
  71. (else ; Otherwise do nothing
  72. #f))))
  73. (define (draw-line x1 y1 x2 y2)
  74. (tk-call '.canvas
  75. 'create
  76. 'line
  77. (+ 300 x1)
  78. (- 300 y1)
  79. (+ 300 x2)
  80. (- 300 y2)
  81. '-fill
  82. current-line-color
  83. '-width
  84. current-line-width))
  85. (define (redraw-turtle x y-neg theta-deg turtle-size)
  86. (define y (- y-neg))
  87. (define theta (- (* theta-deg (/ 3.141592653589792 180))))
  88. (define (draw-circle x y size tags)
  89. (tk-call '.canvas
  90. 'create
  91. 'oval
  92. (- x -300 (/ size 2.0))
  93. (- y -300 (/ size 2.0))
  94. (+ x 300 (/ size 2.0))
  95. (+ y 300 (/ size 2.0))
  96. '-tags
  97. tags
  98. '-fill
  99. current-line-color))
  100. ; Delete any previous turtles
  101. (tk-call '.canvas 'delete 'turtle)
  102. ; Create the body
  103. (draw-circle x y turtle-size "turtle")
  104. ; Create the head
  105. (draw-circle (+ x (* 0.75 turtle-size (cos theta)))
  106. (+ y (* 0.75 turtle-size (sin theta)))
  107. (/ turtle-size 2)
  108. "turtle")
  109. ; Create the front legs
  110. (draw-circle (+ x (* 0.625 turtle-size (cos (+ theta 0.785))))
  111. (+ y (* 0.625 turtle-size (sin (+ theta 0.785))))
  112. (/ turtle-size 4)
  113. "turtle")
  114. (draw-circle (+ x (* 0.625 turtle-size (cos (- theta 0.785))))
  115. (+ y (* 0.625 turtle-size (sin (- theta 0.785))))
  116. (/ turtle-size 4)
  117. "turtle")
  118. ; Create the rear legs
  119. (draw-circle (+ x (* 0.625 turtle-size (cos (+ theta 2.356))))
  120. (+ y (* 0.625 turtle-size (sin (+ theta 2.356))))
  121. (/ turtle-size 4)
  122. "turtle")
  123. (draw-circle (+ x (* 0.625 turtle-size (cos (- theta 2.356))))
  124. (+ y (* 0.625 turtle-size (sin (- theta 2.356))))
  125. (/ turtle-size 4)
  126. "turtle"))
  127. (define canvas-show-turtle #f)
  128. (define canvas-hide-turtle #f)
  129. (tk-init '())
  130. (tk-wm 'title "." "turtle")
  131. (tk-grid (tk-canvas '.canvas '-width 600 '-height 600 '-bg 'black))