Skip to content

Commit b83a3f0

Browse files
committed
adding README.md, not that it helps
1 parent 04e20be commit b83a3f0

File tree

3 files changed

+100
-41
lines changed

3 files changed

+100
-41
lines changed

README.md

+79-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,82 @@
11
ndarray-extract-contour
22
=======================
3+
General purpose contour extraction routine generator. This library has a really horrible interface, but it is pretty flexible. It is mostly useful as an internal component, and should not be used generally unless you know what you are doing.
34

4-
**WORK IN PROGRESS, CHECK BACK LATER**
5+
As an example of a nicer interface built using this module, take a look at [surface-nets](https://github.com/mikolalysenko/surface-nets).
6+
7+
# Example/documentation
8+
9+
```javascript
10+
var generateContour = require("ndarray-extract-contour")
11+
12+
var getContour = generateContour({
13+
order: [1,0], //Order of array iteration
14+
arrayArguments: 2, //Take two arrays as input
15+
scalarArguments: 1, //Take one extra scalar argument
16+
17+
//Function to determine phase of a grid cell
18+
phase: function(a, b, s) {
19+
20+
//a = first array argument
21+
//b = second array argument
22+
//s = scalar argument
23+
24+
return a
25+
},
26+
27+
//Callback for adding vertex to array
28+
vertex: function(x,y, a00,a01,a10,a11, b00,b01,b10,b11, p00,p01,p10,p11, s) {
29+
30+
//Geometry:
31+
//
32+
// a11 ---- a10
33+
// | |
34+
// | |
35+
// | |
36+
// a01 ---- a00
37+
//
38+
39+
//Arguments:
40+
41+
// x,y,... = coordinates of vertex in grid index
42+
// a00,a01,... = components of first array
43+
// b00,b01,... = components of second array
44+
// p00,p01,... = phase of all nearby cells
45+
// s,... = optional scalar arguments
46+
//
47+
},
48+
49+
//Callback for adding cell
50+
cell: function(v0,v1, a0,a1, b0,b1, p0,p1, s) {
51+
52+
// Geometry:
53+
//
54+
// v0
55+
// |
56+
// p0 | p1
57+
// |
58+
// v1
59+
60+
61+
//Arguments:
62+
// v0,v1,... = coordinates of vertices of cuboid cell
63+
// a0,a1 = first array values on front/back cell
64+
// b0,b1 = second array values on front/back cell
65+
// p0,p1 = phase values for front/back cell
66+
// s,... = optional scalar arguments
67+
}
68+
})
69+
70+
71+
//How to use it:
72+
testContour(A, B, S)
73+
```
74+
75+
# Install
76+
77+
```
78+
npm install ndarray-extract-contour
79+
```
80+
81+
# Credits
82+
(c) 2014 Mikola Lysenko. MIT License

contour.js

+12-34
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,6 @@
11
"use strict"
22

3-
//DEBUG
4-
var beautify = require("js-beautify")
5-
63
var pool = require("typedarray-pool")
7-
var gray = require("gray-code")
8-
var invert = require("invert-permutation")
94

105
module.exports = createSurfaceExtractor
116

@@ -62,21 +57,6 @@ var POOL_SIZE = "Q"
6257
var POINTER = "X"
6358
var TEMPORARY = "T"
6459

65-
function fixPerm(face, dimension, k) {
66-
var seq = gray(dimension-1).map(function(f) {
67-
return f.reduce(function(p, x, i) {
68-
return p + (x << i)
69-
}, 0)
70-
})
71-
var x = seq.map(function(y) {
72-
return face[y]
73-
})
74-
if(k & 1) {
75-
x.reverse()
76-
}
77-
return x
78-
}
79-
8060
function permBitmask(dimension, mask, order) {
8161
var r = 0
8262
for(var i=0; i<dimension; ++i) {
@@ -91,7 +71,6 @@ function permBitmask(dimension, mask, order) {
9171
function compileSurfaceProcedure(vertexFunc, faceFunc, phaseFunc, scalarArgs, order, typesig) {
9272
var arrayArgs = typesig.length
9373
var dimension = order.length
94-
var invOrder = invert(order)
9574

9675
if(dimension < 2) {
9776
throw new Error("ndarray-extract-contour: Dimension must be at least 2")
@@ -141,8 +120,8 @@ function compileSurfaceProcedure(vertexFunc, faceFunc, phaseFunc, scalarArgs, or
141120
for(var i=0; i<arrayArgs; ++i) {
142121
for(var j=0; j<dimension; ++j) {
143122
var stepVal = [ stride(i,order[j]) ]
144-
for(var k=j-1; k>=0; --k) {
145-
stepVal.push(stride(i, order[k]) + "*" + shape(order[k]) )
123+
if(j > 0) {
124+
stepVal.push(stride(i, order[j-1]) + "*" + shape(order[j-1]) )
146125
}
147126
vars.push(step(i,order[j]) + "=(" + stepVal.join("-") + ")|0")
148127
}
@@ -217,8 +196,6 @@ function compileSurfaceProcedure(vertexFunc, faceFunc, phaseFunc, scalarArgs, or
217196
for(var i=0; i<scalarArgs; ++i) {
218197
phaseFuncArgs.push(scalar(i))
219198
}
220-
//code.push("console.log('o',p0,X,e1,e2,e3);")
221-
222199
code.push(PHASES, "[", POINTER, "++]=phase(", phaseFuncArgs.join(), ");")
223200
for(var i=0; i<k; ++i) {
224201
forLoopEnd(i)
@@ -246,7 +223,6 @@ function compileSurfaceProcedure(vertexFunc, faceFunc, phaseFunc, scalarArgs, or
246223
for(var i=0; i<scalarArgs; ++i) {
247224
phaseFuncArgs.push(scalar(i))
248225
}
249-
//code.push("console.log(p0,X,e1,e2,e3);")
250226

251227
code.push(pcube(0), "=", PHASES, "[", POINTER, "]=phase(", phaseFuncArgs.join(), ");")
252228

@@ -286,7 +262,6 @@ function compileSurfaceProcedure(vertexFunc, faceFunc, phaseFunc, scalarArgs, or
286262
}
287263

288264
//Generate vertex
289-
code.push("console.log('callv:',i0,i1,N,X,p0,e1,e2,e3,d0_1,d0_2,d0_3);")
290265
code.push("vertex(", vertexArgs.join(), ");",
291266
vert(0), "=", VERTEX_IDS, "[", POINTER, "]=", VERTEX_COUNT, "++;")
292267

@@ -303,16 +278,22 @@ function compileSurfaceProcedure(vertexFunc, faceFunc, phaseFunc, scalarArgs, or
303278
faceArgs.push(VERTEX_IDS + "[" + POINTER + "+" + pdelta(k) + "]")
304279
}
305280
faceArgs.push(vert(0))
306-
faceArgs = fixPerm(faceArgs, dimension, j)
307281
for(var k=0; k<arrayArgs; ++k) {
308-
faceArgs.push(cube(k,base), cube(k,subset))
282+
if(j&1) {
283+
faceArgs.push(cube(k,base), cube(k,subset))
284+
} else {
285+
faceArgs.push(cube(k,subset), cube(k,base))
286+
}
287+
}
288+
if(j&1) {
289+
faceArgs.push(corner, edge)
290+
} else {
291+
faceArgs.push(edge, corner)
309292
}
310-
faceArgs.push(corner, edge)
311293
for(var k=0; k<scalarArgs; ++k) {
312294
faceArgs.push(scalar(k))
313295
}
314296
code.push("if(", corner, "!==", edge, "){",
315-
"console.log('face', i0,i1, ",j,",",mask,");",
316297
"face(", faceArgs.join(), ")}")
317298
}
318299
}
@@ -372,9 +353,6 @@ function compileSurfaceProcedure(vertexFunc, faceFunc, phaseFunc, scalarArgs, or
372353
"}",
373354
"return ", funcName ].join("")
374355

375-
//Print code
376-
console.log(beautify(procedureCode))
377-
378356
var proc = new Function(
379357
"vertex",
380358
"face",

test/test.js

+9-6
Original file line numberDiff line numberDiff line change
@@ -12,19 +12,22 @@ tape("test-vectorize", function(t) {
1212
var testVectorizer = createExtractor({
1313
order: [1, 0],
1414
vertex: function(x, y) {
15-
console.log("v:", x,y)
15+
verts.push([x,y])
1616
},
1717
phase: function(s) {
18-
return s < 0
18+
console.log(s)
19+
return s
1920
},
2021
cell: function(i, j, p0, p1) {
21-
console.log("f:", i,j, p0, p1p1)
22+
cells.push([i,j,p0,p1])
2223
}
2324
})
25+
console.log(verts, cells)
2426

2527
testVectorizer(pack(
26-
[ [0,1,0],
27-
[1,1,1,],
28-
[0,1,0]]))
28+
[ [0,1,0,0],
29+
[0,1,1,1],
30+
[1,1,1,0],
31+
[0,0,1,0] ] ))
2932
t.end()
3033
})

0 commit comments

Comments
 (0)