我正在使用C#图表类来显示曲线。该系列的类型是样条曲线。 我要做的是在图表区域显示十字光标。当鼠标进入图表时,此光标的垂直线应随鼠标移动。但水平线应移动曲线而不是鼠标移动。 我键入的代码在这里:
private void chart1_MouseMove(object sender, MouseEventArgs e)
{
Point mousePoint = new Point(e.X, e.Y);
chart1.ChartAreas[0].CursorX.SetCursorPixelPosition(mousePoint,false);
chart1.ChartAreas[0].CursorY.SetCursorPixelPosition(mousePoint,false);
}
使光标的水平线跟随曲线,这是一个正弦信号。我应该知道光标的垂直线和曲线之间的交点。如图所示:
有没有找到这一点的直接方法?任何帮助PLZ!。
答案 0 :(得分:0)
如果您知道以下内容,则可以获得相对于图表区域顶部的y像素偏移:
height
=图表高度(以像素为单位)rangeMin/rangeMax
=图表范围最小/最大(此处为-150/150)value
=功能值(底部图片,约75)采用以下公式:
yOffset = height * (rangeMax - value) / (rangeMax - rangeMin);
您应该可以将yOffset
插入MouseMove功能,如下所示:
private void chart1_MouseMove(object sender, MouseEventArgs e)
{
double yOffset = GetYOffset(chart1, e.X);
Point mousePoint = new Point(e.X, yOffset);
chart1.ChartAreas[0].CursorX.SetCursorPixelPosition(mousePoint,false);
chart1.ChartAreas[0].CursorY.SetCursorPixelPosition(mousePoint,false);
}
// ChartClass chart is just whatever chart you're using
// x is used here I'm assuming to find f(x), your value
private double GetYOffset(ChartClass chart, double x)
{
double yOffset;
// yOffset = height * (rangeMax - value) / (rangeMax - rangeMin);
return yOffset;
}
答案 1 :(得分:0)
在此函数中,我使用方法GetXOfCursor();
获取光标X的位置
之后,我用以下语句来说明系列观点:
points = _theChart.Series[i].Points;
在最后一个if语句之后,我看到与光标的位置X匹配的点 并且我计算了这2个点的Y的平均值,因为用光标截取的点是Windows图表控件制作的插值线
public string GetPointInterceptedCursorX()
{
string values = string.Empty;
// Far uscire le etichette ai punti intercettati
var xPosCursor = GetXOfCursor();
DataPointCollection points = null;
for (int i = 0; i < _theChart.Series.Count; i++)
{
if (_theChart.Series[i].BorderWidth == ChartConst.THICKNESS_LINE_ENABLED)
{
points = _theChart.Series[i].Points;
break;
}
}
if (points == null) return "No Curve Selected";
for (int i = 0; i < points.Count - 1; i++)
{
if ((xPosCursor > points[i].XValue & xPosCursor < points[i + 1].XValue) | xPosCursor > points[i + 1].XValue & xPosCursor < points[i].XValue)
{
var Yval = (points[i].YValues[0] + points[i + 1].YValues[0]) / 2;
values += $"Y= {Yval} {Environment.NewLine}";
}
}
values += "X=" + " " + String.Format("{0:0.00}", xPosCursor);
return values;
}