private double MinMarginDiv(IComparer <Leaf> comparer) { int k = _maxChild - 2 * _minChild + 2; Leaf[] sorted = GetChilds().Select(node => (Leaf)node).ToArray(); Array.Sort(sorted, comparer); double[] S = new double[k]; for (int i = 1; i <= k; i++) { MBB mbb1 = new MBB(); MBB mbb2 = new MBB(); for (int j = 0; j < sorted.Length; j++) { if (j < _minChild - 1 + i) { mbb1.AddTriangle(sorted[j].Triangle); } else { mbb2.AddTriangle(sorted[j].Triangle); } } S[i - 1] = mbb1.Margin + mbb2.Margin; } (double result, _) = MinOfArray(S); return(result); }
private int ChooseSplitIndex(Leaf[] sortedLeaf) { int k = _maxChild - 2 * _minChild + 2; double[] overlapShapes = new double[k]; double[] volumes = new double[k]; for (int i = 1; i <= k; i++) { MBB mbb1 = new MBB(); MBB mbb2 = new MBB(); for (int j = 0; j < sortedLeaf.Length; j++) { if (j < _minChild - 1 + i) { mbb1.AddTriangle(sortedLeaf[j].Triangle); } else { mbb2.AddTriangle(sortedLeaf[j].Triangle); } } overlapShapes[i - 1] = MBB.CheckOverlapVolume(mbb1, mbb2); volumes[i - 1] = mbb1.Volume + mbb2.Volume; } (double minOverlap, int splitIndex) = MinOfArray(overlapShapes); int repeatedMinOverlap = 0; for (int i = 0; i < overlapShapes.Length; i++) { if (overlapShapes[i] == minOverlap) { repeatedMinOverlap++; } } if (repeatedMinOverlap == 1) { return(splitIndex + _minChild); } (_, splitIndex) = MinOfArray(volumes); return(splitIndex + _minChild); }