Гость
326 сообщений
#14 лет назад
Программку рисования фрактала Дракон Хартера — Хейтуэя надо на лиспе
Вот попытался:
(DEFUN PAINT(X1 Y1 X2 Y2 K)
(SETQ A(LIST X1 Y1))
(SETQ B(LIST X2 Y2))
;(COMMAND "ОТРЕЗОК"A B)
(IF (= k 0)
(PROGN
(COMMAND "ОТРЕЗОК"A B)
exit
)
)
; (DRAGON)

(SETQ S1 (+ X1 X2))
(SETQ S2 (- Y2 Y1))

(SETQ S11 (/ S1 2))
(SETQ S22 (/ S2 2))
(SETQ TX (+ S11 S22))

(SETQ Z1 (+ Y1 Y2))
(SETQ Z2 (- X2 X1))

(SETQ Z11 (/ Z1 2))
(SETQ Z22 (/ Z2 2))
(SETQ TY (- Z11 Z22))
(SETQ KK(- K 1))


(PAINT X2 Y2 TX TY KK)
(PAINT X1 Y1 TX TY KK)

)
(DEFUN DRAGON()
;(setq X1 30 X2 30 Y1 30 Y2 300 K 0)
;(Paint X1 Y1 X2 Y2 K)
(PAINT 100 150 500 150 8)
)


А вот на Delphi в инете нашёл.
Косяк весь с рекурсией, вот exit там есть, в лиспе не сделал, помогите пожалуйста

procedure Dragon(x1,y1,x2,y2,Depth:Longint;canv:TCanvas);
procedure Paint(x1,y1,x2,y2,k:Longint);
var tx,ty:Longint;
begin
if k=0 then
begin
canv.MoveTo(x1,y1);
canv.LineTo(x2,y2);
Exit; <===================== !!!
end;
tx:=(x1+x2) div 2+(y2-y1) div 2;
ty:=(y1+y2) div 2-(x2-x1) div 2;
Paint(x2,y2,tx,ty,k-1);
Paint(x1,y1,tx,ty,k-1);
end;
begin
Paint(x1,y1,x2,y2,Depth);
end;