Skip to content

Commit e586fb0

Browse files
committed
fix thin edges - sharp slices
1 parent 4d922a7 commit e586fb0

File tree

1 file changed

+36
-31
lines changed

1 file changed

+36
-31
lines changed

src/traces/isosurface/convert.js

Lines changed: 36 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -393,14 +393,28 @@ function generateIsosurfaceMesh(data) {
393393
return xyzv;
394394
}
395395

396-
function tryCreateTri(style, xyzv, abc, min, max, isSecondPass) {
396+
var MAX_PASS = 3;
397+
398+
function tryCreateTri(style, xyzv, abc, min, max, nPass) {
399+
400+
if(!nPass) nPass = 1;
397401

398402
abc = [-1, -1, -1]; // Note: for the moment we override indices
399403
// to run faster! But it is possible to comment this line
400404
// to reduce the number of vertices.
401405

402406
var result = false;
403407

408+
var ok = [
409+
inRange(xyzv[0][3], min, max),
410+
inRange(xyzv[1][3], min, max),
411+
inRange(xyzv[2][3], min, max)
412+
];
413+
414+
if(!ok[0] && !ok[1] && !ok[2]) {
415+
return false;
416+
}
417+
404418
var tryDrawTri = function(style, xyzv, abc) {
405419
if( // we check here if the points are in `real` iso-min/max range
406420
almostInFinalRange(xyzv[0][3]) &&
@@ -409,28 +423,18 @@ function generateIsosurfaceMesh(data) {
409423
) {
410424
drawTri(style, xyzv, abc);
411425
return true;
412-
} else if(!isSecondPass) {
413-
return tryCreateTri(style, xyzv, abc, vMin, vMax, true); // i.e. second pass
426+
} else if(nPass < MAX_PASS) {
427+
return tryCreateTri(style, xyzv, abc, vMin, vMax, ++nPass); // i.e. second pass using actual vMin vMax bounds
414428
}
415429
return false;
416430
};
417431

418-
var ok = [
419-
inRange(xyzv[0][3], min, max),
420-
inRange(xyzv[1][3], min, max),
421-
inRange(xyzv[2][3], min, max)
422-
];
423-
424-
var interpolated = false;
425-
426-
if(!ok[0] && !ok[1] && !ok[2]) {
427-
return false;
428-
}
429-
430432
if(ok[0] && ok[1] && ok[2]) {
431433
return tryDrawTri(style, xyzv, abc) || result;
432434
}
433435

436+
var interpolated = false;
437+
434438
[
435439
[0, 1, 2],
436440
[2, 0, 1],
@@ -486,8 +490,6 @@ function generateIsosurfaceMesh(data) {
486490
inRange(xyzv[3][3], min, max)
487491
];
488492

489-
var interpolated = false;
490-
491493
if(!ok[0] && !ok[1] && !ok[2] && !ok[3]) {
492494
return result;
493495
}
@@ -499,6 +501,8 @@ function generateIsosurfaceMesh(data) {
499501
return result;
500502
}
501503

504+
var interpolated = false;
505+
502506
[
503507
[0, 1, 2, 3],
504508
[3, 0, 1, 2],
@@ -615,10 +619,14 @@ function generateIsosurfaceMesh(data) {
615619
return result;
616620
}
617621

618-
function addRect(style, a, b, c, d, min, max, previousResult) {
622+
function addRect(style, a, b, c, d, min, max
623+
// , previousResult
624+
) {
619625
return [
620-
(previousResult[0] === true) ? true : tryCreateTri(style, getXYZV([a, b, c]), [a, b, c], min, max),
621-
(previousResult[1] === true) ? true : tryCreateTri(style, getXYZV([c, d, a]), [c, d, a], min, max)
626+
// (previousResult[0] === true) ? true :
627+
tryCreateTri(style, getXYZV([a, b, c]), [a, b, c], min, max),
628+
// (previousResult[1] === true) ? true :
629+
tryCreateTri(style, getXYZV([c, d, a]), [c, d, a], min, max)
622630
];
623631
}
624632

@@ -676,17 +684,14 @@ function generateIsosurfaceMesh(data) {
676684
function begin3dCell(style, p000, p001, p010, p011, p100, p101, p110, p111, min, max, isEven) {
677685
// used to create spaceframe and/or iso-surfaces
678686

679-
var result = false;
680687
var cellStyle = style;
681688
if(isEven) {
682689
if(drawingSurface && style === 'even') cellStyle = null;
683-
result = addCube(cellStyle, p000, p001, p010, p011, p100, p101, p110, p111, min, max) || result;
690+
return addCube(cellStyle, p000, p001, p010, p011, p100, p101, p110, p111, min, max);
684691
} else {
685692
if(drawingSurface && style === 'odd') cellStyle = null;
686-
result = addCube(cellStyle, p111, p110, p101, p100, p011, p010, p001, p000, min, max) || result;
693+
return addCube(cellStyle, p111, p110, p101, p100, p011, p010, p001, p000, min, max);
687694
}
688-
689-
return result;
690695
}
691696

692697
function draw2dX(style, items, min, max, previousResult) {
@@ -705,7 +710,7 @@ function generateIsosurfaceMesh(data) {
705710
min,
706711
max,
707712
(i + j + k) % 2,
708-
(previousResult && previousResult[n]) ? previousResult[n] : [false, false]
713+
(previousResult && previousResult[n]) ? previousResult[n] : []
709714
)
710715
);
711716
n++;
@@ -731,7 +736,7 @@ function generateIsosurfaceMesh(data) {
731736
min,
732737
max,
733738
(i + j + k) % 2,
734-
(previousResult && previousResult[n]) ? previousResult[n] : [false, false]
739+
(previousResult && previousResult[n]) ? previousResult[n] : []
735740
)
736741
);
737742
n++;
@@ -757,7 +762,7 @@ function generateIsosurfaceMesh(data) {
757762
min,
758763
max,
759764
(i + j + k) % 2,
760-
(previousResult && previousResult[n]) ? previousResult[n] : [false, false]
765+
(previousResult && previousResult[n]) ? previousResult[n] : []
761766
)
762767
);
763768
n++;
@@ -810,7 +815,7 @@ function generateIsosurfaceMesh(data) {
810815
for(var j = 1; j < height; j++) {
811816
result.push(
812817
beginSection(style, i, j, k, min, max, distRatios[q],
813-
(previousResult && previousResult[n]) ? previousResult[n] : [false, false]
818+
(previousResult && previousResult[n]) ? previousResult[n] : []
814819
)
815820
);
816821
n++;
@@ -829,7 +834,7 @@ function generateIsosurfaceMesh(data) {
829834
for(var k = 1; k < depth; k++) {
830835
result.push(
831836
beginSection(style, i, j, k, min, max, distRatios[q],
832-
(previousResult && previousResult[n]) ? previousResult[n] : [false, false]
837+
(previousResult && previousResult[n]) ? previousResult[n] : []
833838
)
834839
);
835840
n++;
@@ -848,7 +853,7 @@ function generateIsosurfaceMesh(data) {
848853
for(var i = 1; i < width; i++) {
849854
result.push(
850855
beginSection(style, i, j, k, min, max, distRatios[q],
851-
(previousResult && previousResult[n]) ? previousResult[n] : [false, false]
856+
(previousResult && previousResult[n]) ? previousResult[n] : []
852857
)
853858
);
854859
n++;

0 commit comments

Comments
 (0)