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); }
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; } }