Grafik erstellen



  • Hallo wer kann mir sagen wie ich folgenden Code so gestalten kann, dass er mir mit folgender Formel: Restschuld_am_Ende_des_Monats = Schuld_aus_Vormonat + (Schuld_aus_Vormonat * (Jahreszins/100/12) - Monatsrate)
    eine Kurve ausgibt. Ich hab's schon ein paarmal probiert, aber die Kurve erscheint immer außerhalb des Formulars
    Ich habe natürlich auch die Variablen und die Formel angepasst.

    // Declarations added here will be included at the top of the .HPP file

    #include <math.h>
    
    const WDouble ERDBESCHLEUNIGUNG = 9.81; // 9.81 Meter/Sekunde im Quadrat
    const WDouble SCHALLGESCHW = 330.0;     // 330 Meter/Sekunde
    
    class __Form1_declspec Form1 : public __Form1_Base
    {
    
    	public:
    		// add your public instance data here
    	private:
    		// add your private instance data here
    		WInt		    nullX;          // Nullpunkt X-Achse
    		WInt			nullY;          // Nullpunkt Y-Achse
    		WInt			maxX;           // hoechster x-Wert
    		WInt			maxY;           // hoechster y-Wert
    		WDouble			maxMeter;       // max. Meter
    		WDouble			maxSekunden;    // max. Sekunden   
    		WDouble			pixelProMeter;       
    		WDouble			pixelProSekunde;       
    		WString			strSec[20];     // Beschriftung Sekunden
    		WString			strMeter[20];   // Beschriftung Meter
    
        protected:     // add your protected instance data here
    
        public:        void zeichneGrafik( void );
    
        public:        WPoint setzePunkt( WDouble zeit, WDouble tiefe );
    
        public:        WDouble berechneZeit( WDouble meter );
    
    };
    
    // Code added here will be included at the top of the .CPP file
    
    //  Include definitions for resources.
    #include "WRes.h"
    
    WBool Form1::Form1_Create(
      WObject *             source,
      WCreateEventData *    event )
    {
        maxMeter = 110;           // Hoechster  Wert in Metern
        maxSekunden = 5.5;        // Hoechste Zeit in Sekunden 
        nullX = 40;               // Nullpunkt links unten 
        nullY = GetHeight() - 50; // in Bildschirmkoordinaten
        maxX = GetWidth() - 100;  // Hoechste erlaubte Bilschirmkoordinaten 
        maxY = 40;
    
    /* Mindestgröße des Fensters festlegen, so daß es nie kleiner als      */
    /* am Anfang werden kann.                                              */
    
      SetMinimumTrackingSize( WSize(GetWidth(), GetHeight()) );
    
    /*--------- Die Einheiten Meter und Sekunden in Pixel umrechnen -------*/
    
        pixelProMeter   = ( nullY - maxY ) / maxMeter;
        pixelProSekunde = ( maxX - nullX ) / maxSekunden;
    
    /*-------------------------- Zeichnen der Grafik ----------------------*/
    
        zeichneGrafik();
    
        return FALSE;
    }
    
    Form1::Form1()
    {
    }
    
    Form1::~Form1()
    {
    }
    
    /*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
    /* Die Methode 'zeichneGrafik()' führt die grafischen Opertionen aus   */
    /*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
    
    void Form1::zeichneGrafik( void )
    {
      WPen				stiftKoordinatenKreuz;
      WPen				stiftTeilstrich;
      WPen				stiftKurve;
      WInt				meter, sekunde;
      WDrawText			* zahl;
    
    /*------------------------- Stifte festlegen --------------------------*/
    
      stiftKoordinatenKreuz.Create( WColorBrightBlue);
    
      stiftTeilstrich.Create( WColorBlack,1,WPStyleDot );
    
      stiftKurve.Create( WColorBrightRed, 2 );                 // Stift Gitternetz 
    
    /*------------------------- Koordinatenkreuz zeichnen -----------------*/
    
      WDrawLine *linie = new WDrawLine( setzePunkt(0,0), setzePunkt(0,maxMeter));  
      linie->SetPen(stiftKoordinatenKreuz);                           
      AddDrawPrimitive( linie );
      linie = new WDrawLine( setzePunkt(0,0), setzePunkt(maxSekunden,0)); 
      linie->SetPen(stiftKoordinatenKreuz);                           
      AddDrawPrimitive( linie );
    
    /*----------------------- Koordinatenkreuz beschriften ----------------*/
    
      WDrawText *xAchse = new WDrawText( setzePunkt(5.6, 0)," Zeit in sec " );  
      xAchse->SetFont(GetFont());
      AddDrawPrimitive( xAchse );
    
      WDrawText *yAchse = new WDrawText( setzePunkt(-0.3,120)," Tiefe in Meter " );  
      yAchse->SetFont(GetFont());
      AddDrawPrimitive( yAchse );
    
    /*------------------ Zeitachse mit Sekundenwerten beschriften. --------*/
      WInt i=0;
      for( sekunde=1; sekunde < maxSekunden; sekunde++ )
      {
    	zahl = new WDrawText((WPoint) setzePunkt(sekunde,-1), "");
    	strSec[i].Sprintf(" %d ", sekunde);
    
    	//zahl->SetNumCharacters( strSec[i].GetLength() );
    
    	zahl->SetText(strSec[i]);
    	zahl->SetFont(GetFont());
    	AddDrawPrimitive( zahl );
        i++;
      }
    
    /*--------------- Die Tiefenachse mit Meterwerten beschriften. --------*/
      i=0;
      for( meter=10; meter < maxMeter; meter+=10 )
      {
    	zahl = new WDrawText((WPoint) setzePunkt(-0.4, meter+2), "");
    	strMeter[i].Sprintf(" %d ", meter);
    
    	//zahl->SetNumCharacters( strMeter[i].GetLength() );
    
    	zahl->SetText(strMeter[i]);
    	zahl->SetFont(GetFont());
    	AddDrawPrimitive( zahl );
        i++;
      }
    
    /*---------------  Teilstriche für die Sekunden einzeichnen -----------*/
    
      for( sekunde=1; sekunde < maxSekunden; sekunde++ )
      {
    	WDrawLine *teilstrich = new WDrawLine( setzePunkt(sekunde,0), setzePunkt(sekunde,maxMeter)); 
    	teilstrich->SetPen(stiftTeilstrich);                           
    	AddDrawPrimitive( teilstrich );
      }
    
    /*---------------  Teilstriche für die Meter einzeichnen --------------*/
    
      for( meter=10; meter < maxMeter; meter+=10 )
      {
    	WDrawLine *teilstrich = new WDrawLine(setzePunkt(0,meter), setzePunkt(maxSekunden,meter)); 
    	teilstrich->SetPen(stiftTeilstrich);                           
    	AddDrawPrimitive( teilstrich );
      }
    
    /*------------ Kurve für die Tiefe über der Wartezeit zeichnen --------*/
      for( meter=0; meter < maxMeter; meter++ )
      {
    	WDouble zeit1 = berechneZeit( meter );
    		WDouble zeit2 = berechneZeit( meter+1 );
    
    	WDrawLine *kurve = new WDrawLine(setzePunkt(zeit1,meter), setzePunkt(zeit2,meter+1));  
    	kurve->SetPen(stiftKurve);                           
    	AddDrawPrimitive( kurve );
      }
    	SetBackColor( WColorBrightCyan );
    }
    
    /*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
    /* Die Methode 'setzePunkt()' rechnet die übergebenen Koordinaten aus  */
    /* Zeit und Strecke in Bildschirmkoordinaten um und gibt diese in      */
    /* einem WPoint Objekt zurück                                          */
    /*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
    
    WPoint Form1::setzePunkt( WDouble zeit, WDouble tiefe )
    {
      WPoint                                    punkt;
    
      punkt.x = nullX + zeit * pixelProSekunde;  // Koordinaten für die Zeit
    
      punkt.y = nullY - (tiefe * pixelProMeter); // Koordinaten für die Tiefe
    
      return punkt;
    }
    
    /*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
    /*      Die Methode 'berechneZeit()' ermittelt die Zeit für eine       */
    /*                           vorgegebene Tiefe                         */
    /*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
    
    WDouble Form1::berechneZeit( WDouble meter )
    {
    	WDouble                                 zeit;
    
    	zeit = sqrt( 2*meter/ERDBESCHLEUNIGUNG ) + ( meter / SCHALLGESCHW );
    	return zeit;
    }
    

    /@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@/



  • Renate schrieb:

    aber die Kurve erscheint immer außerhalb des Formulars

    Wie das denn?



  • schonmal probiert! wie? jaja... wozu dann ERDBESCHLEUNIGUNG und SCHALLGESCHW bei ner finanzmathematischen formel? wo sind das für datentypen mit dem W davor?

    achja, wo hastn den code geklaut?



  • Das ist kein BCB-Code, sondern Power++ . Da gibt es auch einen Thread im C++-Forum der mittlerweil nach andere GUIs verschoben ist.
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-154920.html



  • WebFritzi schrieb:

    Renate schrieb:

    aber die Kurve erscheint immer außerhalb des Formulars

    Wie das denn?

    Ja das ist ja eben das Problem, hast Du eine Antwort



  • Sunday schrieb:

    schonmal probiert! wie? jaja... wozu dann ERDBESCHLEUNIGUNG und SCHALLGESCHW bei ner finanzmathematischen formel? wo sind das für datentypen mit dem W davor?

    achja, wo hastn den code geklaut?

    Ich habe natürlich die Variablen angepaßt, aber den Code, den Du hier gesehen hast, ist die Vorlage, die ich verändern will.



  • Sunday schrieb:

    schonmal probiert! wie? jaja... wozu dann ERDBESCHLEUNIGUNG und SCHALLGESCHW bei ner finanzmathematischen formel? wo sind das für datentypen mit dem W davor?

    achja, wo hastn den code geklaut?

    ich wusste gar nicht das man code auch klauen kann.




Anmelden zum Antworten