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 zeichnenWie 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> Speichernund 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.jpgBeim 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)); } }