/** * barnsley-fern.js * Plot a Barnsley fern to the JXG Board */ import "./lib/dfhi.js"; import * as JXG from "jsxgraph" ; import {exportBoard} from "./lib/dfhi-plot"; /** * the JXG Board * */ let board = undefined; /** * called only once, as page loaded, as required by "lib/dfhi.js" API * */ window.init = function() { board = initBoard(); function exportSvg(event) { exportBoard(board); } document.getElementById("export") .addEventListener("click", exportSvg); }; /** * called every time user clicks on the #run Button, as required by "lib/dfhi.js" * */ window.main = function(...argv) { if (board) { try { JXG.JSXGraph.freeBoard(board); board = undefined;// remove all child of boad board = initBoard(); }catch (e) { console.log(e); console.log(board); } } let n = Number.parseInt(argv[0]); let points = barnsley(n); let opt = {withLabel:false, fixed:true, size:0.001, fillColor:"#00aa00", strokeWidth:0}; plotBarnsley(board, points, opt); }; /** * init board, called at least once by window.init * */ function initBoard() { return JXG.JSXGraph.initBoard('plotter', { boundingbox: [-6, 12, 6, -1], axis: false, keepAspectRatio:true }); } /** * generates points of Barnsley Fern. * */ function barnsley(n) { const m = [ [ 0 , 0 , 0 , 0.16 , 0.500 , 0 , 0.01], [ 0.85 , 0.04 , -0.04 , 0.85 , 0.075 , 1.60 , 0.85], [ 0.20 , -0.26 , 0.23 , 0.22 , 0.400 , 1.60 , 0.07], [-0.15 , 0.28 , 0.26 , 0.24 , 0.575 , 0.44 , 0.07] ]; const p = [ m[0][6], m[0][6] + m[1][6], m[0][6] + m[1][6] + m[2][6] ]; let x = 0, y = 0; const points = [ [x, y] ]; for(let i = 0; i < n; ++i) { let r = Math.random(); let f = 0; if (r < p[0]) { f = 0; }else if (r < p[1]) { f = 1; }else if (r < p[2]) { f = 2; } else { f = 3; } let nX = (m[f][0] * x) + (m[f][1] * y) + m[f][4]; y = (m[f][2] * x) + (m[f][3] * y) + m[f][5]; x = nX; points.push([x,y]); } return points; } /** * * @param board * @param points * @param attr * * */ function plotBarnsley(board, points, attr ) { for(let p of points) { board.create('point', p, attr ); } }