Funktion grafisch darstellen



  • Wie kann ich mit der MFC eine Funktion (z.B.: x²-2) grafisch darstellen?????

    mfg
    Fink Christoph



  • Ich würde die Werte für die einzelnen x-Koordinaten berechnen, in einem Array speichern und in OnDraw() mit MoveTo/LineTo zeichnen.

    Aber vielleicht gibt es ein ActiveX-Steuerelement, welches Funktionen darstellt.



  • Original erstellt von jfuechsl:
    in einem Array speichern und in OnDraw() mit MoveTo/LineTo zeichnen

    Wie geht das mit dem Zeichnen???



  • Naja ich würde

    für die versch x.Werte die y-Werte berechnen
    Diese dann in einem CArray <CPoint, CPoint> Speichern

    und dann in OnDraw der Viewklasse

    for (int i = 1; i < m_ptArray.GetSize(); i++)
    {
        MoveTo(m_ptArray[i-1];
        LineTo(m_ptArray[i];
    }
    

    mit einer Schleife kannst du auch die X-Werte berechnen.

    Und achte darauf, dass du den Ursprung richtig hineinlegst,
    Bildschirmkoordinaten haben den Ursprung links oben.
    Du würdest den Graph also gespiegelt sehen.



  • Es kommen bei mir die folgenden Errors:
    C2065: 'MoveTo' : nichtdeklarierter Bezeichner
    C2660: 'LineTo' : Funktion akzeptiert keine 1 Parameter
    Muss ich was includieren?????

    P.S.: Ich habe eine Dialoganwendung unter VS .net und habe die Function OnDrawItem benutzt.



  • Oh habe ich vergessen.
    MoveTo und LineTo sind Methoden von CDC du musst sie also über einen Pointer auf einen Grätekontext aufrufen.
    In OnDraw ist das z.B.:

    pDC->LineTo(CPoint);
    

    Der zweite Fehler dürfte eigentlich nicht kommen aber probiers mal mit

    pDC->LineTo(CPoint.x, CPoint.y);
    

    Diese Funktion ist nämlich Überladen und braucht entweder ein CPoint Objekt oder die x und y Werte.



  • Jetzt kommt kein Error mer aber es wird nichts gezeichnet. Ich habe, wie isch schon sagte, eine Dialoganwendung unter VS .net und habe die Funktion OnDrawItem benutzt.



  • Achso eine Dialoganwendung.
    Ich dachte du hast eine SDI/MDI.
    Müsste trotzdem klappen.
    Schreib es in OnPaint().



  • Es kommt folgender Error:
    [http://members.vol.at/captainiglo/Error.jpg](http://<a href=)">http://members.vol.at/captainiglo/Error.jpg

    Beim Debuggen zeigt der Pfeil auf LineTo().

    Habe Folgenden Code:

    i = 1;
    
        m_pGraph[0].x = 135;
        m_pGraph[0].y = -310;
        int x = 135, y = -310;
        double a;
        a = 240/n;
    
        GetDlgItemText(IDC_KT, m_strKT);
        m_dKT = atof(m_strKT);
    
        do
        {
            m_pGraph[i].x = x + (i*a);
            m_dKT = m_dKT - ((m_dKT - m_dZT) * m_dD) / 100;
            m_pGraph[i].y = y + m_dKT;
            i++;
        }
        while(i < n && m_dKT > m_dZT);
    
        for (int i = 1; i < n; i++)
        {
            pDC->MoveTo(m_pGraph[i-1]);
            pDC->LineTo(m_pGraph[i]); //Hierher zeigt der Pfeil beim debuggen
        }
    

    Weiß jemand was falsch ist?????

    [ Dieser Beitrag wurde am 30.09.2002 um 20:42 Uhr von Fink Christoph editiert. ]



  • Hi!
    Schau mal ob du einen Fence Post Error (Arrayübertretung)hast!? Dann kommt glob i meistens a read error.

    mfg 😃

    [ Dieser Beitrag wurde am 30.09.2002 um 21:34 Uhr von *mike* editiert. ]



  • Wenn du damit meinst das ich z.B. in das Array Array[10] etwas in Array[11] schreiben will, dann ist das nicht der Fall. Das Array wird meistens nur bis zur Hälfte gefüllt und maximal bis zur letzten stelle.



  • Ich hab mal nen kleinen Billigplotter online gestellt:
    http://mitglied.lycos.de/dsdeus/PlotterDBA.zip
    Der kann nur Funktionen der Form a*x^m+b*x+c zeichnen.
    Die Funktion, die du als Bsp angegeben hast, wäre dann also 1*x^2+0*x+(-2)

    Edit:
    'g' vergessen 😃

    [ Dieser Beitrag wurde am 30.09.2002 um 22:12 Uhr von dEUs editiert. ]



  • @dEUs:
    Das ist genau das was ich suche.
    Allerdings checke ich deinen Code überhaupt nicht 😕 .
    Könntest du mir nicht den Teil wo du mit der berechneten Koordinate die Linie zeichnest mit ein paar Erklärungen posten 😉 ????
    Danke im Voraus.

    mfg
    Fink Christoph



  • Äh ... Der Code ist schon uralt, mal schauen, ob ich den überhaupt noch kapier 😉

    //Zeichnung des eigentlichen Funktionsschaubildes...
        for(i = -1;i<2;i+=2)
        {
            int nFirst = 1;
            double Y=0.0;
            dc.MoveTo(POS_REL_TO_CENTER(0,C*FAKTOR));
            for(double X=0.0;;X+=i*(1.0/100.0))
            {
                //Das ist im Grunde die wichtige Zeile:
                Y=A*pow(X,nExp)+B*X+C;
                //Sie berechnet den Y-Achsenabschnitt für die angegebene Formel
                //Der Rest ist eigentlich nur zum zeichnen und um Grenzwerte wie "Unendlich" rauszufiltern ...
                //Spiel halt mal eine wenig mit dem Code rum, dann wirst schon sehen, was das alles bringt ;)
                //Weiss es ehrlich gesagt im Moment auch net mehr so genau ..
                if((!rct.PtInRect(CPoint((X*FAKTOR)+CENTER_X,(Y*FAKTOR)+CENTER_Y)))||(Y>INT_MAX||Y<INT_MIN))
                {
                    if(nExp>=0||(nExp<0&&!nFirst))
                    {
                        if(_finite(Y))
                            dc.LineTo(POS_REL_TO_CENTER(X*FAKTOR,Y*FAKTOR));
                        break;
                    }
                    else
                        continue;
                }
    
                if(X<0 && ((int)nExp!=nExp))
                    continue;
                if(X == 0 && (nExp<0))
                    continue;        
    
                int n = Y;
                if(nFirst)
                {
                    if(nFirst==2)
                        nFirst=0;
                    else
                        nFirst = 2;
                    double X2 = X-i*(1.0/100.0);
                    double Y2=A*pow(X2,nExp)+B*X2+C;                
                    if(_finite(Y2))
                    {
                        dc.MoveTo(POS_REL_TO_CENTER(X2*FAKTOR,Y2*FAKTOR));
                        dc.LineTo(POS_REL_TO_CENTER(X*FAKTOR,Y*FAKTOR));
                    }
                    else
                        dc.MoveTo(POS_REL_TO_CENTER(X*FAKTOR,Y*FAKTOR));
                }
                else
                    dc.LineTo(POS_REL_TO_CENTER(X*FAKTOR,Y*FAKTOR));
            }
        }
    

Anmelden zum Antworten