Skip to content
Snippets Groups Projects
Commit 4ef17f51 authored by Neil Gershenfeld's avatar Neil Gershenfeld
Browse files

1st height map, some errors

parent 6e4bd784
Branches
No related tags found
No related merge requests found
......@@ -29,7 +29,6 @@ var init = function() {
mod.inunits.value = 1
mod.width.value = 1000
mod.border.value = 0
mod.delta = 1e-6
}
//
// inputs
......@@ -226,13 +225,12 @@ function find_limits_map() {
var border = parseFloat(mod.border.value)
webworker.postMessage({
mesh:mod.mesh,
border:border,delta:mod.delta})
border:border})
}
function limits_worker() {
self.addEventListener('message',function(evt) {
var view = evt.data.mesh
var border = evt.data.border
var delta = evt.data.delta // perturb to remove degeneracies
//
// get vars
//
......@@ -252,23 +250,23 @@ function limits_worker() {
var zmax = -Number.MAX_VALUE
for (var t = 0; t < triangles; ++t) {
offset += 3*4
x0 = view.getFloat32(offset,endian)+delta
x0 = view.getFloat32(offset,endian)
offset += 4
y0 = view.getFloat32(offset,endian)+delta
y0 = view.getFloat32(offset,endian)
offset += 4
z0 = view.getFloat32(offset,endian)+delta
z0 = view.getFloat32(offset,endian)
offset += 4
x1 = view.getFloat32(offset,endian)+delta
x1 = view.getFloat32(offset,endian)
offset += 4
y1 = view.getFloat32(offset,endian)+delta
y1 = view.getFloat32(offset,endian)
offset += 4
z1 = view.getFloat32(offset,endian)+delta
z1 = view.getFloat32(offset,endian)
offset += 4
x2 = view.getFloat32(offset,endian)+delta
x2 = view.getFloat32(offset,endian)
offset += 4
y2 = view.getFloat32(offset,endian)+delta
y2 = view.getFloat32(offset,endian)
offset += 4
z2 = view.getFloat32(offset,endian)+delta
z2 = view.getFloat32(offset,endian)
offset += 4
offset += 2
if (x0 > xmax) xmax = x0
......@@ -314,7 +312,7 @@ function map_mesh() {
window.URL.revokeObjectURL(url)
var h = mod.img.height
var w = mod.img.width
var buf = new Uint8ClampedArray(evt.data.buffer)
var buf = new Uint8ClampedArray(evt.data.imgbuffer)
var imgdata = new ImageData(buf,w,h)
var ctx = mod.img.getContext("2d")
ctx.putImageData(imgdata,0,0)
......@@ -342,13 +340,14 @@ function map_mesh() {
mod.img.height = Math.round(mod.img.width*mod.dy/mod.dx)
var ctx = mod.img.getContext("2d")
var img = ctx.getImageData(0,0,mod.img.width,mod.img.height)
var map = new Float32Array(1000)
webworker.postMessage({
height:mod.img.height,width:mod.img.width,
imgbuffer:img.data.buffer,mesh:mod.mesh,
imgbuffer:img.data.buffer,
mesh:mod.mesh,
xmin:mod.xmin,xmax:mod.xmax,
ymin:mod.ymin,ymax:mod.ymax,
zmin:mod.zmin,zmax:mod.zmax,
delta:mod.delta},
zmin:mod.zmin,zmax:mod.zmax},
[img.data.buffer])
}
function map_worker() {
......@@ -356,7 +355,6 @@ function map_worker() {
var h = evt.data.height
var w = evt.data.width
var view = evt.data.mesh
var delta = evt.data.delta // perturb to remove degeneracies
var xmin = evt.data.xmin
var xmax = evt.data.xmax
var ymin = evt.data.ymin
......@@ -364,6 +362,7 @@ function map_worker() {
var zmin = evt.data.zmin
var zmax = evt.data.zmax
var buf = new Uint8ClampedArray(evt.data.imgbuffer)
var map = new Float32Array(h*w)
//
// get vars from buffer
//
......@@ -371,16 +370,157 @@ function map_worker() {
var triangles = view.getUint32(80,endian)
var size = 80+4+triangles*(4*12+2)
//
// initialize map image
// initialize map and image
//
for (var row = 0; row < h; ++row) {
for (var col = 0; col < w; ++col) {
buf[(h-1-row)*w*4+col*4+0] = row
buf[(h-1-row)*w*4+col*4+1] = col
map[(h-1-row)*w+col] = 0
buf[(h-1-row)*w*4+col*4+0] = 0
buf[(h-1-row)*w*4+col*4+1] = 0
buf[(h-1-row)*w*4+col*4+2] = 0
buf[(h-1-row)*w*4+col*4+3] = 255
}
}
//
// loop over triangles
//
var segs = []
offset = 80+4
for (var t = 0; t < triangles; ++t) {
offset += 3*4
x0 = view.getFloat32(offset,endian)
offset += 4
y0 = view.getFloat32(offset,endian)
offset += 4
z0 = view.getFloat32(offset,endian)
offset += 4
x1 = view.getFloat32(offset,endian)
offset += 4
y1 = view.getFloat32(offset,endian)
offset += 4
z1 = view.getFloat32(offset,endian)
offset += 4
x2 = view.getFloat32(offset,endian)
offset += 4
y2 = view.getFloat32(offset,endian)
offset += 4
z2 = view.getFloat32(offset,endian)
offset += 4
offset += 2
//
// quantize image coordinates
//
x0 = Math.floor((w-1)*(x0-xmin)/(xmax-xmin))
x1 = Math.floor((w-1)*(x1-xmin)/(xmax-xmin))
x2 = Math.floor((w-1)*(x2-xmin)/(xmax-xmin))
y0 = Math.floor((h-1)*(y0-ymin)/(ymax-ymin))
y1 = Math.floor((h-1)*(y1-ymin)/(ymax-ymin))
y2 = Math.floor((h-1)*(y2-ymin)/(ymax-ymin))
//
// check normal if needs to be drawn
//
if (((x1-x0)*(y1-y2)-(x1-x2)*(y1-y0)) >= 0)
continue
//
// sort projection order
//
if (y1 > y2) {
var temp = x1;
x1 = x2;
x2 = temp
var temp = y1;
y1 = y2;
y2 = temp
var temp = z1;
z1 = z2;
z2 = temp
}
if (y0 > y1) {
var temp = x0;
x0 = x1;
x1 = temp
var temp = y0;
y0 = y1;
y1 = temp
var temp = z0;
z0 = z1;
z1 = temp
}
if (y1 > y2) {
var temp = x1;
x1 = x2;
x2 = temp
var temp = y1;
y1 = y2;
y2 = temp
var temp = z1;
z1 = z2;
z2 = temp
}
//
// check orientation after sort
//
if (x1 < (x0+((x2-x0)*(y1-y0))/(y2-y0)))
var dir = 1;
else
var dir = -1;
//
// set z values
//
if (y2 != y1) {
for (var y = y1; y <= y2; ++y) {
if (y < 0) continue
if (y > (h - 1)) break
x12 = Math.floor(0.5+x1+(y-y1)*(x2-x1)/(y2-y1))
z12 = z1+(y-y1)*(z2-z1)/(y2-y1)
x02 = Math.floor(0.5+x0+(y-y0)*(x2-x0)/(y2-y0))
z02 = z0+(y-y0)*(z2-z0)/(y2-y0)
if (x12 != x02)
var slope = (z02-z12)/(x02-x12)
else
var slope = 0
var x = x12 - dir
while (x != x02) {
x += dir
if ((x < 0) || (x > (h-1))) continue
var z = z12+slope*(x-x12)
var iz = Math.floor(255*(z-zmin)/(zmax-zmin))
buf[(h-1-y)*w*4+x*4+0] = iz
buf[(h-1-y)*w*4+x*4+1] = iz
buf[(h-1-y)*w*4+x*4+2] = iz
//if (z > view.getFloat32((h-1-y)*4*w+x*4))
// view.setFloat32((h-1-y)*4*w+x*4,z)
}
}
}
if (y1 != y0) {
for (var y = y0; y <= y1; ++y) {
if (y < 0) continue
if (y > (h-1)) break
x01 = Math.floor(0.5+x0+(y-y0)*(x1-x0)/(y1-y0))
z01 = z0+(y-y0)*(z1-z0)/(y1-y0)
x02 = Math.floor(0.5+x0+(y-y0)*(x2-x0)/(y2-y0))
z02 = z0+(y-y0)*(z2-z0)/(y2-y0)
if (x01 != x02)
var slope = (z02-z01)/(x02-x01)
else
var slope = 0
var x = x01 - dir
while (x != x02) {
x += dir
if ((x < 0) || (x > (w-1))) continue
var z = z01+slope*(x-x01)
var iz = Math.floor(255*(z-zmin)/(zmax-zmin))
buf[(h-1-y)*w*4+x*4+0] = iz
buf[(h-1-y)*w*4+x*4+1] = iz
buf[(h-1-y)*w*4+x*4+2] = iz
//if (z > view.getFloat32((h-1-y)*4*w+x*4))
//if (z > view.getFloat32((h-1-y)*4*w+x*4))
// view.setFloat32((h-1-y)*4*w+x*4,z)
}
}
}
}
/*
//
// find triangles crossing the map
......@@ -389,23 +529,23 @@ function map_worker() {
offset = 80+4
for (var t = 0; t < triangles; ++t) {
offset += 3*4
x0 = view.getFloat32(offset,endian)+delta
x0 = view.getFloat32(offset,endian)
offset += 4
y0 = view.getFloat32(offset,endian)+delta
y0 = view.getFloat32(offset,endian)
offset += 4
z0 = view.getFloat32(offset,endian)+delta
z0 = view.getFloat32(offset,endian)
offset += 4
x1 = view.getFloat32(offset,endian)+delta
x1 = view.getFloat32(offset,endian)
offset += 4
y1 = view.getFloat32(offset,endian)+delta
y1 = view.getFloat32(offset,endian)
offset += 4
z1 = view.getFloat32(offset,endian)+delta
z1 = view.getFloat32(offset,endian)
offset += 4
x2 = view.getFloat32(offset,endian)+delta
x2 = view.getFloat32(offset,endian)
offset += 4
y2 = view.getFloat32(offset,endian)+delta
y2 = view.getFloat32(offset,endian)
offset += 4
z2 = view.getFloat32(offset,endian)+delta
z2 = view.getFloat32(offset,endian)
offset += 4
//
// assemble vertices
......@@ -482,7 +622,7 @@ function map_worker() {
//
// output the map
//
self.postMessage({buffer:buf.buffer},[buf.buffer])
self.postMessage({imgbuffer:buf.buffer},[buf.buffer])
self.close()
})
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment