Entwickler-Ecke

Sonstiges (Delphi) - Funktionsgraphen Zeichnen


grmld - So 04.01.09 20:53
Titel: Funktionsgraphen Zeichnen
#


Hidden - So 04.01.09 21:14

Hi :)

An welche Komponente hattest du zur Darstellung gedacht? TPaintBox? TImage?

Deine Fehlermeldung kommt daher, dass MoveTo nur ganze Zahlen akzeptiert(die Pixel halt ;)), "real" aber eine Kommazahl ist. Nimm noch ein Round() drumrum(Unit Math) oder einfach ein Trunc(), das schneidet den Nachkommaanteil ab und es muss keine unit eingebunden werden.

Dein Ansatz würde aber eine ziemlich zackige Kurve ergeben, wie ein Börsenkurs. Besser wäre es, du würdest es für jedes Pixel der Ausgabebitmap machen. Angenommen deine Bitmap hat eine Breite von w Pixeln. Dann wäre w ja 20 zugeordnet, somit wäre die Stelle x deiner Bitmap im Pixel i ja x = (i-w/2)*20/w (du musst noch um die Hälfte Verschieben, da die Ecke deiner Bitmap nicht der Ursprung deines Koordinatensystems ist).


Delphi-Quelltext
1:
2:
for i := 0 to MyBitmap.Width do
  ZeichneFunktionswert((i-w/2)*20/w, f((i-w/2)*20/w));


So. Jetzt dürfte dein Graph auf dem Kopf stehen. Denn der Punkt 0/0 auf deiner Bitmap ist links oben. Also noch vor dem zeichnen "y := MyBitmap.Height - y" einbauen.

mfG,


grmld - So 04.01.09 21:28

Wow danke für die rasche Antwort!
Und ja mir ist auch schon aufgefallen, dass es ziemlich kantig aussehen würde (obwohl ich glaube, dass wir das so machen sollen, aber dein Weg ist ja um einiges eleganter!)
Ich hab'zwar nur die Hälfte verstanden, aber ich versuch das mal gleich aus

Nur eine Frage: Was ist eine "bitmap" (zur Darstellung dachte ich an TImage)? und werden bei deiner Lösung auch arrays benutzt? (ich konnte das nicht erkennen tut mir leid :( )


Hidden - So 04.01.09 21:51

Hi :)

Eine Bitmap ist einfach gesprochen ein 2-Dimensionales Array, also eine Tabelle mit Pixelfarbwerten. Bei einem TImage arbeitest du mit einer Bitmap, du merkst es nur nicht.

MyImage.Canvas.MoveTo ist äquivalent zu MyImage.Picture.Bitmap.Canvas.MoveTo

Ich dachte daran, mit den Werten sofort auf das Bild zu zeichnen, du kannst aber gerne auch noch die Zwischenstation eines Arrays[0..MyBitmap.Width] nehmen :nixweiss:

mfG,


grmld - Mo 05.01.09 22:44

cool ich hab jetzt wirklich verstanden was du geschrieben hast, aber eine letzte frage :D



for i:=-10 to 10 do begin
zahl[i]:=((i*i*i)/50);
image1.Canvas.moveto(image1.width div 2 + i*20 ,image1.Height div 2 - round(zahl[i]*20)) ;
image1.Canvas.lineto(image1.width div 2 + (i+1)*20 ,image1.Height div 2 - round(zahl[i]*20));
end;


das hab ich jetzt und müsste funktionieren allerdings ist das rot markierte das problem, weil da zahl[i+1]*20 stehen müsste!, aber das berechnet delphi nicht.
ich habs auch probiert mit ner variablen (x:=i+1) und dann einfach x da eingesetzt, aber auch das führt zum absturz :(
gibt es da ne lösungsmöglichkeit? (also ich möchte quasi nur das array "hochzählen" in der schleife"


jaenicke - Mo 05.01.09 22:48

Deine Schleife läuft bis 10, dein Array auch. So, jetzt greifst du in der ersten Zeile auf zahl[i] zu, also zahl[10]. Kein Problem.
In der zweiten Zeile versuchst du aber auf zahl[i + 1] zuzugreifen, nur dein Array geht nur bis 10.
Verstehst du? ;-)

Deshalb lass die Schleife nur bis 9 laufen, der letzte Wert wird ja durch das Ende des Striches vom neunten zum zehnten Wert dargestellt. ;-)


grmld - Mo 05.01.09 22:57

hab ich ausprobiert, aber mir erscheint die fehlermeldung "ungültige gleitkommaoperation", die gleiche fehlermeldung wie auch davor. : /, aber danke für den tip, denn deins stimmt ja trotzdem


jaenicke - Mo 05.01.09 23:00

Du initialisierst dein Array zahl in der selben Schleife sehe ich gerade. Und diese Initialisierung ist natürlich nur bis zahl[i] gekommen, wenn du schon auf zahl[i+1] zugreifen müsstest.
zahl[i+1] hat deshalb schlicht keinen bestimmten Wert, und deshalb der Fehler.

Trenne die Berechnung der Zahlen von der Darstellung, zumindest was die Schleifen angeht. ;-)


grmld - Mo 05.01.09 23:10

ich kann mich nur bedanken :)
mit der zeit beginnt man richtig zu denken :D

danke :-*

EDIT: Ist mir schon peinlich mit dem Fragen, aber hilft ja alles nichts, weil mir google nicht weiterhelfen will : /

--> wie kann man die Schriftgröße bei canvas.textout verändern?


Hidden - Mo 05.01.09 23:59

ich nehme mal stark an: canvas.Font.Size := .. ;)

Für weitere Fragen aber bitte einen neuen Thread :)

mfG,


jaenicke - Di 06.01.09 00:02

Und hättest du korrekt eine neue Frage dafür aufgemacht, dann hätte ich auch gleich geantwortet, aber dein Edit habe ich schlicht nicht gesehen. ;-)