麻省理工学院计划画线

时间:2011-03-28 23:47:01

标签: scheme mit-scheme

有没有人成功使用麻省理工学院计划获得画线?

https://mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-15.html#%_sec_2.2.4

6 个答案:

答案 0 :(得分:5)

关键词是:

  

例如,假设我们有一个程序绘制线,它在屏幕上的两个指定点之间绘制一条线。

换句话说,不是 draw-line - 这纯属假设。

答案 1 :(得分:2)

我使用了 Gerald Sussman 提供的 scmutils。这是他的经典力学课程中使用的数值和代数包,对 plotting graphs 提供低级支持。

假设您已经定义了 make-vectmake-seg

(define line (make-seg (make-vect 2 3) (make-vect 4 1)))

(define win1 (frame -5 5 -5 5))

(define (draw-line frame a b)
  (plot-line frame (xcor a) (ycor a) (xcor b) (ycor b))
)

这是我实现图片语言后得到的

george's square limit

答案 2 :(得分:1)

在该书的那部分(actual MIT Scheme package)中,书的作者为图片语言制作了SICP section 2.2.4。但是,该程序包是在1993年编写的,要在我的Mac OS High Sierra上运行它,我没有任何运气。

但是,其他人专门为本书的该部分制作的最新软件包包括所有功能,包括画线,您实际上可以制作图片并随身玩。下载球拍,然后运行以下命令:

(require (planet "sicp.ss" ("soegaard" "sicp.plt" 2 1)))  

有关更多信息,请参见the user manual for this very awesome package

答案 3 :(得分:0)

我发现这部分书非常令人沮丧。没有画线。只是如果它存在,你应该怎么做。教授编码IMO的可怕方法。学生需要在最后看到具体的东西,无论是跑还是不跑。

答案 4 :(得分:0)

在遵循本书的这一部分时,我决定让draw-line生成可在HTML画布上绘制的JavaScript代码。

(define (draw-line v1 v2)
  (newline)
  (display "ctx.beginPath();")
  (display (string-append "ctx.moveTo(" (number->string (xcor-vect v1)) "," (number->string (ycor-vect v1)) ");"))
  (display (string-append "ctx.lineTo(" (number->string (xcor-vect v2)) "," (number->string (ycor-vect v2)) ");"))
  (display "ctx.stroke();"))

毕竟draw-line的确切实现方式对于使用它的过程并不重要,我们只需要一种可视化结果的方法即可。唯一的缺点是HTML画布坐标是从左上角开始的,而不是从左下角开始的,但是也可以通过调整一点生成的代码来解决。

这是完整的方案代码https://github.com/antivanov/scip-exercises/blob/master/scheme/ch2/2.48.49.scm https://github.com/antivanov/scip-exercises/blob/master/scheme/ch2/2.52.scm

采用相同的方法,我可以看到本章中的其他示例/练习。

答案 5 :(得分:-1)

我为我的一个班级完成了这个画家任务。对于2.47,你真的不需要担心画线。您需要做的就是构建构造函数和选择器:

(define (make-frame origin edge1 edge2)
(list origin edge1 edge2))

(define (origin-frame frame)
(car frame))

(define (edge1-frame frame)
(cadr frame))

(define (edge2-frame frame)
(caddr frame))