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); }
private KdNode BuildNode(List <Triangle> triangles, int depth) { var node = new KdNode(triangles); return(triangles.Count <= MinNumberOfTriangles || depth >= MaxDepth ? node : Split(node, depth)); }
public KdTree(List <Triangle> triangles) { root = BuildNode(triangles, 0); }