2012-08-02 48 views
4

索引位置有沒有解決任何方式找到一條曲線的指數位置,基於當前的xPosition,如何找到ZedGraph

比方說,我有一個曲線項目 - MyCurve,其中有2萬點,當鼠標移動時,我可以獲得鼠標位置&然後我可以通過簡單地使用以下函數獲得y位置。

double xPos=0, yPos=0; 

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

但我想從曲線項目找到數據點,有什麼建議......?提前

enter image description here 感謝.... :)

回答

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); 

但請記住,這將尋找最近的曲線該曲線中的最近點的指數。

+0

非常感謝NominSim,我已經嘗試了兩種方法,但nothings適合我的需要,我需要得到確切的數據點而不是近似值。爲了使用方法2,我必須將鼠標放置在曲線項目上,這對單曲線很有用。 – SanVEE 2012-08-02 15:05:01

+2

@San而不是'(int)(xPos/xStep + startPos);''你可以玩'Math.Round()','.Floor()'或'.Ceiling()'。由於您正在使用鼠標位置,因此您將緊貼關鍵點,但不是完全靠近它,因此必須對您獲得的索引進行一些操作才能獲得更準確的結果。 – NominSim 2012-08-02 15:09:24

+1

@San有一個'FindNearestPoint' [重載](http://zedgraph.sourceforge.net/documentation/html/M_ZedGraph_GraphPane_FindNearestPoint.htm),它允許你指定目標曲線,你試圖找到你的點索引,也可以使用[GraphPane.Default.NearestTol](http://zedgraph.sourceforge.net/documentation/html/T_ZedGraph_GraphPane_Default.htm)配置搜索容限。這足以滿足您的需求嗎? – 2012-08-02 15:39:37

1

如果你不關心使用的位置編程,而只是想看看你的圖表中顯示的位置,你可以設置zedGraphControl1.IsShowPointValuestrue

Display point values in graph

+1

,謝謝你的建議,但是在zedgraph上顯示所有的20k標籤是沒有意義的。 – SanVEE 2012-08-02 15:10:05

+2

@San只需指出,將「IsShowPointValues」設置爲「true」將僅顯示曲線的最近點,而不是一次全部顯示。 – NominSim 2012-08-02 15:14:45

+0

@NominSim,對不起,你是對的....正如我在提到的那樣,我試圖找到確切的索引,以便我可以讀取Power&Time(x&y)並在標記表上顯示這些值不在圖上。 – SanVEE 2012-08-02 15:21:07