1 : |
jhr |
1115 |
// iso2d
|
2 : |
|
|
//
|
3 : |
|
|
// Demo of finding isocontours via Newton-Raphson method.
|
4 : |
|
|
// Initializes positions on a grid, and each update applies one
|
5 : |
|
|
// step of Newton-Raphson.
|
6 : |
|
|
//
|
7 : |
|
|
// Process output with:
|
8 : |
jhr |
1640 |
// unu jhisto -i iso2d.txt -b 512 512 -min 0 0 -max 1 1 | unu 2op neq - 0 | unu quantize -b 8 -o iso2d.png
|
9 : |
jhr |
1115 |
|
10 : |
|
|
int gridSize = 300;
|
11 : |
glk |
1134 |
field#1(2)[] F = ctmr ⊛ load("../data/ddro-80.nrrd");
|
12 : |
jhr |
1115 |
int stepsMax = 10;
|
13 : |
|
|
real epsilon = 0.0001;
|
14 : |
|
|
|
15 : |
|
|
strand sample (int ui, int vi) {
|
16 : |
|
|
output vec2 pos = [lerp(0.0, 1.0, -0.5, real(ui), real(gridSize)-0.5),
|
17 : |
|
|
lerp(0.0, 1.0, -0.5, real(vi), real(gridSize)-0.5)];
|
18 : |
|
|
// set the isvalue to 50, 30, or 10, depending on whichever we're closest to
|
19 : |
glk |
1134 |
real isoval = 50.0 if F(pos) >= 40.0
|
20 : |
|
|
else 30.0 if F(pos) >= 20.0
|
21 : |
|
|
else 10.0;
|
22 : |
jhr |
1115 |
int steps = 0;
|
23 : |
|
|
update {
|
24 : |
|
|
// We bail if we're no longer inside or taken too many steps.
|
25 : |
|
|
if (!inside(pos, F) || steps > stepsMax) {
|
26 : |
jhr |
1131 |
die;
|
27 : |
jhr |
1115 |
}
|
28 : |
glk |
1329 |
// GLKs recent changes (revision 1329) were made to make the code
|
29 : |
|
|
// a more obvious implementation of Newton-Raphson, and also to create
|
30 : |
|
|
// some obvious and not-so-obvious opportunties for optimization
|
31 : |
jhr |
1115 |
vec2 grad = ∇F(pos);
|
32 : |
glk |
1329 |
if (|grad| == 0.0) { // can't compute step if |∇F|, so have to bail
|
33 : |
jhr |
1131 |
die;
|
34 : |
jhr |
1115 |
}
|
35 : |
glk |
1329 |
vec2 norm = normalize(grad);
|
36 : |
|
|
vec2 delta = -((F(pos) - isoval)/|grad|)*norm; // Newton-Raphson step
|
37 : |
|
|
if (|delta| < epsilon) { // we've converged if step is small enough
|
38 : |
jhr |
1115 |
stabilize;
|
39 : |
|
|
}
|
40 : |
glk |
1329 |
pos += delta;
|
41 : |
|
|
steps += 1;
|
42 : |
jhr |
1115 |
}
|
43 : |
|
|
}
|
44 : |
|
|
|
45 : |
|
|
initially { sample(ui, vi) | vi in 0..(gridSize-1), ui in 0..(gridSize-1) };
|