Kuin Advent Calendar 2016 - 10日目

この記事は【Kuin Advent Calendar 2016】の10日目の記事です。

←前の日の記事   →次の日の記事

【記事中で紹介しているコードについて】
コンパイルが通らない場合など、不具合があれば、@tatt61880まで連絡いただけると助かります。よろしくお願いいたします。


マンデルブロー集合を表示するKuinのコードです。
[Image:mandelbrot.kn.png]
mandelbrot.kn
func main()
	const realMin: float :: -2.0
	const realMax: float :: 1.0
	const realDel: float :: (realMax - realMin) / sizeX $ float
	const imagMin: float :: -1.2
	const imagMax: float :: 1.2
	const imagDel: float :: (imagMax - imagMin) / sizeY $ float
	const calcNum: int :: 1000

	const sizeX: int :: 300
	const sizeY: int :: (sizeX $ float * (imagMax - imagMin) / (realMax - realMin)) $ int
	const margin: int :: 5
	const wndSizeX: int :: sizeX + 2 * margin
	const wndSizeY: int :: sizeY + 2 * margin

	var zr: float
	var zi: float
	var znr: float
	var zni: float
	var cr: float
	var ci: float
	var num: int

	var colors: [][]float :: #[sizeY, sizeX]float
	for row(0, sizeY - 1)
		do ci :: imagMin + imagDel * row $ float
		for col(0, sizeX - 1)
			do cr :: realMin + realDel * col $ float
			do zr :: 0.0
			do zi :: 0.0
			for i(1, calcNum)
				do num :: i
				do znr :: zr * zr - zi * zi + cr
				if(znr > 4.0)
					break i
				end if
				do zni :: 2.0 * zr * zi + ci
				if(zni > 4.0)
					break i
				end if
				do zr :: znr
				do zi :: zni
			end for
			do colors[row][col] :: num $ float / calcNum $ float
		end for
	end for

	var wndMain: wnd@Wnd :: wnd@makeWnd(null, %aspect, wndSizeX, wndSizeY, "Mandelbrot set")
	var drawMain: wnd@Draw :: wnd@makeDraw(wndMain, 0, 0, wndSizeX, wndSizeY, %scale, %scale, false)
	while(wnd@act())
		do draw@rect(0.0, 0.0, wndSizeX $ float, wndSizeY $ float, 0xFF6188FF)
		for row(0, sizeY - 1)
			for col(0, sizeX - 1)
				var c: int :: (colors[sizeY - 1 - row][col] * 255.0) $ int
				do draw@rect((col + margin) $ float, (row + margin) $ float, 1.0, 1.0, 0xFF000000 + c * 0x10101)
			end for
		end for
		do draw@render(30)
	end while
end func


←前の日の記事   →次の日の記事