X-Git-Url: http://git.euphorik.ch/?p=master-thesis.git;a=blobdiff_plain;f=Parasitemia%2FParasitemiaCore%2FKdTree.fs;h=ec21a0f35d28491dd91c40149f26ee1a3363d896;hp=3a51aac919bbf82fe83480bcccdbc94fd3b98439;hb=6250f10c807301a760b8659f9c00ca6dbbd4c7b7;hpb=31078fdde95f1b239110dfe29998e9b03e3a9bea diff --git a/Parasitemia/ParasitemiaCore/KdTree.fs b/Parasitemia/ParasitemiaCore/KdTree.fs index 3a51aac..ec21a0f 100644 --- a/Parasitemia/ParasitemiaCore/KdTree.fs +++ b/Parasitemia/ParasitemiaCore/KdTree.fs @@ -94,3 +94,33 @@ type Tree<'a when 'a :> I2DCoords> = searchWithRegion this { minX = Single.MinValue; maxX = Single.MaxValue; minY = Single.MinValue; maxY = Single.MaxValue } 1 result + + [] + member this.SearchOld (searchRegion : Region) : 'a list = + let rec valuesFrom (tree : Tree<'a>) (acc : 'a list) : 'a list = + match tree with + | Node (_, left, right) -> (valuesFrom right (valuesFrom left acc)) + | Leaf v -> v :: acc + + let rec searchWithRegion (tree : Tree<'a>) (currentRegion : Region) (depth : int) : 'a list = + match tree with + | Leaf v -> if searchRegion.Contains v.X v.Y then [v] else [] + | Node (splitValue, part1, part2) -> + let valuesInRegion (region : Region) (treeRegion : Tree<'a>) = + if region.IsSub searchRegion then + valuesFrom treeRegion [] + elif region.Intersects searchRegion then + searchWithRegion treeRegion region (depth + 1) + else + [] + + if depth % 2 = 1 then // Vertical splitting. + let leftRegion = { currentRegion with maxX = splitValue } + let rightRegion = { currentRegion with minX = splitValue } + (valuesInRegion leftRegion part1) @ (valuesInRegion rightRegion part2) + else // Horizontal splitting. + let downRegion = { currentRegion with maxY = splitValue } + let upRegion = { currentRegion with minY = splitValue } + (valuesInRegion downRegion part1) @ (valuesInRegion upRegion part2) + + searchWithRegion this { minX = Single.MinValue; maxX = Single.MaxValue; minY = Single.MinValue; maxY = Single.MaxValue } 1