Graph mit Canvas



  • Hallo zusammen,
    da ich immer noch mit dem "Graphproblem" arbeite und nun nicht mit PerformanceGraph arbeiten möchte, habe ich einen neuen Thread geöffnet. Ich versuche im Moment mit Canvas einen Graph zu erstellen. Kann ich denn auch eine Kurve darstellen oder muss ich diese mit ganz vielen kleinen Geraden darstellen?

    Vielen Dank für eure Hilfe
    lg, freakC++



  • Eine Kurve besteht letzendlich auch nur aus vielen Punkte bzw. Geraden. Du hast immerhin nur endlich viele Pixel.



  • Sieh dir die Methoden von TCanvas an, da gibt es auch so Sachen wie Arc() oder PolyBezier().



  • Hallo,
    @Jansen: Ich werd versuchen ein Tutorial zu finden, die solche Methoden bearbeitet.

    Ich habe den Graphen in TImage dargestellt. Dabei ist die X-Achste so lang wie Image->Width und die Y-Achse so lang wie Image->Height. Wenn ich nun Koordinaten wie (6|12) darstellen möchte, wird das alles sehr klein, da Image sehr groß ist (300x300). Gibt es eine simple Möglichkeit oder Eigenschaft eine Skalierung vorzunehmen??

    Vielen Dank für eure Hilfe,
    lg, freakC++



  • Hallo

    Multipliziere deine Koordinaten einfach mit je einem Faktor für X- und für Y-Achse um sie für den Bildschirm zu skalieren.

    bis bald
    akari



  • Besorg Dir lieber endlich mal die Hilfe zu Deinem BCB...



  • Hallo,
    @akari: Vielen Dank für deine schnelle Hilfe. Ich denke, dass das Problem gelöst sein sollte, wobei ich es etwas dumm finde, dass ich mit Canvas keine "wirkliche Gerade" darstellen kann. Diese setzt sich nämlich aus vielen kleinen verschobenen zusammen....

    lg, freakC++



  • Zeichne die Linie einfach genau senkrecht oder waagerecht, dann wird sie perfekt gerade. 😉

    Die Treppchenbildung ist systembedingt, du könntest dich allenfalls "beschweren", dass TCanvas kein Antialiasing implementiert hat. Da hilft dann nur, einen eigenen Algorithmus zu entwickeln (oder im Netz zu suchen) und pixelweise selbst zu zeichnen.



  • Hallo zusammen,
    ich habe soeben eine Hyperbel mit Canvas gezeichnet!!! Leider ist diese sehr klein! Kann mit jemand sagen, wie ich diese strecken bzw vergrößern kann. Der Tipp von akari nützt bei diesem Graphen leider nichts!!

    Vielen Dank für eure Hilfe
    lg, freakC++



  • Hallo,

    warum nutzt akari's Tip nichts? Zeichnest du die Hyperbel nicht mit x-/y-Koordinaten? Wie zeichnest du sie dann?
    Oder ist das Problem das die Hyperbel, wenn du die Koordinaten per Faktor erweiterst, zu eckig aussieht?

    MfG



  • mmh....ich hab nochmal mit dem Graphen herumgespielt und irgendwie zu einem halbwegsmoderaten Ergebnis gebracht. Doch der letzte Feinschliff funktioniert nur halb: X- und Y- Ache müssen natürlich markiert werden. Das habe ich so gemacht:

    Image2->Canvas->MoveTo(0,0);
    Image2->Canvas->LineTo (0,Image2->Height);
    Image2->Canvas->LineTo(Image2->Width, Image2->Height);
    

    Die Seiten von Image2 stellen also die Achsen dar. Das Problem ist aber, dass nur die Y-Achse (Image2->Canvas->LineTo (0,Image2->Height);) dargestellt werden. Bei der X-Achse bzw. der unteren Seite von Image2 wird gar nichts gezeichnet! Was kann ich tun?

    Vielen Dank für eure Hilfe
    lg, freakC++



  • Vielleicht zeichnest du die Achsen besser nicht ganz an den Rand (Abstand lassen). Wenn du irgendwann mal die Achsen beschriften möchtest musst du das ja sowieso tun.
    Mehr kann man hier mangels Code nicht sagen.



  • Das Problem mit dem Abstand ist, dass das optisch nicht so gut aussieht, da das Image immer eine andere Hintergrundsfarbe hat. Aber eigentlich kann es doch kein Problem sein auf der Unterseite des Image eine Linie zu zeichnen. Es funktioniert ja auch an der Seite!!

    Wenn ich es so schreibe...

    Image1->Canvas->MoveTo(0,0);
    Image1->Canvas->LineTo (0,Image2->Height);
    Image1->Canvas->LineTo(Image2->Width, Image2->Height/1.1);
    

    ...funktioniert alles, doch die Linie befindet sich nicht auf der Unterseite von Image, sondern ein bisschen darüber (wegen 1.1). Wenn ich nun das "/1.1" wegmache,...

    Image2->Canvas->MoveTo(0,0);
    Image2->Canvas->LineTo (0,Image2->Height);
    Image2->Canvas->LineTo(Image2->Width, Image2->Height);
    

    ...um die gewünschte Linie zu erhalten, kommt einfach gar kein!!

    Könnt ihr mir helfen?? Ich kapier das nicht!

    lg, freakC++



  • Du musst logischerwiese die Liniendicke (in Pixel) von der Height abziehen...



  • ups...meine ich auch eigentlich!! Weiß jemand, wie ich mein Problem lösen kann??

    lg, freakC++



  • Machs doch genau wie Joe sagte.



  • ja, ich werde dies machen, doch hätte es mich einfach mal interessiert warum es nicht so funktionert hat, wie ich beschrieben habe!!

    lg, freakC++



  • Image2->Height ist die Höhe des Bildes. Die Zählung der Pixel beginnt bei 0. Na merkst du was?


Anmelden zum Antworten