绘图螺旋形设计

时间:2017-02-22 17:19:48

标签: design-patterns scheme racket

我试图在Racket中绘制螺旋形设计(https://en.wikipedia.org/wiki/Spirograph)。我可以管理以下代码,但它不起作用:

#lang racket

(require 2htdp/image
         2htdp/universe) 

(define img (rectangle 500 500 "solid" "white"))

(let* ((R 300)   ; outer circle radius
       (r 100)   ; inner circle radius
       (c 30)    ; distance of pen-tip from center of inner circle

       (l (/ c r))
       (k (/ r R))
       (imgfn
        (λ (t)
          (set! img (overlay/xy
                     img
                     (* R(+ (* (- 1 k) (cos (modulo t 360)))
                            (* l k (cos (/(* (- 1 k)
                                             (modulo t 360))
                                          k)))))
                     (* R(- (* (- 1 k) (sin (modulo t 360)))
                            (* l k (sin (/(* (- 1 k)
                                             (modulo t 360))
                                          k)))))
                     (circle 2 "solid" "blue")))
          img)))
  (animate imgfn)) 

下图显示了影响设计的距离:

enter image description here

上面的代码显示了点的小圆圈,但它们没有画线,即使我试图重复使用以前的图像。此外,这些点移动速度非常快,而我希望速度有所减慢。只有在此之后,我们才能看到它是否遵循正确的路径。

任何帮助/建议将不胜感激。

编辑:

             (* R(+ (* (- 1 k) (cos (degrees->radians(modulo t 360))))
                    (* l k (cos (degrees->radians(/(* (- 1 k)
                                                      (modulo t 360))
                                                   k))))))
             (* R(- (* (- 1 k) (sin (degrees->radians(modulo t 360))))
                    (* l k (sin (degrees->radians(/(* (- 1 k)
                                                      (modulo t 360))
                                                 k))))))

根据@ScottHunter的建议添加“度 - >弧度”后,输出如下:

enter image description here

预期图像类似于以下内容(也见https://en.wikipedia.org/wiki/Spirograph上的图案):

enter image description here

如何实现这一目标?

1 个答案:

答案 0 :(得分:1)

球拍触发功能预期角度为弧度,而不是度数。

另外,您没有正确使用overly/xy;以下内容使代码(有点)更具可读性,并生成预期图像的更简单版本:

(define image_size 500)
(define image_radius (/ image_size 2))
(define img (rectangle image_size image_size "outline" "black"))

(let* ((R 300)   ; outer circle radius
       (r 100)   ; inner circle radius
       (c 30)    ; distance of pen-tip from center of inner circle

       (l (/ c r))
       (k (/ r R))
       (imgfn
        (λ (t)
          (let* ((rad (degrees->radians (/ (modulo t 360) 1)))
                 (scale (/ (- 1 k) k))
                 (x (* R(+ (* (- 1 k) (cos rad))
                           (* l k (cos (* scale rad))))))
                 (y (* R(- (* (- 1 k) (sin rad))
                           (* l k (sin (* scale rad)))))))
                 (set! img 
                       (overlay/xy img 
                                   (+ (- image_radius 1) x)
                                   (+ (- image_radius 1) y)
                                   (circle 2 "solid" "blue")))
          img))))
  (animate imgfn))