import*asSVGfrom'svg.js';functionshowText(msg){letnewTextNode=document.createElement('div');lettextNode=document.createTextNode(msg)newTextNode.appendChild(textNode)letentry=document.getElementById("entry")entry.appendChild(newTextNode)}functionstartWorker(){letworker=newWorker("/assets/js/mandelbrot_worker.bundle.js");letmandelbrot=document.getElementById("mandelbrot")mandelbrot.setAttribute("style","width:100%;")mandelbrot.style.height=Math.floor(mandelbrot.offsetWidth)+'px';mandelbrot.style.backgroundColor="rgba(0,0,0, 0.04)";letdraw=SVG('mandelbrot').size(mandelbrot.offsetWidth,mandelbrot.offsetWidth)letmWidth=mandelbrot.clientWidthletmHeight=mandelbrot.clientHeightvarmouseIsDown=falsefunctionhandleMouseEvent(event){letrelativeX=(event.pageX-window.pageXOffset-mandelbrot.getBoundingClientRect().left);letrelativeY=(event.pageY-window.pageYOffset-mandelbrot.getBoundingClientRect().top);letscaledX=relativeX/mWidth*4.0-2.0letscaledY=relativeY/mHeight*4.0-2.0worker.postMessage({x:scaledX,y:scaledY})event.preventDefault()}functionhandleTouchEvent(event){lettouch=event.touches[0]letrelativeX=touch.pageX-window.pageXOffset-mandelbrot.getBoundingClientRect().leftletrelativeY=touch.pageY-window.pageYOffset-mandelbrot.getBoundingClientRect().topletscaledX=relativeX/mWidth*4.0-2.0letscaledY=relativeY/mHeight*4.0-2.0worker.postMessage({x:scaledX,y:scaledY})event.preventDefault()}mandelbrot.onclick=function(event){handleMouseEvent(event)}mandelbrot.onmousedown=function(event){mouseIsDown=truedraw.clear()event.preventDefault()}mandelbrot.onmouseup=function(event){mouseIsDown=false//draw.clear()event.preventDefault()}mandelbrot.onmousemove=function(event){if(mouseIsDown){handleMouseEvent(event)}event.preventDefault()}document.addEventListener('touchmove',handleTouchEvent,{passive:false});letsequence=0worker.onmessage=function(event){if(event.data["sequence"]>=sequence){sequence=event.data["sequence"]}else{return}if(event.data["orbits"]){draw.clear()letxs=event.data["orbits"][0]letys=event.data["orbits"][1]letiterations=event.data["iterations"]for(vari=1;i<iterations;i++){letxOffset=(xs[i]+2.0)/4.0*mWidthletyOffset=(ys[i]+2.0)/4.0*mHeightif(xOffset>0&&xOffset<mWidth&&yOffset>0&&yOffset<mHeight){draw.rect(3,3).fill('#000000').translate(xOffset,yOffset)}}}elseif(event.data["message"]){showText(event.data["message"]);}};}if(typeof(Worker)!=="undefined"){startWorker()}else{showText("Sorry, Web Worker is not supported in your browser. :(")}
mandelbrot_worker.ts
declarefunctionpostMessage(message:any):anyvarsequence=0letmax_iterations=256letbailout=16letiterationBufferZR=newFloat32Array(max_iterations)letiterationBufferZI=newFloat32Array(max_iterations)functionmandelbrot(xx:number,yy:number){letcr=xxletci=yyletzi=0.0letzr=0.0leti=0while(i++<max_iterations){lettemp=zr*ziletzr2=zr*zrletzi2=zi*zizr=zr2-zi2+crzi=2.0*temp+ciif(zi2+zr2>bailout){returni}iterationBufferZR[i]=zriterationBufferZI[i]=zi}returni}self.onmessage=function(msg:any){letx=msg.data["x"]lety=msg.data["y"]letiterations=mandelbrot(x,y)sequence=sequence+1postMessage({orbits:[iterationBufferZR,iterationBufferZI],iterations:iterations,sequence:sequence})}postMessage({message:"Click or Tap in the gray square.",sequence:sequence});