示例#1
0
        private Branch ChooseSubtree(Triangle triangle)
        {
            Branch currentBranch = _root;

            currentBranch.RefindVolume(triangle);

            while (true)
            {
                if (currentBranch.GetNodeType() == "PreBranch")
                {
                    return(currentBranch);
                }

                Branch childBranch1 = (Branch)currentBranch.GetChilds()[0];
                Branch childBranch2 = (Branch)currentBranch.GetChilds()[1];
                if (childBranch1.GetNodeType() == "PreBranch")
                {
                    if (MBB.CheckOverlapChange(childBranch1.MBB, childBranch2.MBB, triangle.Center) !=
                        0)
                    {
                        currentBranch = MBB.CheckOverlapChange(childBranch1.MBB, childBranch2.MBB, triangle.Center) > 0
                            ? childBranch1
                            : childBranch2;
                    }
                    else
                    {
                        if (MBB.CheckVolumeChange(childBranch1.MBB, childBranch2.MBB, triangle.Center) != 0)
                        {
                            currentBranch = MBB.CheckVolumeChange(childBranch1.MBB, childBranch2.MBB, triangle.Center) > 0
                                ? childBranch1
                                : childBranch2;
                        }
                        else
                        {
                            currentBranch = childBranch1.MBB.Volume <= childBranch2.MBB.Volume
                                ? childBranch1
                                : childBranch2;
                        }
                    }
                }

                else
                {
                    if (MBB.CheckVolumeChange(childBranch1.MBB, childBranch2.MBB, triangle.Center) != 0)
                    {
                        currentBranch = MBB.CheckVolumeChange(childBranch1.MBB, childBranch2.MBB, triangle.Center) > 0
                            ? childBranch1
                            : childBranch2;
                    }
                    else
                    {
                        currentBranch = childBranch1.MBB.Volume <= childBranch2.MBB.Volume
                            ? childBranch1
                            : childBranch2;
                    }
                }

                currentBranch.RefindVolume(triangle);
            }
        }
示例#2
0
        public static double CheckOverlapChange(MBB mbb1, MBB mbb2, Point trCenter)
        {
            MBB[]    mbbs           = { mbb1, mbb2 };
            double[] overlapChanges = new double[2];
            for (int i = 0; i < 2; i++)
            {
                double volume1 = CheckOverlapVolume(mbbs[i], mbbs[(i + 1) % 2]);

                double xMax = trCenter.x > mbbs[i]._xMax ? trCenter.x : mbbs[i]._xMax;
                double yMax = trCenter.y > mbbs[i]._yMax ? trCenter.y : mbbs[i]._yMax;
                double zMax = trCenter.z > mbbs[i]._zMax ? trCenter.z : mbbs[i]._zMax;

                double xMin = trCenter.x < mbbs[i]._xMin ? trCenter.x : mbbs[i]._xMin;
                double yMin = trCenter.y < mbbs[i]._yMin ? trCenter.y : mbbs[i]._yMin;
                double zMin = trCenter.z < mbbs[i]._zMin ? trCenter.z : mbbs[i]._zMin;

                MBB newMbb = new MBB();
                newMbb.AddPoint(new Point(xMax, yMax, zMax));
                newMbb.AddPoint(new Point(xMin, yMin, zMin));


                double volume2 = CheckOverlapVolume(newMbb, mbbs[(i + 1) % 2]);

                overlapChanges[i] = volume2 - volume1;
            }

            return(overlapChanges[1] - overlapChanges[0]);
        }
示例#3
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);
        }
示例#4
0
        private static double CheckVolumeChange(MBB mbb, Point trCenter)
        {
            double xMax = trCenter.x > mbb._xMax ? trCenter.x : mbb._xMax;
            double yMax = trCenter.y > mbb._yMax ? trCenter.y : mbb._yMax;
            double zMax = trCenter.z > mbb._zMax ? trCenter.z : mbb._zMax;

            double xMin = trCenter.x < mbb._xMin ? trCenter.x : mbb._xMin;
            double yMin = trCenter.y < mbb._yMin ? trCenter.y : mbb._yMin;
            double zMin = trCenter.z < mbb._zMin ? trCenter.z : mbb._zMin;

            double volumeChange = (xMax - xMin) * (yMax - yMin) * (zMax - zMin) - mbb.Volume;

            return(volumeChange);
        }
示例#5
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);
        }
示例#6
0
        public static double CheckOverlapVolume(MBB mbb1, MBB mbb2)
        {
            double xMin = Math.Max(mbb1._xMin, mbb2._xMin);
            double xMax = Math.Min(mbb1._xMax, mbb2._xMax);
            double yMin = Math.Max(mbb1._yMin, mbb2._yMin);
            double yMax = Math.Min(mbb1._yMax, mbb2._yMax);
            double zMin = Math.Max(mbb1._zMin, mbb2._zMin);
            double zMax = Math.Min(mbb1._zMax, mbb2._zMax);

            if (mbb1._xMax <= mbb2._xMin || mbb2._xMax <= mbb1._xMin ||
                mbb1._yMax <= mbb2._yMin || mbb2._yMax <= mbb1._yMin ||
                mbb1._zMax <= mbb2._zMin || mbb2._zMax <= mbb1._zMin)
            {
                return(0);
            }

            MBB newMbb = new MBB(new(xMin, yMin, zMin), new(xMax, yMax, zMax));

            return(newMbb.Volume);
        }
示例#7
0
 public static double CheckVolumeChange(MBB mbb1, MBB mbb2, Point trCenter)
 {
     return(CheckVolumeChange(mbb2, trCenter) - CheckVolumeChange(mbb1, trCenter));
 }
示例#8
0
 public Branch(Branch mother, MBB mbb)
 {
     _mother = mother;
     _mbb    = mbb;
 }
示例#9
0
 public Branch(List <Node> childs, Branch mother, MBB mbb)
 {
     _childs = childs;
     _mother = mother;
     _mbb    = mbb;
 }
示例#10
0
 private void InitMBB(Triangle triangle)
 {
     _mbb = new MBB(triangle);
 }