Последняя задачка.Написать функцию, рекурсивно рисующую фигуру вида - Lisp
Решение задачи: «Последняя задачка.Написать функцию, рекурсивно рисующую фигуру вида»
textual
Листинг программы
(defun rec-sqr (w n cx cy) (if (zerop n) t (let ((x1 (* 0.5 (+ (nth 0 cx) (nth 1 cx)))) (x2 (* 0.5 (+ (nth 1 cx) (nth 2 cx)))) (x3 (* 0.5 (+ (nth 2 cx) (nth 3 cx)))) (x4 (* 0.5 (+ (nth 3 cx) (nth 0 cx)))) (y1 (* 0.5 (+ (nth 0 cy) (nth 1 cy)))) (y2 (* 0.5 (+ (nth 1 cy) (nth 2 cy)))) (y3 (* 0.5 (+ (nth 2 cy) (nth 3 cy)))) (y4 (* 0.5 (+ (nth 3 cy) (nth 0 cy))))) (grwLine w x1 y1 x2 y2 _RED) (grwLine w x2 y2 x3 y3 _RED) (grwLine w x3 y3 x4 y4 _RED) (grwLine w x4 y4 x1 y1 _RED) (rec-sqr w (- n 1) (list x1 x2 x3 x4) (list y1 y2 y3 y4))))) (defun start nil (let ((w (gensym 'w))) (grwCreate w 300 300 "Квадраты" _WHITE) (grwScale w -100 100 -100 100) (grwShow w) (rec-sqr w 5 '(-80 80 80 -80) '(80 80 -80 -80))))
Объяснение кода листинга программы
Код, представленный пользователем, написан на языке программирования Lisp. Он содержит две функции: rec-sqr и start.
- Функция
rec-sqrпринимает четыре аргумента:w,n,cxиcy.- Аргумент
wпредставляет собой графический контекст, который будет использоваться для рисования. - Аргумент
nявляется счетчиком, который уменьшается на единицу на каждой итерации рекурсии. - Аргументы
cxиcyявляются списками координат вершин квадрата. Если значениеnравно нулю, то выполняется рекурсивный вызов функции с уменьшенным на единицу значениемnи новыми списками координат вершин квадрата. В противном случае, внутри функции создаются новые переменныеx1,x2,x3иx4, которые представляют собой координаты вершин квадрата, вычисленные на основе аргументовcx. Аналогично создаются переменныеy1,y2,y3иy4на основе аргументовcy. Затем вызывается функцияgrwLine, которая рисует линии между вершинами квадрата, используя графический контекстwи цвет _RED.
- Аргумент
- Функция
startявляется точкой входа в программу.- Сначала создается графический контекст
wс размерами 300x300 пикселей. - Затем контекст
wмасштабируется до размеров -100x100 пикселей. - Контекст
wотображается на экране. - Вызывается функция
rec-sqrс аргументамиw,5,(-80 80 80 -80)и'(80 80 -80 -80). Это создает квадрат размером 5, с координатами вершин, указанными в аргументахcxиcyфункцииrec-sqr. Вот список номеров элементов кода, выделенных в тексте:
- Сначала создается графический контекст
- (defun rec-sqr (w n cx cy)
- (defun start nil
- (let ((w (gensym 'w)))
- (grwCreate w 300 300
Квадраты_WHITE) - (grwScale w -100 100 -100 100)
- (grwShow w)
- (rec-sqr w 5 '(-80 80 80 -80) '(80 80 -80 -80)))))