使用十字光标的C#图表

时间:2015-10-27 09:00:47

标签: c# charts cursor

我正在使用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);
     }

此代码导致光标随鼠标移动,结果如下图所示: enter image description here

使光标的水平线跟随曲线,这是一个正弦信号。我应该知道光标的垂直线和曲线之间的交点。如图所示:

enter image description here

有没有找到这一点的直接方法?任何帮助PLZ!。

2 个答案:

答案 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;
        }