Mandelbrot set

Mandelbrot draws a mandelbrot set in little window. Mandelbrot 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 Mandelbrot running is to go to examples directory in package root, and run:

$ ./build.sh gui_mandelbrot

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.

Screenshots

Mandelbrot set

Preview

;
; @ANO_SCRIPT_NAME		gui_mandelbrot
; @ANO_SCRIPT_VERSION		0.0.4
; @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-2024, Jani Salonen <salojan@goto10.co>
; All rights reserved.
;

main {
	; Global uninitialized variables
	var	[handle] handle_window_main

	; Global pre-initialized variables
	mov	win_w ([uint] 640)
	mov	win_h ([uint] 400)

	; Initialize windowing system
	window_init

	; Open main window
	window_open (\
		title_name:		"Mandelbrot", \
		title_charset:		NULL, \
		parent_handle:		[handle] @0, \
		widget_stack_id:	[uint] 0, \
		widget_set:		[uint] 0, \
		window_refresh_divider:	[uint] 1, \
		position_x:		[int] -1, \
		position_y:		[int] -1, \
		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_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")
}

callback cb_open (_hnd) {
	mov	handle_window_main (_hnd)

	; Map main window
	window_map (handle_window_main)

	; Create drawing thread
	thread_spawn ("Mandelbrot thread", "mandelbrot_thread")
}

callback cb_destroy {
	window_close (handle_window_main)

	exit
}

thread mandelbrot_thread {
	&mandelbrot_draw (1.0, [uint] 120, [int] 0, [int] 0)
}

function mandelbrot_draw (_zoom, _maxiterations, _posx, _posy) {
	var	[color] _c

	loop (mov _y (0); _y < win_h; inc _y) {
		loop (mov _x (0); _x < win_w; inc _x) {
			mov	_pr (1.5 * (_x - win_w / 2.0) / (0.5 * _zoom * win_w) + _posx)
			mov	_pi ((_y - win_h / 2.0) / (0.5 * _zoom * win_h) + _posy)

			mov	_ne (0)
			mov	_nf (0)

			mov	_i ([int] 0)

		mandelbrot_loop_c:
			mov	_oe (_ne)
			mov	_of (_nf)

			mov	_ne (_oe * _oe - _of * _of + _pr)
			mov	_nf (2.0 * _oe * _of + _pi)

			mov	_t (_ne * _ne + _nf * _nf)

			if _t >= 4 : mandelbrot_loop_d

			inc	_i

			if _i < _maxiterations : mandelbrot_loop_c

		mandelbrot_loop_d:
			; Plot the pixel adjusting colors a bit
			mov	_c (# 0)
			add	_c.red (_i)
			add	_c.green (_i * 2.0)

			draw_pixel (handle_window_main, _x, _y, _c)
		}
	}
}

Copyright © 2024, Jani Salonen <salojan at goto10 piste co>. Piste is finnish word and means dot. All rights reserved.