public SearchResult1d SearchXBetween(double x, SearchResult1d result) { if (collection.Count == 0) return SearchResult1d.Empty; int lastIndex = collection.Count - 1; if (x < collection[0].X) return SearchResult1d.Empty; else if (collection[lastIndex].X < x) return SearchResult1d.Empty; int startIndex = !result.IsEmpty ? Math.Min(result.Index, lastIndex) : 0; // searching ascending if (collection[startIndex].X < x) { for (int i = startIndex + 1; i <= lastIndex; i++) if (collection[i].X >= x) return new SearchResult1d { Index = i - 1 }; } else // searching descending { for (int i = startIndex - 1; i >= 0; i--) if (collection[i].X <= x) return new SearchResult1d { Index = i }; } throw new InvalidOperationException("Should not appear here."); }
public SearchResult1d SearchXBetween(double x, SearchResult1d result) { if (collection.Count == 0) { return(SearchResult1d.Empty); } int lastIndex = collection.Count - 1; if (x < collection[0].X) { return(SearchResult1d.Empty); } if (collection[lastIndex].X < x) { return(SearchResult1d.Empty); } int startIndex = !result.IsEmpty ? Math.Min(result.Index, lastIndex) : 0; // searching ascending if (collection[startIndex].X < x) { for (int i = startIndex + 1; i <= lastIndex; i++) { if (collection[i].X >= x) { return new SearchResult1d { Index = i - 1 } } } ; } else // searching descending { for (int i = startIndex - 1; i >= 0; i--) { if (collection[i].X <= x) { return new SearchResult1d { Index = i } } } ; } throw new InvalidOperationException("Should not appear here."); }
public SearchResult1d SearchBetween(TMember x, SearchResult1d result) { if (collection.Count == 0) { return(SearchResult1d.Empty); } int lastIndex = collection.Count - 1; if (x.CompareTo(selector(collection[0])) < 0) { return(SearchResult1d.Empty); } else if (selector(collection[lastIndex]).CompareTo(x) < 0) { return(SearchResult1d.Empty); } int startIndex = !result.IsEmpty ? Math.Min(result.Index, lastIndex) : 0; // searching ascending if (selector(collection[startIndex]).CompareTo(x) < 0) { for (int i = startIndex + 1; i <= lastIndex; i++) { if (selector(collection[i]).CompareTo(x) >= 0) { return new SearchResult1d { Index = i - 1 } } } ; } else // searching descending { for (int i = startIndex - 1; i >= 0; i--) { if (selector(collection[i]).CompareTo(x) <= 0) { return new SearchResult1d { Index = i } } } ; } throw new InvalidOperationException("Should not appear here."); }
public SearchResult1d SearchFirstLess(TMember x) { if (collection.Count == 0) { return(SearchResult1d.Empty); } SearchResult1d result = SearchResult1d.Empty; for (int i = 0; i < collection.Count; i++) { if (selector(collection[i]).CompareTo(x) >= 0) { result.Index = i; break; } } return(result); }
public SearchResult1d SearchGreater(TMember x) { if (collection.Count == 0) { return(SearchResult1d.Empty); } SearchResult1d result = SearchResult1d.Empty; for (int i = collection.Count - 1; i >= 0; i--) { if (selector(collection[i]).CompareTo(x) <= 0) { result.Index = i; break; } } return(result); }
private void UpdateUIRepresentation() { if (Plotter == null) return; PointsGraphBase source = this.PointSource; if (source == null || (source != null && source.VisiblePoints == null)) { SetValue(MarkerPositionPropertyKey, new Point(Double.NaN, Double.NaN)); marker.Visibility = Visibility.Hidden; return; } else { Point mousePos = Mouse.GetPosition(Plotter.CentralGrid); var transform = Plotter.Transform; Point viewportPos = mousePos.ScreenToViewport(transform); double x = viewportPos.X; searchResult = searcher.SearchXBetween(x, searchResult); SetValue(ClosestPointIndexPropertyKey, searchResult.Index); if (!searchResult.IsEmpty) { marker.Visibility = Visibility.Visible; IList<Point> points = source.VisiblePoints; Point ptBefore = points[searchResult.Index]; Point ptAfter = points[searchResult.Index + 1]; double ratio = (x - ptBefore.X) / (ptAfter.X - ptBefore.X); double y = ptBefore.Y + (ptAfter.Y - ptBefore.Y) * ratio; Point temp = new Point(x, y); SetX(marker, temp.X); SetY(marker, temp.Y); Point markerPosition = temp; followDataContext.Position = markerPosition; SetValue(MarkerPositionPropertyKey, markerPosition); } else { SetValue(MarkerPositionPropertyKey, new Point(Double.NaN, Double.NaN)); marker.Visibility = Visibility.Hidden; } } }