-- -- demo\rosetta\FractalTree.exw -- include pGUI.e Ihandle dlg, canvas cdCanvas cddbuffer, cdcanvas procedure drawTree(integer level, atom angle, atom len, integer x, integer y) integer xn = x + floor(len*cos(angle)) integer yn = y + floor(len*sin(angle)) integer red = 255-level*8 integer grn = level*12+100 cdCanvasSetForeground(cddbuffer, red*#10000 + grn*#100) cdCanvasLineWidth(cddbuffer,floor(5-level/3)) cdCanvasLine(cddbuffer, x, 480-y, xn, 480-yn) if level<12 then drawTree(level+1, angle-0.4, len*0.8, xn, yn) --left drawTree(level+1, angle+0.1, len*0.8, xn, yn) --right end if end procedure function redraw_cb(Ihandle /*ih*/, integer /*posx*/, integer /*posy*/) cdCanvasActivate(cddbuffer) cdCanvasClear(cddbuffer) drawTree(0, -PI/2.0, 80.0, 360, 460) cdCanvasFlush(cddbuffer) return IUP_DEFAULT end function function map_cb(Ihandle ih) cdcanvas = cdCreateCanvas(CD_IUP, ih) cddbuffer = cdCreateCanvas(CD_DBUFFER, cdcanvas) cdCanvasSetBackground(cddbuffer, CD_PARCHMENT) return IUP_DEFAULT end function function esc_close(Ihandle /*ih*/, atom c) if c=K_ESC then return IUP_CLOSE end if return IUP_CONTINUE end function procedure main() IupOpen() canvas = IupCanvas(NULL) IupSetAttribute(canvas, "RASTERSIZE", "640x480") IupSetCallback(canvas, "MAP_CB", Icallback("map_cb")) IupSetCallback(canvas, "ACTION", Icallback("redraw_cb")) dlg = IupDialog(canvas,"RESIZE=NO") IupSetAttribute(dlg, "TITLE", "Fractal Tree") IupSetCallback(dlg, "K_ANY", Icallback("esc_close")) IupShow(dlg) IupMainLoop() IupClose() end procedure main()