绘图功能与折叠和添加线?

时间:2015-06-28 18:24:00

标签: recursion scheme draw fold

我对绘制图像的递归函数有疑问

是的,这是一个家庭作业,但我不知道如何绘制该图像。到目前为止我所拥有的是:

  • 一个函数,它给出了曲线((list (x1/y2) (x2/y2)...(xn/yn)
  • 中的点(x / y)列表
  • 例如,要获得x坐标,我必须编写point-x (first lis)
  • 我调用(zipWith f xs ys)的函数,它带有两个列表(xs ys)应用函数f并创建一个列表(例如(zipWith + (list 1 2 3) (list 10 20 30)) -> (list 11 22 33)
  • 一个函数make-tuple,它接受​​两个列表并使它们成为元组(例如:
    (make-tuple (list 1 2 3) (list 4 5 6)) -> (tuple (list 1 2 3) (list 4 5 6))
    要获得第一个元组,我必须写(xs1 (tuple (list 1 2 3) (list 4 5 6)) -> (list 1 2 3)

现在到实际功能:

我们必须使用函数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))))

并知道它说“函数调用:预期在打开括号后的函数,但收到图像”

我再次知道我的错误,add-line绘制了一行,折叠尝试将该图像应用到列表中,但需要一个函数而不是一个图像。所以我的问题是:

如何用renderadd-line编写递归函数fold,绘制第一行,然后得到下一个点并绘制下一行与第一行相结合?
(就像一个递归的add-line函数,在绘制一条线后再次调用自己)

1 个答案:

答案 0 :(得分:1)

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

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

在Racket中,使用fold的方式是:

 (foldl f base l)

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

你需要定义一个函数说f,它使用一个元组在“当前”图像上添加一行:

 ; 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)

您可能需要调整一两件事才能让它发挥作用。