从一个点放大缩小 mschart
zoom in zoom out from a point mschart
如何从一个点缩放
例如从点 300 到 500 axisX 和 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
这是一个每次点击都会放大 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
放入 变量 中的。我通常对 Series
和 ChartAreas
做同样的事情。 更容易写、读,我认为甚至(稍微)更快到运行..
当前位置
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
这是一个每次点击都会放大 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
放入 变量 中的。我通常对Series
和ChartAreas
做同样的事情。 更容易写、读,我认为甚至(稍微)更快到运行..