уменьшить масштаб от точки MSCHART

2

Изображение 174551 Как увеличить масштаб от точки, например, от 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

  • 1
    Хе-хе, этот вид пинга не работает. Вам необходимо: а) знать текущий центр увеличения и ваши шаги. Тогда код должен работать. Всегда держите центр посередине между началом увеличения и окончанием . Если центр находится в точке х = 400, а текущий зум в точке xstart = 100, у вас есть xdelta = 300. Для step = 100 вы можете увеличить (origin-i*step, origin+i*step)
  • 0
    @TaW мои шаги отличаются У меня есть 3 режима в коде. текущий масштабный центр, показываемый щелчком мыши. Пожалуйста, помогите мне написать этот код. Спасибо
Показать ещё 2 комментария
Теги:
mschart
zooming

1 ответ

3
Лучший ответ

Вот решение, которое будет увеличивать в 2 раза с каждым кликом.

Он использует переменную span в качестве диапазона значений, которые будут видны в увеличенном виде.

Он также перемещает позицию щелчка к следующей ближайшей DataPoint. Вы можете удалить это, чтобы разрешить увеличение позиций между DataPoints.

Давайте посмотрим на это в действии:

Изображение 174551

Обратите внимание, что первая проблема с вашим кодом - это используемые вами координаты.

Это три (!) Системы координат в 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);
}

Несколько заметок:

  • Функции преобразования доступны только после того, как график закончил макет.
  • Я только увеличиваю ось X и только увеличиваю. Добавление масштабирования по оси Y и уменьшение масштаба должно быть простым.
  • Изменение скорости или размера шага также не является ракетостроением. Обратите внимание, что шаги должны быть фактором, обеспечивающим хороший пользовательский опыт. Если вы добавите (вместо умножения) масштабирование не будет выглядеть линейным, но будет становиться быстрее или медленнее с каждым шагом.
  • Конечно, маркеры и визуализация нажатых точек не являются обязательными и могут плохо работать с вашей диаграммой.
  • Я использую PointF для хранения PointF значений. Обычно floats; это может быть не так, если значения DateTime, хотя. В таком случае используйте два doubles !
  • Обратите внимание, как я помещаю Axis в переменные. Я обычно делаю то же самое с Series и ChartAreas. Намного легче писать, читать, и я думаю, что даже (немного) быстрее бежать...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню