Beispiel #1
0
        private KdNode Split(KdNode node, int depth)
        {
            var splitValue = GetMedian(node.mesh.triangles, depth);

            var(left, right, middle) = SplitTriangle(node.mesh.triangles, depth, splitValue);
            if (middle.Count == node.mesh.triangles.Count)
            {
                return(node);
            }
            var leftNode   = BuildNode(left, depth + 1);
            var middleNode = BuildNode(middle, depth + 1);
            var rightNode  = BuildNode(right, depth + 1);

            node.children.Add(leftNode);
            node.children.Add(middleNode);
            node.children.Add(rightNode);
            return(node);
        }
Beispiel #2
0
        private KdNode BuildNode(List <Triangle> triangles, int depth)
        {
            var node = new KdNode(triangles);

            return(triangles.Count <= MinNumberOfTriangles || depth >= MaxDepth ? node : Split(node, depth));
        }
Beispiel #3
0
 public KdTree(List <Triangle> triangles)
 {
     root = BuildNode(triangles, 0);
 }