如何在ZedGraph中找到索引位置

4

有没有办法根据当前的xPosition查找曲线的索引位置呢?

假设我有一个曲线项目-MyCurve,它有20k个点,当鼠标移动时,我可以获取鼠标位置,然后通过使用以下函数简单地获取x和y位置。

double xPos=0, yPos=0;

this.zedGraphControl1.GraphPane.ReverseTransform(MouseLoc, out xPos, out yPos);

但我希望从曲线项目中找到数据点,有什么建议吗?

enter image description here 提前感谢....:)

2个回答

3
请记住,以下内容仅是近似值,当鼠标靠近点时应该很精确,但由于您正在查看鼠标位置,您可能不会直接位于曲线上的某一点。它还假设您的CurveItem Curve具有点,并且它们分布均匀。
double startPos = Curve.Points[0].X
double xStep = Curve.Points[Curve.NPts - 1].X / Curve.NPts;
int xIndex = (int)(xPos / xStep + startPos);
// Make sure it is in bounds
xIndex = xIndex < 0 ? 0 : xIndex > Curve.NPts - 1 ? Curve.NPts - 1 : xIndex;

您可以使用以下函数:

CurveItem n_curve;
int index;
zedGraphControl1.GraphPane.FindNearestPoint(mousePt, out n_curve, out index);

请记住,这将会查找最近的曲线该曲线中最近点的索引。


非常感谢NominSim,我已经尝试了两种方法,但都不符合我的需求,我需要获取精确的数据点而不是近似值。为了使用第二种方法,我必须将鼠标位置放在曲线项上,这对于单个曲线来说是很好的。 - SanVEE
2
@San,你可以尝试使用Math.Round().Floor().Ceiling()来代替(int)(xPos / xStep + startPos);。由于你使用的是鼠标位置,所以你会接近这个点,但不会完全在它上面,因此需要对获取的索引进行一些操作,以获得更准确的结果。 - NominSim
1
@San,这里有一个FindNearestPoint重载,它允许您指定目标曲线以查找您的点索引,并且您还可以使用GraphPane.Default.NearestTol来配置搜索容差。这对您的需求是否足够? - Anders Gustafsson
@AndersGustafsson,再次感谢你指出了重载选项,但是这种方法存在一个问题,请查看我更新的图片,它只会根据x轴获取最近的点。 - SanVEE
1
@San 我在答案中提到的第一种方法将是你最安全的选择。 - NominSim
@NominSim,我想除了你的解决方案,我别无选择,不管怎样,谢谢.... :) - SanVEE

1

如果您不需要以编程方式使用位置,而只想在图表中查看位置,则可以将zedGraphControl1.IsShowPointValues设置为true

Display point values in graph


1
谢谢您的建议,但在ZedGraph上显示所有20k个标签是没有意义的。 - SanVEE
2
@San,只是想指出,将“IsShowPointValues”设置为“true”仅会显示曲线上最靠近鼠标的点,而不是所有点一次性显示。 - NominSim
@NominSim,抱歉,你说得对...正如我在问题中提到的那样,我正在尝试找到确切的索引,以便我可以读取功率和时间(x和y)并将这些值显示在标记表上而不是图表上。 - SanVEE

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接