Vector <double> getEdgePoint(Vector <double> a, Vector <double> b, double valA, double valB) { double sample; Vector <double> point; do { point = (a + b) / 2.0; sample = surface.sample(point); if (Math.Sign(sample) == Math.Sign(valA)) { a = point; valA = sample; } else { b = point; valB = sample; } } while(sample < 0.02); return(point); }
Cell(double originalSize, int level, int maxLevel, Vector <double> pos, IsoSurface surface, Cell parent) { this.originalSize = originalSize; this.level = level; this.maxLevel = maxLevel; this.pos = pos; this.parent = parent; size = originalSize / Math.Pow(2, level); points = new double[(int)Math.Pow(2, pos.Count)]; int sign = 0; for (int i = 0; i < points.Length; i++) { var vector = posToVector(pointIndexToPos(i)); points[i] = surface.sample(pos + vector); if (signed) { continue; } int thisSign = Math.Sign(points[i]); if (sign == 0) { sign = thisSign; } if (sign != thisSign) { setSigned(); } sign = thisSign; } if (!signed) { if (parent != null) { if (parent.signed) { return; } } } if (level == maxLevel) { } else { children = new Cell[points.Length]; for (int i = 0; i < children.Length; i++) { var vector = posToVector(pointIndexToPos(i)) * 0.5; children[i] = new Cell(originalSize, level + 1, maxLevel, pos + vector, surface, this); } } }