{"id":1044,"date":"2016-05-06T15:11:47","date_gmt":"2016-05-06T13:11:47","guid":{"rendered":"https:\/\/esimov.com\/blog\/?p=1044"},"modified":"2019-04-29T13:02:14","modified_gmt":"2019-04-29T11:02:14","slug":"ascii-mandelbrot-renderer-in-go","status":"publish","type":"post","link":"https:\/\/esimov.com\/blog\/2016\/05\/06\/ascii-mandelbrot-renderer-in-go\/","title":{"rendered":"ASCII terminal mandelbrot fractal renderer in Go"},"content":{"rendered":"<p>After the previous post about the mandelbrot renderer written in Go, this article will be related to the same topic, only this time i&#8217;ll talk about a terminal based Julia set generator written again in Go language. In fact i&#8217;ve done this experiment prior to write the mandelbrot renderer. About the implementation I&#8217;ve discussed in the <a href=\"https:\/\/esimov.com\/2016\/04\/mandelbrot-renderer-in-go\">last article<\/a>.<\/p>\n<p>The whole idea came from the motivation to create something which resembles the feeling which only a terminal based application can create (something which is close enough to the pixelart technique), but at the same time it has enough visually appealing characteristics and above all it&#8217;s dynamic.<\/p>\n<h2>Into the terminal fractals<\/h2>\n<p><video controls=\"\" autostart=\"false\" name=\"media\" class=\"aligncenter\" width=640><source src=\"https:\/\/esimov.com\/blog\/wp-content\/uploads\/2016\/05\/VUWSHNaShHbISSwG.mp4\" type=\"video\/mp4\"><\/video><\/p>\n<p style=\"text-align: center;\">(<em>In preview the ASCII Mandelbrot generator running in terminal<\/em>)<\/p>\n<p>Because in the last few months i was pretty much delved into the fractals, i&#8217;ve started to create some small experiments, one of them being the code snippet below:<\/p>\n<p><a href=\"https:\/\/gist.github.com\/esimov\/970a3816dda12e4059e3.js\">https:\/\/gist.github.com\/esimov\/970a3816dda12e4059e3.js<\/a><\/p>\n<p>Which produce the following terminal output:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/esimov.com\/blog\/wp-content\/uploads\/2016\/05\/mandelbrot.jpg\" alt=\"mandelbrot\" width=\"620\" class=\"aligncenter size-full wp-image-1080\" srcset=\"https:\/\/esimov.com\/blog\/wp-content\/uploads\/2016\/05\/mandelbrot.jpg 956w, https:\/\/esimov.com\/blog\/wp-content\/uploads\/2016\/05\/mandelbrot-150x150.jpg 150w, https:\/\/esimov.com\/blog\/wp-content\/uploads\/2016\/05\/mandelbrot-298x300.jpg 298w, https:\/\/esimov.com\/blog\/wp-content\/uploads\/2016\/05\/mandelbrot-768x774.jpg 768w, https:\/\/esimov.com\/blog\/wp-content\/uploads\/2016\/05\/mandelbrot-650x655.jpg 650w\" sizes=\"(max-width: 956px) 100vw, 956px\" \/><\/p>\n<p>This was nice but i wanted to be dynamic, and not something simply put in the terminal window. So i&#8217;ve started to search for methods to refresh the terminal window periodically, ideally to refresh on each mandelbrot iteration. For this reason i&#8217;ve created some utility methods to get the terminal window width and height. And another method to flush the screen buffer periodically.<\/p>\n<pre class=\"language-go\"><code class=\"language-go\">\r\n<span class=\"token comment\" spellcheck=\"true\">\/\/ Get console width<\/span>\r\n<span class=\"token keyword\">func<\/span> <span class=\"token function\">Width<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token builtin\">int<\/span> <span class=\"token punctuation\">{<\/span>\r\n\tws<span class=\"token punctuation\">,<\/span> err <span class=\"token operator\">:=<\/span> <span class=\"token function\">getWinsize<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>\r\n\r\n\t<span class=\"token keyword\">if<\/span> err <span class=\"token operator\">!=<\/span> <span class=\"token boolean\">nil<\/span> <span class=\"token punctuation\">{<\/span>\r\n\t\t<span class=\"token keyword\">return<\/span> <span class=\"token operator\">-<\/span><span class=\"token number\">1<\/span>\r\n\t<span class=\"token punctuation\">}<\/span>\r\n\r\n\t<span class=\"token keyword\">return<\/span> <span class=\"token function\">int<\/span><span class=\"token punctuation\">(<\/span>ws<span class=\"token punctuation\">.<\/span>Row<span class=\"token punctuation\">)<\/span>\r\n<span class=\"token punctuation\">}<\/span>\r\n\r\n<span class=\"token comment\" spellcheck=\"true\">\/\/ Get console height<\/span>\r\n<span class=\"token keyword\">func<\/span> <span class=\"token function\">Height<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token builtin\">int<\/span> <span class=\"token punctuation\">{<\/span>\r\n\tws<span class=\"token punctuation\">,<\/span> err <span class=\"token operator\">:=<\/span> <span class=\"token function\">getWinsize<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>\r\n\t<span class=\"token keyword\">if<\/span> err <span class=\"token operator\">!=<\/span> <span class=\"token boolean\">nil<\/span> <span class=\"token punctuation\">{<\/span>\r\n\t\t<span class=\"token keyword\">return<\/span> <span class=\"token operator\">-<\/span><span class=\"token number\">1<\/span>\r\n\t<span class=\"token punctuation\">}<\/span>\r\n\t<span class=\"token keyword\">return<\/span> <span class=\"token function\">int<\/span><span class=\"token punctuation\">(<\/span>ws<span class=\"token punctuation\">.<\/span>Col<span class=\"token punctuation\">)<\/span>\r\n<span class=\"token punctuation\">}<\/span>\r\n\r\n<span class=\"token comment\" spellcheck=\"true\">\/\/ Flush buffer and ensure that it will not overflow screen<\/span>\r\n<span class=\"token keyword\">func<\/span> <span class=\"token function\">Flush<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span>\r\n\t<span class=\"token keyword\">for<\/span> idx<span class=\"token punctuation\">,<\/span> str <span class=\"token operator\">:=<\/span> <span class=\"token keyword\">range<\/span> strings<span class=\"token punctuation\">.<\/span><span class=\"token function\">Split<\/span><span class=\"token punctuation\">(<\/span>Screen<span class=\"token punctuation\">.<\/span><span class=\"token function\">String<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">\"\\n\"<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span>\r\n\t\t<span class=\"token keyword\">if<\/span> idx <span class=\"token operator\">&gt;<\/span> <span class=\"token function\">Height<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span>\r\n\t\t\t<span class=\"token keyword\">return<\/span>\r\n\t\t<span class=\"token punctuation\">}<\/span>\r\n\r\n\t\toutput<span class=\"token punctuation\">.<\/span><span class=\"token function\">WriteString<\/span><span class=\"token punctuation\">(<\/span>str <span class=\"token operator\">+<\/span> <span class=\"token string\">\"\\n\"<\/span><span class=\"token punctuation\">)<\/span>\r\n\t<span class=\"token punctuation\">}<\/span>\r\n\r\n\toutput<span class=\"token punctuation\">.<\/span><span class=\"token function\">Flush<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>\r\n\tScreen<span class=\"token punctuation\">.<\/span><span class=\"token function\">Reset<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>\r\n<span class=\"token punctuation\">}<\/span>\r\n<\/code><\/pre>\n<p>It was missing another ingredient: in terminal based application we need somehow to specify the cursor position where to output the desired character, some kind of pointer to a position specified by width and height coordinate. For this i&#8217;ve created another method which move the cursor to the desired place, defined by <kbd>x<\/kbd> and <kbd>y<\/kbd>:<\/p>\n<pre class=\"language-go\"><code class=\"language-go\"><span class=\"token comment\" spellcheck=\"true\">\/\/ Move cursor to given position<\/span>\r\nfunc <span class=\"token function\">MoveCursor<\/span><span class=\"token punctuation\">(<\/span>x int<span class=\"token punctuation\">,<\/span> y int<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span>\r\n\tfmt<span class=\"token punctuation\">.<\/span><span class=\"token function\">Fprintf<\/span><span class=\"token punctuation\">(<\/span>Screen<span class=\"token punctuation\">,<\/span> <span class=\"token string\">\"\\033[%d;%dH\"<\/span><span class=\"token punctuation\">,<\/span> x<span class=\"token punctuation\">,<\/span> y<span class=\"token punctuation\">)<\/span>\r\n<span class=\"token punctuation\">}<\/span><\/code><\/pre>\n<p>Then we can clear the screen buffer periodically. In linux based systems to move the cursor to a specific place in terminal window we can use ANSI escape codes, like: <kbd>\\033[%d;%dH<\/kbd>, where <kbd>%d;%d<\/kbd> we can replace with values obtained from the mandelbrot renderer. In the example provided in the project <a href=\"https:\/\/github.com\/esimov\/asciibrot\/blob\/master\/examples\/julia.go\">github repo<\/a> i&#8217;m moving the terminal window cursor to the mandelbrot <kbd>x<\/kbd> and <kbd>y<\/kbd> position, after which i&#8217;m clearing the screen.<\/p>\n<p>To make it more attractive i used a cheap trick to zoom in and out into the fractal and to smoothly displace the fractal position by applying sine and cosine function on x and y coordinate.<\/p>\n<pre class=\"language-go\"><code class=\"language-go\"><span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">{<\/span>\r\n\tn <span class=\"token operator\">+<\/span><span class=\"token operator\">=<\/span> <span class=\"token number\">0.045<\/span>\r\n\tzoom <span class=\"token operator\">+<\/span><span class=\"token operator\">=<\/span> <span class=\"token number\">0.04<\/span> <span class=\"token operator\">*<\/span> math<span class=\"token punctuation\">.<\/span><span class=\"token function\">Sin<\/span><span class=\"token punctuation\">(<\/span>n<span class=\"token punctuation\">)<\/span>\r\n\tasciibrot<span class=\"token punctuation\">.<\/span><span class=\"token function\">DrawFractal<\/span><span class=\"token punctuation\">(<\/span>zoom<span class=\"token punctuation\">,<\/span> math<span class=\"token punctuation\">.<\/span><span class=\"token function\">Cos<\/span><span class=\"token punctuation\">(<\/span>n<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> math<span class=\"token punctuation\">.<\/span><span class=\"token function\">Sin<\/span><span class=\"token punctuation\">(<\/span>n<span class=\"token punctuation\">)<\/span><span class=\"token operator\">\/<\/span>zoom<span class=\"token operator\">*<\/span><span class=\"token number\">0.02<\/span><span class=\"token punctuation\">,<\/span> math<span class=\"token punctuation\">.<\/span><span class=\"token function\">Sin<\/span><span class=\"token punctuation\">(<\/span>n<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> MAX_IT<span class=\"token punctuation\">,<\/span> <span class=\"token boolean\">true<\/span><span class=\"token punctuation\">,<\/span> isColor<span class=\"token punctuation\">)<\/span> <span class=\"token comment\" spellcheck=\"true\">\/\/where math.Cos(n) and math.Sin(n) are x and y coordinates\t<\/span>\r\n<span class=\"token punctuation\">}<\/span><\/code><\/pre>\n<p>But there is another issue. We need to handle differently the code responsible to obtain the terminal window size in different operating systems. In linux and darwin based operating systems here is how we can get the terminal size:<\/p>\n<pre class=\"language-go\"><code class=\"language-go\">func <span class=\"token function\">getWinsize<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token operator\">*<\/span>winsize<span class=\"token punctuation\">,<\/span> error<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span>\r\n\tws <span class=\"token punctuation\">:<\/span><span class=\"token operator\">=<\/span> <span class=\"token keyword\">new<\/span><span class=\"token punctuation\">(<\/span>winsize<span class=\"token punctuation\">)<\/span>\r\n\r\n\t<span class=\"token keyword\">var<\/span> _TIOCGWINSZ int64\r\n\r\n\t<span class=\"token keyword\">switch<\/span> runtime<span class=\"token punctuation\">.<\/span>GOOS <span class=\"token punctuation\">{<\/span>\r\n\t<span class=\"token keyword\">case<\/span> <span class=\"token string\">\"linux\"<\/span><span class=\"token punctuation\">:<\/span>\r\n\t\t_TIOCGWINSZ <span class=\"token operator\">=<\/span> <span class=\"token number\">0x5413<\/span>\r\n\t<span class=\"token keyword\">case<\/span> <span class=\"token string\">\"darwin\"<\/span><span class=\"token punctuation\">:<\/span>\r\n\t\t_TIOCGWINSZ <span class=\"token operator\">=<\/span> <span class=\"token number\">1074295912<\/span>\r\n\t<span class=\"token punctuation\">}<\/span>\r\n\r\n\tr1<span class=\"token punctuation\">,<\/span> _<span class=\"token punctuation\">,<\/span> errno <span class=\"token punctuation\">:<\/span><span class=\"token operator\">=<\/span> syscall<span class=\"token punctuation\">.<\/span><span class=\"token function\">Syscall<\/span><span class=\"token punctuation\">(<\/span>syscall<span class=\"token punctuation\">.<\/span>SYS_IOCTL<span class=\"token punctuation\">,<\/span>\r\n\t\t<span class=\"token function\">uintptr<\/span><span class=\"token punctuation\">(<\/span>syscall<span class=\"token punctuation\">.<\/span>Stdin<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span>\r\n\t\t<span class=\"token function\">uintptr<\/span><span class=\"token punctuation\">(<\/span>_TIOCGWINSZ<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span>\r\n\t\t<span class=\"token function\">uintptr<\/span><span class=\"token punctuation\">(<\/span>unsafe<span class=\"token punctuation\">.<\/span><span class=\"token function\">Pointer<\/span><span class=\"token punctuation\">(<\/span>ws<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span>\r\n\t<span class=\"token punctuation\">)<\/span>\r\n\r\n\t<span class=\"token keyword\">if<\/span> <span class=\"token function\">int<\/span><span class=\"token punctuation\">(<\/span>r1<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">==<\/span> <span class=\"token operator\">-<\/span><span class=\"token number\">1<\/span> <span class=\"token punctuation\">{<\/span>\r\n\t\tfmt<span class=\"token punctuation\">.<\/span><span class=\"token function\">Println<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">\"Error:\"<\/span><span class=\"token punctuation\">,<\/span> os<span class=\"token punctuation\">.<\/span><span class=\"token function\">NewSyscallError<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">\"GetWinsize\"<\/span><span class=\"token punctuation\">,<\/span> errno<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span>\r\n\t\t<span class=\"token keyword\">return<\/span> nil<span class=\"token punctuation\">,<\/span> os<span class=\"token punctuation\">.<\/span><span class=\"token function\">NewSyscallError<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">\"GetWinsize\"<\/span><span class=\"token punctuation\">,<\/span> errno<span class=\"token punctuation\">)<\/span>\r\n\t<span class=\"token punctuation\">}<\/span>\r\n\t<span class=\"token keyword\">return<\/span> ws<span class=\"token punctuation\">,<\/span> nil\r\n<span class=\"token punctuation\">}<\/span>\r\n<\/code><\/pre>\n<p>In Windows operating system to obtain the terminal dimension is a little bit different:<\/p>\n<pre class=\"language-go\"><code class=\"language-go\">\r\n<span class=\"token keyword\">type<\/span> <span class=\"token punctuation\">(<\/span>\r\n\tcoord <span class=\"token keyword\">struct<\/span> <span class=\"token punctuation\">{<\/span>\r\n\t\tx <span class=\"token builtin\">int16<\/span>\r\n\t\ty <span class=\"token builtin\">int16<\/span>\r\n\t<span class=\"token punctuation\">}<\/span>\r\n\r\n\tconsoleScreenBufferInfo <span class=\"token keyword\">struct<\/span> <span class=\"token punctuation\">{<\/span>\r\n\t\tsize              coord\r\n\t\tcursorPosition    coord\r\n\t\tmaximumWindowSize coord\r\n\t<span class=\"token punctuation\">}<\/span>\r\n<span class=\"token punctuation\">)<\/span>\r\n<span class=\"token comment\" spellcheck=\"true\">\/\/ ...<\/span>\r\n<span class=\"token keyword\">func<\/span> <span class=\"token function\">getWinSize<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">(<\/span>width<span class=\"token punctuation\">,<\/span> height <span class=\"token builtin\">int<\/span><span class=\"token punctuation\">,<\/span> err <span class=\"token builtin\">error<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span>\r\n\t<span class=\"token keyword\">var<\/span> info consoleScreenBufferInfo\r\n\tr0<span class=\"token punctuation\">,<\/span> <span class=\"token boolean\">_<\/span><span class=\"token punctuation\">,<\/span> e1 <span class=\"token operator\">:=<\/span> syscall<span class=\"token punctuation\">.<\/span><span class=\"token function\">Syscall<\/span><span class=\"token punctuation\">(<\/span>procGetConsoleScreenBufferInfo<span class=\"token punctuation\">.<\/span><span class=\"token function\">Addr<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">2<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token function\">uintptr<\/span><span class=\"token punctuation\">(<\/span>out<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token function\">uintptr<\/span><span class=\"token punctuation\">(<\/span>unsafe<span class=\"token punctuation\">.<\/span><span class=\"token function\">Pointer<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>info<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span>\r\n\t<span class=\"token keyword\">if<\/span> <span class=\"token function\">int<\/span><span class=\"token punctuation\">(<\/span>r0<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">==<\/span> <span class=\"token number\">0<\/span> <span class=\"token punctuation\">{<\/span>\r\n\t\t<span class=\"token keyword\">if<\/span> e1 <span class=\"token operator\">!=<\/span> <span class=\"token number\">0<\/span> <span class=\"token punctuation\">{<\/span>\r\n\t\t\terr <span class=\"token operator\">=<\/span> <span class=\"token function\">error<\/span><span class=\"token punctuation\">(<\/span>e1<span class=\"token punctuation\">)<\/span>\r\n\t\t<span class=\"token punctuation\">}<\/span> <span class=\"token keyword\">else<\/span> <span class=\"token punctuation\">{<\/span>\r\n\t\t\terr <span class=\"token operator\">=<\/span> syscall<span class=\"token punctuation\">.<\/span>EINVAL\r\n\t\t<span class=\"token punctuation\">}<\/span>\r\n\t<span class=\"token punctuation\">}<\/span>\r\n\t<span class=\"token keyword\">return<\/span> <span class=\"token function\">int<\/span><span class=\"token punctuation\">(<\/span>info<span class=\"token punctuation\">.<\/span>size<span class=\"token punctuation\">.<\/span>x<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token function\">int<\/span><span class=\"token punctuation\">(<\/span>info<span class=\"token punctuation\">.<\/span>size<span class=\"token punctuation\">.<\/span>y<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token boolean\">nil<\/span>\r\n<span class=\"token punctuation\">}<\/span>\r\n<\/code><\/pre>\n<p>One last step remained: to clear the screen buffer on CTRL-C signal, in another words to clear the screen on control break. For this i&#8217;ve created a channel and when the CTRL-C was pressed i signaled this event and on a separate goroutine i was listening for this event, meaning i could break the operation.<\/p>\n<pre class=\"language-go\"><code class=\"language-go\">\r\n<span class=\"token comment\" spellcheck=\"true\">\/\/ On CTRL+C restore default terminal foreground and background color<\/span>\r\n<span class=\"token keyword\">go<\/span> <span class=\"token keyword\">func<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span>\r\n\t<span class=\"token operator\">&lt;-<\/span>c\r\n\tfmt<span class=\"token punctuation\">.<\/span><span class=\"token function\">Fprint<\/span><span class=\"token punctuation\">(<\/span>asciibrot<span class=\"token punctuation\">.<\/span>Screen<span class=\"token punctuation\">,<\/span> <span class=\"token string\">\"%s%s\"<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">\"\\x1b[49m\"<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">\"\\x1b[39m\"<\/span><span class=\"token punctuation\">)<\/span>\r\n\tfmt<span class=\"token punctuation\">.<\/span><span class=\"token function\">Fprint<\/span><span class=\"token punctuation\">(<\/span>asciibrot<span class=\"token punctuation\">.<\/span>Screen<span class=\"token punctuation\">,<\/span> <span class=\"token string\">\"\\033[2J\"<\/span><span class=\"token punctuation\">)<\/span>\r\n\tasciibrot<span class=\"token punctuation\">.<\/span><span class=\"token function\">Flush<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>\r\n\tos<span class=\"token punctuation\">.<\/span><span class=\"token function\">Exit<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span>\r\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>\r\n<\/code><\/pre>\n<h2>Usage<\/h2>\n<p>In big that&#8217;s all. You can grab the code by running the following command:<\/p>\n<p><code class=\" language-go\"><br \/>\ngo get github.com\/esimov\/asciibrot<br \/>\n<\/code><\/p>\n<p>To run it type:<\/p>\n<p><code class=\" language-go\"><br \/>\ngo run julia.go --help<br \/>\n<\/code><\/p>\n<blockquote class=\"twitter-tweet\" data-lang=\"en\">\n<p lang=\"es\" dir=\"ltr\">Terminal fractal ASCII art written in Go. <a href=\"https:\/\/twitter.com\/hashtag\/golang?src=hash\">#golang<\/a> <a href=\"https:\/\/twitter.com\/hashtag\/fractal?src=hash\">#fractal<\/a> <a href=\"https:\/\/twitter.com\/hashtag\/terminal?src=hash\">#terminal<\/a> <a href=\"https:\/\/twitter.com\/hashtag\/ascii?src=hash\">#ascii<\/a> <a href=\"https:\/\/t.co\/WtwHkhoOPz\">pic.twitter.com\/WtwHkhoOPz<\/a><\/p>\n<p>&mdash; Sim\u00f3 Endre (@simo_endre) <a href=\"https:\/\/twitter.com\/simo_endre\/status\/714397710460325888\">March 28, 2016<\/a><\/p><\/blockquote>\n<p><script async src=\"\/\/platform.twitter.com\/widgets.js\" charset=\"utf-8\"><\/script><\/p>\n<p>You can run the example in monochrome or color version. For the color version use <kbd>--color<\/kbd> or <kbd>-c<\/kbd>. For monochrome version use <kbd>--mono<\/kbd> or <kbd>-m<\/kbd>.<\/p>\n<p>You can build the binary version with: <code class=\" language-go\">go build github.com\/esimov\/asciibrot<\/kbd>.<\/code><\/p>\n<p>I&#8217;ve created a github repo for this experiment, which you can get it here: <a href=\"https:\/\/github.com\/esimov\/asciibrot\">https:\/\/github.com\/esimov\/asciibrot<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>ASCIIbrot is a simple Mandelbrot fractal generator running in terminal. It&#8217;s written in Go and it was designed to be ran on different platforms, however the linux based is the one on which it was tested.<\/p>\n","protected":false},"author":1,"featured_media":1078,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[47,7,58,41,75,21],"tags":[72,69,59,60,74,71,73],"class_list":["post-1044","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blog","category-experiments","category-go","category-programming","category-terminal","category-tutorials","tag-ascii","tag-fractal","tag-go-2","tag-golang","tag-linux","tag-mandelbrot","tag-terminal"],"_links":{"self":[{"href":"https:\/\/esimov.com\/blog\/wp-json\/wp\/v2\/posts\/1044","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/esimov.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/esimov.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/esimov.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/esimov.com\/blog\/wp-json\/wp\/v2\/comments?post=1044"}],"version-history":[{"count":2,"href":"https:\/\/esimov.com\/blog\/wp-json\/wp\/v2\/posts\/1044\/revisions"}],"predecessor-version":[{"id":1184,"href":"https:\/\/esimov.com\/blog\/wp-json\/wp\/v2\/posts\/1044\/revisions\/1184"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/esimov.com\/blog\/wp-json\/wp\/v2\/media\/1078"}],"wp:attachment":[{"href":"https:\/\/esimov.com\/blog\/wp-json\/wp\/v2\/media?parent=1044"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/esimov.com\/blog\/wp-json\/wp\/v2\/categories?post=1044"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/esimov.com\/blog\/wp-json\/wp\/v2\/tags?post=1044"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}