Как увеличить масштаб от точки, например, от 300 до 500 осей X и от 50 до 100 осей, шаг за шагом
Текущее местоположение
private void chart1_MouseClick (отправитель объекта, MouseEventArgs e) {
lastPoint = e.Location;
}
Масштабирование X и Y
private void btnZoomXY_Click(object sender, EventArgs e)
{
step = (int)(chart1.ChartAreas["ChartArea1"].AxisX.Maximum - lastPoint.X ) / 20;
if (zoomx > chart1.ChartAreas["ChartArea1"].AxisX.Maximum)
{
zoomx -= step;
}
else
zoomx += step;
this.chart1.ChartAreas["ChartArea1"].AxisX.ScaleView.Zoom(lastPoint.X+ zoomx, this.chart1.ChartAreas["ChartArea1"].AxisX.Maximum - zoomx);
if (Mode == SpectometrMode.Absorbance)
{
step1 = 0.2f;
}
else
step1 = (int)(chart1.ChartAreas["ChartArea1"].AxisY.Maximum - lastPoint.Y) / 20;
if (zoomY > chart1.ChartAreas["ChartArea1"].AxisY.Maximum)
{
zoomY -= step1;
}
else
zoomY += step1;
this.chart1.ChartAreas["ChartArea1"].AxisY.ScaleView.Zoom(lastPoint.Y+ zoomY, this.chart1.ChartAreas["ChartArea1"].AxisY.Maximum - zoomY);
chart1.ChartAreas[0].AxisX.LabelStyle.Format = "{0}";
}
@taW
Вот решение, которое будет увеличивать в 2 раза с каждым кликом.
Он использует переменную span
в качестве диапазона значений, которые будут видны в увеличенном виде.
Он также перемещает позицию щелчка к следующей ближайшей DataPoint
. Вы можете удалить это, чтобы разрешить увеличение позиций между DataPoints
.
Давайте посмотрим на это в действии:
Обратите внимание, что первая проблема с вашим кодом - это используемые вами координаты.
Это три (!) Системы координат в MSChart
:
MouseClick
Axis
ElementPositions
т.е. проценты, связанные со следующим более высоким контейнеромВаша основная проблема заключается в том, что вы смешиваете пиксели со значениями, что приводит к хаосу.
Вам необходимо преобразовать пиксели в значения, как показано в коде.
Вот переменные, которые я использую:
double span = 0; // axis range in values
Point lastPoint = Point.Empty; // the clicked position
PointF clickedValues = PointF.Empty; // the values of the clicked positiom
DataPoint closePoint = null; // the next closest DataPoint
Теперь код клика с конверсией:
private void chart1_MouseClick(object sender, MouseEventArgs e)
{
lastPoint = e.Location;
Axis ax = chart1.ChartAreas[0].AxisX;
Axis ay = chart1.ChartAreas[0].AxisY;
if (closePoint != null) closePoint.MarkerColor = chart1.Series[0].MarkerColor;
clickedValues = new PointF((float)ax.PixelPositionToValue(lastPoint.X),
(float)ay.PixelPositionToValue(lastPoint.Y));
closePoint = chart1.Series[0].Points.Where(x => x.XValue >= clickedValues .X).First();
closePoint.MarkerColor = Color.Red; // optionally mark the point
// optionally move clicked position to actual datapoint
nextDPoint = new PointF((float)closePoint.XValue, (float)closePoint.YValues[0]);
span = ax.Maximum - ax.Minimum; // the full range of values
}
Наконец код для кнопки увеличения:
private void button1_Click(object sender, EventArgs e)
{
span /= 2; // zoom in 2x each time
Axis ax = chart1.ChartAreas[0].AxisX;
Axis ay = chart1.ChartAreas[0].AxisY;
ax.ScaleView.Zoom(nextDPoint.X - span, nextDPoint.X + span);
}
Несколько заметок:
PointF
для хранения PointF
значений. Обычно floats
; это может быть не так, если значения DateTime
, хотя. В таком случае используйте два doubles
!Axis
в переменные. Я обычно делаю то же самое с Series
и ChartAreas
. Намного легче писать, читать, и я думаю, что даже (немного) быстрее бежать...
(origin-i*step, origin+i*step)