带有折叠和添加线的绘图功能?
draw-function with fold and add-line?
我有一个关于绘制图像的递归函数的问题
是的,这是作业,但我不知道如何绘制该图像。我目前拥有的是:
- 一个函数,从曲线 (
(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-line
和 fold
应用于元组列表。所以我说,让我们把第一个元组(我的两点)应用到函数 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-line
和 fold
编写递归函数 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)
您可能需要调整一两处才能使其正常工作。
我有一个关于绘制图像的递归函数的问题
是的,这是作业,但我不知道如何绘制该图像。我目前拥有的是:
- 一个函数,从曲线 (
(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-line
和 fold
应用于元组列表。所以我说,让我们把第一个元组(我的两点)应用到函数 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-line
和 fold
编写递归函数 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)
您可能需要调整一两处才能使其正常工作。