コード例 #1
0
ファイル: KDTree.cs プロジェクト: Arnyev/MG
        public KDTree(SimpleMesh meshA, SimpleMesh meshB, bool additionalSplit)
        {
            var indicesA = Enumerable.Range(0, meshA.Indices.Count).ToList();
            var indicesB = Enumerable.Range(0, meshB.Indices.Count).ToList();

            var minValues = Vector3.Min(meshA.MinValues, meshB.MinValues);
            var maxValues = Vector3.Max(meshA.MaxValues, meshB.MaxValues);

            StartingNode = new KDTreeNode(indicesA, indicesB, meshA, meshB, 0, Dimension.X, minValues, maxValues, additionalSplit);
        }
コード例 #2
0
ファイル: KDTree.cs プロジェクト: Arnyev/MG
        private void PrepareChildNodes(List <int> triangleIndicesA, List <int> triangleIndicesB, SimpleMesh meshA,
                                       SimpleMesh meshB, int level,
                                       Dimension dimension, Vector3 minValues, Vector3 maxValues)
        {
            MyIndicesA = new List <int>();
            var smallerTriangleIndicesA = new List <int>();
            var biggerTriangleIndicesA  = new List <int>();

            MyIndicesB = new List <int>();
            var smallerTriangleIndicesB = new List <int>();
            var biggerTriangleIndicesB  = new List <int>();

            var     nextDim = NextDimension(dimension);
            Vector3 mid1;
            Vector3 mid2;

            switch (dimension)
            {
            case Dimension.X:
                var midX = (MinValues.X + MaxValues.X) / 2;
                SplitByX(triangleIndicesA, MyIndicesA, meshA, biggerTriangleIndicesA, smallerTriangleIndicesA,
                         midX);
                SplitByX(triangleIndicesB, MyIndicesB, meshB, biggerTriangleIndicesB, smallerTriangleIndicesB,
                         midX);
                mid1 = new Vector3(midX, maxValues.Y, maxValues.Z);
                mid2 = new Vector3(midX, minValues.Y, minValues.Z);
                break;

            case Dimension.Y:
                var midY = (MinValues.Y + MaxValues.Y) / 2;
                SplitByY(triangleIndicesA, MyIndicesA, meshA, biggerTriangleIndicesA, smallerTriangleIndicesA,
                         midY);
                SplitByY(triangleIndicesB, MyIndicesB, meshB, biggerTriangleIndicesB, smallerTriangleIndicesB,
                         midY);
                mid1 = new Vector3(maxValues.X, midY, maxValues.Z);
                mid2 = new Vector3(minValues.X, midY, minValues.Z);
                break;

            default:
            case Dimension.Z:
                var midZ = (MinValues.Z + MaxValues.Z) / 2;
                SplitByZ(triangleIndicesA, MyIndicesA, meshA, biggerTriangleIndicesA, smallerTriangleIndicesA,
                         midZ);
                SplitByZ(triangleIndicesB, MyIndicesB, meshB, biggerTriangleIndicesB, smallerTriangleIndicesB,
                         midZ);
                mid1 = new Vector3(maxValues.X, maxValues.Y, midZ);
                mid2 = new Vector3(minValues.X, minValues.Y, midZ);
                break;
            }

            if (triangleIndicesA.Count * triangleIndicesB.Count > MyIndicesA.Count * MyIndicesB.Count * 2)
            {
                Smaller = new KDTreeNode(smallerTriangleIndicesA, smallerTriangleIndicesB, meshA, meshB, level + 1,
                                         nextDim, minValues, mid1, _additionalSplit);

                Bigger = new KDTreeNode(biggerTriangleIndicesA, biggerTriangleIndicesB, meshA, meshB, level + 1,
                                        nextDim, mid2, maxValues, _additionalSplit);
            }
            else
            {
                MyIndicesA = triangleIndicesA;
                MyIndicesB = triangleIndicesB;
            }
        }