protected void GenerateNewDisplayZoom(Item query, int layerId, int nResults)
        {
            Display.Clear();

            Item[]      zoomItems    = Mles.SearchKNN(query, query.ClusterItems, nResults, HasItemDroppedOut);
            List <Item> displayItems = new List <Item>(zoomItems);

            LoopAddLayerItems(query, layerId, nResults, displayItems);
            IncrementDisplayedCount(displayItems);

            Display = displayItems;
        }
 protected Item SelectRandomItem()
 {
     Item[] nearestItems = Mles.SearchKNN(SearchedItem, Display.ToArray(), BrowsingCoherence, item => false);
     if (nearestItems.Length == 1)
     {
         return(nearestItems[0]);
     }
     else
     {
         return(nearestItems[random.Next(nearestItems.Length - 1)]);
     }
 }
        protected void LoopAddLayerItems(Item query, int layerId, int nResults, List <Item> displayItems)
        {
            int loopWatchdog = 0;

            while (displayItems.Count < nResults)
            {
                // not enough items in zoomed cluster, add additional files from outside the cluster but from the same layer
                int    nAdditionalResults = nResults - displayItems.Count;
                Item[] additionalItems    = Mles.SearchKNN(query, layerId, nAdditionalResults, HasItemDroppedOut, displayItems);
                displayItems.AddRange(additionalItems);

                if (loopWatchdog++ > 10)
                {
                    throw new NotImplementedException("Trouble filling whole display...");
                }
            }
        }