我试图在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))
下图显示了影响设计的距离:
上面的代码显示了点的小圆圈,但它们没有画线,即使我试图重复使用以前的图像。此外,这些点移动速度非常快,而我希望速度有所减慢。只有在此之后,我们才能看到它是否遵循正确的路径。
任何帮助/建议将不胜感激。
(* 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的建议添加“度 - >弧度”后,输出如下:
预期图像类似于以下内容(也见https://en.wikipedia.org/wiki/Spirograph上的图案):
如何实现这一目标?
答案 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))