Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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);
        }