функция рисования со сгибом и надстройкой?

63
6

У меня вопрос о рекурсивной функции для рисования изображения

Да, это домашнее задание, но я не знаю, как нарисовать этот образ. Что я до сих пор:

    Функция, которая дает мне список точек (x/y) из кривой ((list (x1/y2) (x2/y2)...(xn/yn)) Чтобы получить 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))))

и знаю, что он говорит: "вызов функции: ожидаемая функция после открытой скобки, но полученная изображение"

И снова я знаю свою ошибку, add-line рисует одну строку, а фолд пытается применить это изображение к списку, но ему нужна функция, а не изображение. Поэтому мой вопрос:

Как я могу написать рекурсивную функцию render с помощью add-line и fold, которая рисует первую строку, затем получает следующие точки и рисует следующую строку в сочетании с первой?
(например, рекурсивная функция add-line, которая снова вызывает себя после рисования строки)

спросил(а) 2021-01-25T16:10:25+03:00 4 месяца, 3 недели назад
1
Решение
62

Вы не говорите конкретно, какой язык вы используете, но это выглядит подозрительно:

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

В Racket способ использования fold:

 (foldl f base l)

Здесь f - функция. В вашем коде у вас есть empty-image.

Вам нужно определить определение функции say 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)

Возможно, вам придется подстроить что-нибудь, чтобы заставить его работать.

ответил(а) 2021-01-25T16:10:25+03:00 4 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема