【问题标题】:zoom in zoom out from a point mschart从一个点放大缩小 mchart
【发布时间】:2019-04-14 06:34:24
【问题描述】:

如何从一个点缩放 例如从 300 点缩放到 500 轴 X 和 50 到 100 轴 AxisY 一步一步

当前位置

private void chart1_MouseClick(object sender, 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

【问题讨论】:

  • 呵呵,这种Ping不行。您需要 a) 知道当前的缩放中心和您的步数。然后代码应该可以工作。始终将中心保持在zoom start and -end 之间的中间。如果中心位于 x=400 并且当前缩放位于 xstart= 100,则您的 xdelta=300。对于 step=100,您可以缩放到 (origin-i*step, origin+i*step)
  • @TaW 我的步骤不同我在代码中有 3 种模式。通过鼠标单击显示当前缩放中心。请帮我写这段代码。谢谢
  • 我稍后再看看..
  • 我发现代码有点混乱。我的答案解决了错误坐标的主要问题,并显示了一个简单的缩放方案。根据需要进行调整..!

标签: c# mschart zooming


【解决方案1】:

这是一个每次点击都会放大 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);
}

一些注意事项:

  • 转换功能仅在图表布局完成后可用。
  • 我只放大 x 轴并且只放大。添加 y 轴缩放和缩小应该很简单..
  • 改变速度或步长也不是火箭科学。请注意,这些步骤应该是一个因素,以提供良好的用户体验。如果您添加(而不是相乘),则缩放看起来不是线性的,但每一步都会变得更快或更慢。..
  • 当然,标记和单击点的可视化是可选的,可能不适用于您的图表。
  • 我使用PointF 来存储点击的值。通常floats 会做;但是,如果值为DateTime,则可能不是这样。在这种情况下,请使用两个doubles
  • 注意我如何将Axis 放入变量。我通常对SeriesChartAreas 做同样的事情。更更容易编写、阅读,而且我认为甚至(有点)更快运行.. .

【讨论】:

    猜你喜欢
    • 2014-11-07
    • 1970-01-01
    • 1970-01-01
    • 2013-12-18
    • 1970-01-01
    • 1970-01-01
    • 2011-02-24
    • 2017-02-13
    • 1970-01-01
    相关资源
    最近更新 更多