带有折叠和添加线的绘图功能?

draw-function with fold and add-line?

我有一个关于绘制图像的递归函数的问题

是的,这是作业,但我不知道如何绘制该图像。我目前拥有的是:

现在进入实际功能:

我们必须使用函数 add-line 从一点到另一点画一条线。
参数为image number number number number string
换句话说:empty-image x1 y1 x2 y2 "black"
所以它以 empty-image 开始,并绘制一条从 (x1/y1)(x2/y2) 的线,颜色为 "black"

而我们必须使用fold来编写函数。所以我对此的尝试:

;Signature
(: render ((list-of point) -> image))

(define render
  (lambda (xs)
    (let((tuple-list (zipWith make-tuple xs (rest xs))))
      (fold empty-image
            add-line
            tuple-list))))

我试图做的是获取点列表并制作一个包含点元组的列表
(list (tuple (x1/y1) (x2/y2)) (tuple (x2/y2) (x3/y3))...(tuple (xn/yn) (xn/yn)))
现在我想将 add-linefold 应用于元组列表。所以我说,让我们把第一个元组(我的两点)应用到函数 add-line。然后取下一个元组并将这些点应用于 add-line 函数(依此类推)直到我的列表为空。

现在的问题是,Scheme 说 add-line 需要 6 个参数,但只找到 2。我知道我的问题,因为 add-line 不知道从哪里获得其他参数。所以我尝试了:

(define render
  (lambda (xs)
    (let((tuple-list (zipWith make-tuple xs (rest xs))))
      (fold empty-image (add-line 
                         empty-image
                         (point-x (xs1 (first tuple-list)))
                         (point-y (xs1 (first tuple-list)))
                         (point-x (xs2 (first tuple-list)))
                         (point-y (xs2 (first tuple-list)))
                         "black")
            tuple-list))))

知道它说 "function call: expected a function after the open parenthesis, but received an image"

我又一次知道我的错误,add-line 画了一条线,fold 试图将该图像应用于列表,但需要一个函数而不是图像。所以我的问题:

我如何使用 add-linefold 编写递归函数 render,绘制第一条线,然后获取下一个点并绘制下一条线与第一条线相结合一个?
(就像一个递归的 add-line 函数,在画一条线后再次调用自己)

你没有具体说明你使用的是哪种语言, 但这看起来很可疑:

 (fold empty-image (add-line ...))

在Racket中使用fold的方式是:

 (foldl f base l)

这里f是一个函数。在你的代码中你有 empty-image.

您需要定义一个函数,比如 f,它使用元组在 "current" 图像上添加一行:

 ; f : tuple image -> image
 (define (f t img)
     (add-line img
               (point-x (xs1 t))
               (point-y (xs1 t))
               (point-x (xs2 t))
               (point-y (xs2 t))
               "black"))

然后

(foldl f empty-image tuple-list)

您可能需要调整一两处才能使其正常工作。