有回响的山谷 2025-01-15 13:46 采纳率: 53.3%
浏览 5

zeggraph怎么根据曲线来添加对应的标签啊

我需要在鼠标点击曲线时,给当前位置添加一个标签,用来显示当前点的数值信息;

添加标签功能能实现,但由于我是多条曲线的,发现如果对曲线进行处理,如移动或隐藏或缩放,标签就显示变了;

调试后发现,添加的标签全部是根据第一个Y轴坐标绘制的,导致标签与曲线不能对应上,

想问一下大家,怎么根据曲线添加标签,能与曲线对应上?

下面是我添加标签的代码,其中this指代zedgraph控件

this.GraphPane.FindNearestPoint(pPoint, out CurveItem nearCurve, out int nearIndex);
if (nearCurve != null)
{
    int Index = nearCurve.YAxisIndex;
    double dbY2 = nearCurve.Points[nearIndex].Y;
    string strY = ",Y"+(Index+ 1).ToString() + ":" + dbY2.ToString();
    this.GraphPane.ReverseTransform(pPoint, out double dbX, out double dbY);
    int iX = (int)dbX;
    int iY = (int)dbY;
    //int iX = (int)this.GraphPane.XAxis.Scale.ReverseTransform(pPoint.X);
    //int iY = (int)this.GraphPane.YAxis.Scale.ReverseTransform(pPoint.Y);
    Point point = new Point(iX, iY);
    if (this.textObjPointMap.ContainsKey(point))
    {
        TextObj text = this.textObjPointMap[point];
        this.textObjPointMap.Remove(point);
        this.GraphPane.GraphObjList.Remove(text);
    }
    else
    {
        TextObj text = new TextObj("X: " + iX +strY, iX, dbY, CoordType.AxisXYScale, AlignH.Left, AlignV.Center);
        text.FontSpec.Border.IsVisible = false;
        text.FontSpec.Fill.IsVisible = true;
        text.FontSpec.Fill.Color = Color.White;
        text.FontSpec.Angle = 30;
        this.textObjPointMap.Add(point, text);
        this.GraphPane.GraphObjList.Add(text);
        this.Invalidate();
    }
}
else 
{
    return ;
}

显示效果

img

隐藏Y1后显示:

img

  • 写回答

3条回答 默认 最新

  • 道友老李 JWE233286一种基于机器视觉的水表指针读数识别及修正的方法 专利发明者 2025-01-15 13:47
    关注
    让【道友老李】来帮你解答,本回答参考gpt编写,并整理提供,如果还有疑问可以点击头像关注私信或评论(小黑屋了,无法评论,请私信)。
    如果答案让您满意,请采纳、关注,非常感谢!
    问题分析:根据提供的代码和效果展示,导致标签与曲线不能对应上的原因是当隐藏或缩放曲线时,标签的位置是基于第一个Y轴坐标绘制的,导致无法正确匹配其他曲线的位置。解决方法是需要根据每条曲线的坐标系来计算标签的位置,保证标签与曲线对应上。 解决方案:
    1. 遍历所有曲线,获取每条曲线对应的Y轴索引,然后根据曲线的坐标系计算标签的位置。
    2. 在添加标签时,根据每条曲线的Y轴索引来确定标签的位置,使标签与曲线对应上。 代码示例(仅提供伪代码示例):
    foreach (CurveItem curve in this.GraphPane.CurveList)
    {
        double dbY2 = curve.Points[nearIndex].Y;
        int Index = curve.YAxisIndex;
        string strY = ", Y" + (Index + 1).ToString() + ": " + dbY2.ToString();
        // 根据当前曲线的坐标系计算标签位置
        // 注意:需要根据曲线的坐标系计算实际位置,此处为伪代码示例
        double dbX = CalculateXPosition(pPoint, curve);
        double dbY = CalculateYPosition(pPoint, curve);
        TextObj text = new TextObj("X: " + dbX + strY, dbX, dbY, CoordType.AxisXYScale, AlignH.Left, AlignV.Center);
        // 设置标签样式等
        // ...
        this.GraphPane.GraphObjList.Add(text);
        this.Invalidate();
    }
    

    通过根据每条曲线的坐标系计算标签的位置,可以确保标签与曲线对应上,即使对曲线进行处理(如隐藏、移动、缩放)也能正确显示标签。

    评论

报告相同问题?

问题事件

  • 创建了问题 1月15日