Laden...

Wie kann ich in einem ZedGraph eine Kurve verschieben

Erstellt von LazPy vor 7 Jahren Letzter Beitrag vor 7 Jahren 1.835 Views
L
LazPy Themenstarter:in
2 Beiträge seit 2017
vor 7 Jahren
Wie kann ich in einem ZedGraph eine Kurve verschieben

Hallo und guten Abend im Forum,

ich bin relativ neu in C#, aber noch mit etwas Grundlagen aus Pascal und Python.

Mein Problem:

Ich möchte in einem ZedGraph eine Funktion/Kurve z.B. einen Sinus oder eine Parabel mit der Maus anpacken und verschieben.
Was ich schon hinbekommen habe ist, wie man die aktuelle x,y-Position in einer statusBar ausgibt.

Mit

zedGraphControl1.GraphPane.FindNearestPoint(KurvenPunkt, out Kurve, out index)

bekomme ich die Kurve.

Muss man jetzt mit:

for (int i=0; i<Kurve.NPts; i++){
   Kurve.Points[i].X += e.X; //e ist die Variable vom Typ MouseEventArgs
   Kurve.Points[i].Y += e.Y;
}

oder gibt es etwas "vorgefertigtes" wo man "nur" e.X und e.Y übergeben muss und schon bewegt sich die Kurve?

Vielen Dank für Eure Mühen

LazPy

212 Beiträge seit 2008
vor 7 Jahren

Hi,

ich kenne keine Funktion die das kann. Überlagerungen verschiebe ich immer per Iteration und das geht sehr schnell. Sogar bei 60000-120000 Punkten geht das noch recht gut, auch Beschriftungen (Label) werden mit verschoben.

Gruß
Christoph

L
LazPy Themenstarter:in
2 Beiträge seit 2017
vor 7 Jahren

Hallo Christoph1972,

ich entnehme Deinem Beitrag, dass Du das schonmal gemacht hast 🙂
Kannst Du mir ein wenig weiter auf die Sprünge helfen?

Man muß ja die Differenz zwischen zwei Punkten bei X und Y auf die Kurve addieren. Man braucht zwei X- und Y- Variablen für die alte Position und dann muss man aus der aktuellen Position und der Alten die Differenz berechnen. Diese dann übergeben.

Wie stellt man das im MouseMove-Ereignis an? Das Schieben der Maus erzeugt erzeugt kontinuierlich Werte. Wie berechnet man da die Differenzen und übergibt diese dann in einer Schleife von 60.000 oder 120.000 Punkten an die Kurve?

Vielen Dank und viele Grüße

LazPy

212 Beiträge seit 2008
vor 7 Jahren

Wie stellt man das im MouseMove-Ereignis an? Das Schieben der Maus erzeugt erzeugt kontinuierlich Werte.

Bei mir sieht das in etwa so aus:


bool MyZedGraphControl_MouseMoveEvent(ZedGraphControl sender, MouseEventArgs e)
{
    //MoveCurve kennzeichnet den Überlagerungsmodus
    if (MoveCurve)
    {
        MyZedGraphControl.Cursor = Cursors.SizeAll;
    }

    if (MoveCurve && e.Button == System.Windows.Forms.MouseButtons.Left)
    {
        MyZedGraphControl.MouseMoveEvent -= new ZedGraphControl.ZedMouseEventHandler(MyZedGraphControl_MouseMoveEvent);//Hier wird verhindert dass das Event permanent kommt.

        GraphPane pane = sender.MasterPane.FindPane(sender.PointToClient(MousePosition));//Kann sein das du ohne auskommst, ich habe immer mehrere Charts (MultiPane)

        if (pane == null)//Sonst kracht es wenn die Maus das Chart verlässt!
            return true;        

        if (LastPointX < e.X)
        {
            MoveCurveItemX(pane);          
        }
        else if (LastPointX > e.X)
        {
            MoveCurveItemX( pane);            
        }

        if (LastPointY > e.Y)
        {
            MoveCurveItemY(pane);            
        }
        else if (LastPointY < e.Y)
        {
            MoveCurveItemY(pane);
        }

        MyZedGraphControl.Refresh();

        LastPointX = e.X;
        LastPointY = e.Y;

         MyZedGraphControl.MouseMoveEvent += new ZedGraphControl.ZedMouseEventHandler(MyZedGraphControl_MouseMoveEvent);//Wieder neu abonnieren

        return true;
    }
    return false;
}


Mit einem Timer könnte man das auch noch lösen, so das z.B. alle 200ms die PointPairList neu übergeben wird.

Die Aufgabenstellung kann mit ZedGraph sehr gut gelöst werden, tüfteln muss man allerdings schon.

ZedGraph ist das ChartControl meiner wahl, schade das es nicht mehr betreut und weiter vorrangetrieben wird....

Viel Spass beim Tüfteln 😃

Gruß
Christoph