(This is in response to a code request to find the closest value given the pixel coordinate.)
, , "" , , , , , ...
, X X:
private double calcCursorGraphX(int clientX)
{
var xAxis = _chart.ChartAreas[CHART_INDEX].AxisX;
int xRight = (int) xAxis.ValueToPixelPosition(xAxis.Maximum) - 1;
int xLeft = (int) xAxis.ValueToPixelPosition(xAxis.Minimum);
if (clientX > xRight)
{
return xAxis.Maximum;
}
else if (clientX < xLeft)
{
return xAxis.Minimum;
}
else
{
return xAxis.PixelPositionToValue(clientX);
}
}
X, , :
private int nearestPreceedingValue(double x)
{
var bpData = _chart.Series[SERIES_INDEX].Points;
int bpIndex = bpData.BinarySearch(x, (xVal, point) => Math.Sign(x - point.XValue));
if (bpIndex < 0)
{
bpIndex = ~bpIndex;
bpIndex = Math.Max(0, bpIndex-1);
}
return bpIndex;
}
, _chart.Series[SERIES_INDEX].Points
, , , .
[EDIT] BinarySearch. - . "" , .
public static int BinarySearch<TItem, TSearch>(this IList<TItem> list, TSearch value, Func<TSearch, TItem, int> comparer)
{
Contract.Requires(list != null);
Contract.Requires(comparer != null);
int lower = 0;
int upper = list.Count - 1;
while (lower <= upper)
{
int middle = lower + (upper - lower) / 2;
int comparisonResult = comparer(value, list[middle]);
if (comparisonResult < 0)
{
upper = middle - 1;
}
else if (comparisonResult > 0)
{
lower = middle + 1;
}
else
{
return middle;
}
}
return ~lower;
}