Julia set
Julia draws a julia set in little window. Julia demonstrates how to spawn a thread for drawing and do some RPN expressions to plot the pixels to window. Written in plain Ano script, no C involved.
Compilation
Easiest way to get Julia running is to go to examples directory in package root, and run:
$ ./build.sh gui_julia
build.sh script compiles Ano script to C, copies source files in place and pops up instructions what to do next. Follow them. Check also examples/README for more info.
Preview
;
; @ANO_SCRIPT_NAME gui_julia
; @ANO_SCRIPT_VERSION 0.0.6
; @ANO_SCRIPT_DESCRIPTION Example how to plot some pixels to window
;
; @ANO_FLAGS_VAR_NAME_SUBS [x]
; @ANO_FLAGS_VAR_WARN_UNUSED [ ]
;
; Copyright (c) 2016-2025, Jani Salonen <salojan@goto10.co>
; All rights reserved.
;
main {
; Global uninitialized variables
;
var [handle] hnd_win
; Global pre-initialized variables
;
mov win_w ([uint] 640)
mov win_h ([uint] 400)
; Initialize windowing system...
;
gui_enabled {
window_init
; ...and open main window
;
window_open (\
title_name: "Julia", \
title_charset: NULL, \
parent_handle: NOPARENT, \
widget_stack_id: NOWIDGET, \
widget_set: NOWIDGET, \
window_refresh_divider: ACTIVE_REFRESH, \
position_x: POS_CENTERED, \
position_y: POS_CENTERED, \
size_width: win_w, \
size_height: win_h, \
cb_main_loop: NULL, \
cb_expose: NULL, \
cb_key_press: NULL, \
cb_key_release: NULL, \
cb_button_press: NULL, \
cb_button_release: NULL, \
cb_client_message: NULL, \
cb_save_yourself: NULL, \
cb_configure_notify: NULL, \
cb_destroy_notify: "cb_destroy", \
cb_motion_notify: NULL, \
cb_map_notify: NULL, \
cb_unmap_notify: NULL, \
cb_open_notify: "cb_open")
}
}
_WINCB_OPEN_ callback cb_open (_hnd) {
mov hnd_win (_hnd)
; Map main window
;
_hnd.map()
; Create drawing thread
;
@julia_thread ("Julia")
}
_WINCB_DESTROY_ callback cb_destroy (_hnd) {
_hnd.destroy()
exit
}
thread julia_thread {
&julia_draw (1.0, [int] 120, [int] 0, [int] 0)
}
function julia_draw (_zoom, _maxiterations, _posx, _posy) {
var [color] _c
mov _ce (-0.7)
mov _cm (0.27015)
loop (mov _y (0); _y < win_h; inc _y) {
loop (mov _x (0); _x < win_w; inc _x) {
mov _ne (1.5 * (_x - win_w / 2.0) / (0.5 * _zoom * win_w) + _posx)
mov _nf ((_y - win_h / 2.0) / (0.5 * _zoom * win_h) + _posy)
mov _i ([int] 0)
julia_loop_c:
mov _oe (_ne)
mov _of (_nf)
mov _ne (_oe * _oe - _of * _of + _ce)
mov _nf (2.0 * _oe * _of + _cm)
mov _t (_ne * _ne + _nf * _nf)
if _t >= 4 : julia_loop_d
inc _i
if _i < _maxiterations : julia_loop_c
julia_loop_d:
; Plot the pixel adjusting colors a bit
;
mov _c (# 0)
add _c.red (_i)
add _c.green (_i * 2.0)
hnd_win.pixel(\
position_x: _x, \
position_y: _y, \
color: _c)
}
}
}
Screenshots
Click to enlarge.
Copyright © 2025, Jani Salonen <salojan at goto10 piste co>. Piste is finnish word and means dot. All rights reserved.
