From 237096a8ff214873ef8700fe1c922777e09cf03f Mon Sep 17 00:00:00 2001
From: Neil Gershenfeld <gersh@cba.mit.edu>
Date: Tue, 21 Jan 2020 14:23:14 +0530
Subject: [PATCH] to worker

---
 modules/processes/mill/raster/3D | 172 ++++++++++++++++++-------------
 1 file changed, 102 insertions(+), 70 deletions(-)

diff --git a/modules/processes/mill/raster/3D b/modules/processes/mill/raster/3D
index 788c805..4b6786e 100644
--- a/modules/processes/mill/raster/3D
+++ b/modules/processes/mill/raster/3D
@@ -212,82 +212,114 @@ var interface = function(div){
 //
 // local functions
 //
-// calculate_path
+// calculate path
 //
 function calculate_path() {
-   var h = mod.height
-   var w = mod.width
-   var xmin = mod.xmin
-   var xmax = mod.xmax
-   var ymin = mod.ymin
-   var ymax = mod.ymax
-   var zmin = mod.zmin
-   var zmax = mod.zmax
-   //
-   // clear SVG
-   //
-   var svg = document.getElementById(mod.div.id+'svg')
-   svg.setAttribute('viewBox',"0 0 "+(w-1)+" "+(h-1))
-   var g = document.getElementById(mod.div.id+'g')
-   svg.removeChild(g)
-   var g = document.createElementNS('http://www.w3.org/2000/svg','g')
-   g.setAttribute('id',mod.div.id+'g')
-   svg.appendChild(g)
-   //
-   // line loop
-   //
-   var ix = 0
-   var iy = h-1
-   var dx = 1
-   var dy = 0
-   var x = xmin+(xmax-xmin)*ix/(w-1)
-   var y = ymin+(ymax-ymin)*iy/(h-1)
-   var z = mod.map[(h-1-iy)*w+ix]
-   var dz = 0.1*h*(zmax-z)/(ymax-ymin)
-   while (1) {
-      var ixp = ix
-      var iyp = iy
-      var dzp = dz
-      ix += dx
-      iy += dy
-      if (iy <= 0)
-         break;
-      var x = xmin+(xmax-xmin)*ix/(w-1)
-      var y = ymin+(ymax-ymin)*iy/(h-1)
-      var z = mod.map[iy*w+ix]
-      var dz = 0.1*h*(zmax-z)/(zmax-zmin)
-      var line = document.createElementNS('http://www.w3.org/2000/svg','line')
-         line.setAttribute('stroke','black')
-         line.setAttribute('stroke-width',1)
-         line.setAttribute('stroke-linecap','round')
-         line.setAttribute('x1',ixp)
-         line.setAttribute('y1',iyp+dzp)
-         line.setAttribute('x2',ix)
-         line.setAttribute('y2',iy+dz)
-         g.appendChild(line)
-      if (ix == (mod.width-1)) {
-         if (dx == 1) {
-            dx = 0
-            dy = -10
+   var blob = new Blob(['('+calculate_path_worker.toString()+'())'])
+   var url = window.URL.createObjectURL(blob)
+   var webworker = new Worker(url)
+   webworker.addEventListener('message',function(evt) {
+      mod.triangles = evt.data.triangles
+      mod.path = evt.data.path
+      mod.label.nodeValue = 'calculate'
+      mod.labelspan.style.fontWeight = 'normal'
+      //
+      // clear SVG
+      //
+      var svg = document.getElementById(mod.div.id+'svg')
+      svg.setAttribute('viewBox',"0 0 "+(mod.width-1)+" "+(mod.height-1))
+      var g = document.getElementById(mod.div.id+'g')
+      svg.removeChild(g)
+      var g = document.createElementNS('http://www.w3.org/2000/svg','g')
+      g.setAttribute('id',mod.div.id+'g')
+      svg.appendChild(g)
+      //
+      // plot path
+      //
+      for (var i = 1; i < mod.path[0].length; ++i) {
+         var ixp = mod.path[0][i-1][0]
+         var iyp = mod.path[0][i-1][1]
+         var izp = 0.1*mod.path[0][i-1][2]
+         var ix = mod.path[0][i][0]
+         var iy = mod.path[0][i][1]
+         var iz = 0.1*mod.path[0][i][2]
+         var line = document.createElementNS('http://www.w3.org/2000/svg','line')
+            line.setAttribute('stroke','black')
+            line.setAttribute('stroke-width',1)
+            line.setAttribute('stroke-linecap','round')
+            line.setAttribute('x1',ixp)
+            line.setAttribute('y1',iyp-izp)
+            line.setAttribute('x2',ix)
+            line.setAttribute('y2',iy-iz)
+            g.appendChild(line)
             }
-         else {
-            dx = -1
-            dy = 0
-            }
-         }
-      else if (ix == 0) {
-         if (dx == -1) {
-            dx = 0
-            dy = -10
+      })
+   webworker.postMessage({
+      h:mod.height,w:mod.width,
+      xmin:mod.xmin,xmax:mod.xmax,
+      ymin:mod.ymin,ymax:mod.ymax,
+      zmin:mod.zmin,zmax:mod.zmax,
+      map:mod.map})
+   }
+//
+// calculate path worker
+//
+function calculate_path_worker() {
+   self.addEventListener('message',function(evt) {
+      var h = evt.data.h
+      var w = evt.data.w
+      var xmin = evt.data.xmin
+      var xmax = evt.data.xmax
+      var ymin = evt.data.ymin
+      var ymax = evt.data.ymax
+      var zmin = evt.data.zmin
+      var zmax = evt.data.zmax
+      var map = evt.data.map
+      var path = [[]]
+      //
+      // line loop
+      //
+      var ix = 0
+      var iy = h-1
+      var dx = 1
+      var dy = 0
+      var iz = Math.floor((map[iy*w+ix]-zmax)*w/(xmax-xmin))
+      while (1) {
+         var ixp = ix
+         var iyp = iy
+         ix += dx
+         iy += dy
+         if (iy <= 0)
+            break;
+         var iz = Math.floor((map[iy*w+ix]-zmax)*w/(xmax-xmin))
+         path[0].push([ix,iy,iz])
+         if (ix == (w-1)) {
+            if (dx == 1) {
+               dx = 0
+               dy = -10
+               }
+            else {
+               dx = -1
+               dy = 0
+               }
             }
-         else {
-            dx = 1
-            dy = 0
+         else if (ix == 0) {
+            if (dx == -1) {
+               dx = 0
+               dy = -10
+               }
+            else {
+               dx = 1
+               dy = 0
+               }
             }
          }
-      }
-   mod.label.nodeValue = 'calculate'
-   mod.labelspan.style.fontWeight = 'normal'
+      //
+      // return
+      //
+      self.postMessage({path:path})
+      self.close()
+      })
    }
 //
 // return values
-- 
GitLab