diff --git a/src/UglyToad.PdfPig.DocumentLayoutAnalysis/KdTree.cs b/src/UglyToad.PdfPig.DocumentLayoutAnalysis/KdTree.cs index 8d5a10b8..b6fbf07c 100644 --- a/src/UglyToad.PdfPig.DocumentLayoutAnalysis/KdTree.cs +++ b/src/UglyToad.PdfPig.DocumentLayoutAnalysis/KdTree.cs @@ -89,16 +89,56 @@ array[i] = new KdTreeElement(i, elementsPointFunc(el), el); } +#if NET6_0_OR_GREATER + Root = BuildTree(new Span>(array)); +#else Root = BuildTree(new ArraySegment>(array)); +#endif } +#if NET6_0_OR_GREATER + private KdTreeNode BuildTree(Span> P, int depth = 0) + { + if (P.Length == 0) + { + return null; + } + + if (P.Length == 1) + { + return new KdTreeLeaf(P[0], depth); + } + + if (depth % 2 == 0) + { + P.Sort(kdTreeComparerX); + } + else + { + P.Sort(kdTreeComparerY); + } + + if (P.Length == 2) + { + return new KdTreeNode(new KdTreeLeaf(P[0], depth + 1), null, P[1], depth); + } + + int median = P.Length / 2; + + KdTreeNode vLeft = BuildTree(P.Slice(0, median), depth + 1); + KdTreeNode vRight = BuildTree(P.Slice(median + 1), depth + 1); + + return new KdTreeNode(vLeft, vRight, P[median], depth); + } +#else private KdTreeNode BuildTree(ArraySegment> P, int depth = 0) { if (P.Count == 0) { return null; } - else if (P.Count == 1) + + if (P.Count == 1) { return new KdTreeLeaf(P.GetAt(0), depth); } @@ -124,6 +164,7 @@ return new KdTreeNode(vLeft, vRight, P.GetAt(median), depth); } +#endif #region NN ///