Sinuskurve zeichnen mit TImage



  • Hallo liebe Gemeinde,

    ich bin nun hingegangen und habe eine TImage - Komponente angelegt.
    Dann einen Button hinzugefügt.

    Beim Buttonklick soll er in das TImage die Kurve zeichnen (Sinus oder Cosinus).
    Leider sieht es sehr eckig aus.

    Der Quellcode für den Buttonklick schaut folgendermaßen aus:

    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    		// Mauszeiger auf Anfang setzen
    		Image1->Canvas->MoveTo(0,220);
    		double y = 0;
    
    		for (double x = 0 ; x<640 ; x++ )
    		{
    			y = Sin(x);
    			y = ((y*180)/M_PI)+220;
    			Image1->Canvas->LineTo(x,y);
    		}
    }
    
    x<640
    

    -> Weil die Breite der Image - Komponente 640 Pixel beträgt.

    y = Sin(x)
    

    -> y - Wert - Berechnung des x - Wertes mittels Sinus

    y = ((y*180)/M_PI)+220;
    

    -> Bogenmaß in Gradmaß umrechnen. + 220, weil die Image - Komponente 440 Pixel hoch ist und 0;220 der Anfang ist.

    Image1->Canvas->LineTo(x,y);
    

    -> Er zieht immer weiter Linien zu den neu - errechneten Punkten.

    Würde halt nun gern so machen, dass es runder verläuft.
    Sprich, dass er bei 2*PI den Wert 0 hat und bei PI den Wert 0 usw. Bei 1,5PI den Wert 1.
    Also eine gezogene Kurve.
    Bei der Suche habe ich leider unter VCL nichts zu Sinus gefunden.

    Gruß



  • Hallo

    Die Zeichenoperation ist schon korrekt, nur eben sehr gestaucht. Das liegt daran, das du auf der X-Achse einen Pixel mit einer Längeneinheit gleichsetzt. Deshalb werden viel zu viele Schwingungen dargestellt.
    Ändere mal folgende Zeile, dann solltest du eine vernünftige Darstellung bekommen

    #include <cmath>
    ...
    y = std::sin(x / 10);
    

    Desweiteren weiß ich nicht, wo du die Funktion Sin(...) herhast. Beim BCB5 gibts nur SinCos. Deshalb hab ich bei meinem Test die Funktion aus der STL benutzt.

    bis bald
    akari



  • akari schrieb:

    Hallo

    Die Zeichenoperation ist schon korrekt, nur eben sehr gestaucht. Das liegt daran, das du auf der X-Achse einen Pixel mit einer Längeneinheit gleichsetzt. Deshalb werden viel zu viele Schwingungen dargestellt.
    Ändere mal folgende Zeile, dann solltest du eine vernünftige Darstellung bekommen

    #include <cmath>
    ...
    y = std::sin(x / 10);
    

    Desweiteren weiß ich nicht, wo du die Funktion Sin(...) herhast. Beim BCB5 gibts nur SinCos. Deshalb hab ich bei meinem Test die Funktion aus der STL benutzt.

    bis bald
    akari

    Danke, werde es gleich probieren.
    Die Funktion Sin habe ich aus der math.h beim Turbo C++ 🙂

    Edit:
    Ja, danke es funktioniert. 🙂

    Gruß


Log in to reply