Autor |
Beitrag |
Probation91
Hält's aus hier
Beiträge: 5
Win XP
|
Verfasst: So 10.05.09 18:54
Hallo Leute,
Bin hier im Forum total neu, als sorry falls ich das thema überlesen habe, wenn es schonmal hier besprochen wurde...
Ich habe morgen meine müdliche Abiturprüfung in Informatik und habe bis jetzt auch alle Übungsaufgaben meines Lehrers lösen können, nur an der letzten Aufgae scheitere ich:
Ich soll die Funktion:f(x)=x/(5+x^2) in ein Koordinadensystem zeichnen... (soll dann so aussehen: bit.ly/Y1RKW )
Ich habe keine Ahnung wie ich das Anstellen soll, da ich im Unterricht bisher nur Strichmännchen oder irgendwelchen Kindergartenmisst zeichnen musste...
Könntet ihr mir vlt einen Ansatz geben, ich weiß echt nicht wo ich anfangen soll...
Moderiert von Kha: URL gewrappt, die mochte unser Parser wohl nicht so sehr...
|
|
jaenicke
      
Beiträge: 19313
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: So 10.05.09 19:07
Hallo und  im Forum!
Du müsstest in einer Schleife die notwendigen Bildpunkte berechnen. Du hast ja einen bestimmten Zeichenbereich, z.B. 400 mal 300 Pixel. Und dann müsstest du für jeden Pixel in x-Richtung den Funktionswert berechnen und auf die in y-Richtugn vorhandenen Pixel skalieren.
Das ist erstmal eine mathematische Problemstellung. Welche Ideen hast du denn dazu? Was hast du probiert bisher?
|
|
Probation91 
Hält's aus hier
Beiträge: 5
Win XP
|
Verfasst: So 10.05.09 19:21
Hi!
Also ich hatte mir das so vorgestellt:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| var x,y: real; begin x:=-10; while x<10 do begin x:=x+0.001; y:=x/(5+sqr(x));
image1.canvas.pixels[round(x+100),round(-y+100)]:=clblack; end; end; |
Aber da kommt immer nur ein Strich raus...
Moderiert von Kha: Delphi-Tags hinzugefügt
|
|
jfheins
      
Beiträge: 918
Erhaltene Danke: 158
Win 10
VS 2013, VS2015
|
Verfasst: So 10.05.09 19:37
Du musst noch entsprechend skalieren - der interessante y-Bereich ist zwischen -0,25 und 0,25 
|
|
jaenicke
      
Beiträge: 19313
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: So 10.05.09 19:40
Überlege einmal was da für Werte herauskommen bzw. setze einen Haltepunkt auf die Zeile mit dem Image und schau nach...
-10 / (5 + -10^2) = -10 / 105, also ca. knapp 0,1...
Jetzt nimmst du das plus 100 und rundest. 100,1 ist gerundet aber nun einmal 100. Und deshalb bleibt der Wert eben konstant bei 100.
Du müsstest du Werte aber nicht verschieben entlang der y-Achse sondern skalieren, also mit einem Faktor multiplizieren, damit du etwas siehst.
Zudem schau dir deine x-Werte an. Die erhöhen sich in Schritten von 0.001, wie hoch ist diese Erhöhung denn gerundet, also in ganzen Pixeln? Nix, genau. 
|
|
Probation91 
Hält's aus hier
Beiträge: 5
Win XP
|
Verfasst: So 10.05.09 20:20
Okay das mit den X-Wert erhöhen versteh ichj, aber selbst wenn ich den immer nur um eins erhöhe kommt trotzdem nur ein strich raus...
Das liegt wohl an den gerundeten werten, aber diese muss ich doch runden, da sonst die Fehlermeldung "Inkompatible Typen Integer und extended" oder lieg ich da falsch? gibt es ne Alternative zu meinem Quelltext, oder bin ich einfach so betriebsblind, dass ich meinen Fehler net seh...???
|
|
Jakob_Ullmann
      
Beiträge: 1747
Erhaltene Danke: 15
Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
|
Verfasst: So 10.05.09 20:40
Es ist immer hilfreich, wenn du den aktuellen Quelltext postest. Evtl. hast du ja auch einen Fehler drin, der icht zu deiner Beschreibung passt?
Weiterhin würde ich nicht, wie du es gerade machst (falls ich dich richtig verstehe), die Argumente erhöhen, sondern die Pixel, und daraus dann die Argumente berechnen.
jfheins hat folgendes geschrieben : | Du musst noch entsprechend skalieren - der interessante y-Bereich ist zwischen -0,25 und 0,25  |
Wichtig, sonst siehst du nichts.
Außerdem solltest du nicht die Pixel einfärben, sondern die Punkte berechnen und diese dann mit Linien verbinden. Die wahrscheinlich sauberste Lösung liefert ein Array. Du kannst aber auch den letzten gezeichneten Punkt in einer Variablen abspeichern, dann geht es ohne Arrays (so macht das zum Beispiel JTM  )
Und noch zu beachten ist: Delphi hat ein anderes Koordinatensystem als das kartesische. Du musst die Koordinaten also erst einmal umrechnen.
Wahrscheinlich muss das Programm nicht so flexibel wie ein richtiger Plotter sein, von daher würde also folgendes reichen:
Delphi-Quelltext 1: 2:
| MittelpunktX := Image1.Width div 2; MittelpunktY := Image1.Height div 2; |
und beim Umrechnen:
Delphi-Quelltext 1: 2:
| PixelX := MittelpunktX + EinheitX * ZahlX; PixelY := MittelpunktY - EinheitY * ZahlY; |
Runden würde ich sowieso an deiner Stelle nur für das Zeichnen machen, alles andere so genau wie möglich abspeichern (ok, also Single reicht denke ich^^).
Zu deinem Strich: Poste mal einen Screenshot, sonst kann ich mir nicht wirklich vorstellen, wie dein Strich aussieht.
|
|
Probation91 
Hält's aus hier
Beiträge: 5
Win XP
|
Verfasst: So 10.05.09 21:00
Okay, also das hier ist mein Quelltext:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23:
| procedure TForm1.Button1Click(Sender: TObject);
var x,y: real; begin
image1.Canvas.MoveTo(160,321); image1.Canvas.LineTo(160,0);
image1.Canvas.MoveTo(321,160); image1.Canvas.LineTo(0,160);
x:=-10; while x<10 do begin x:=x+1; y:=x/(5+sqr(x));
image1.canvas.pixels[round(x+100),round(-y+100)]:=clblack; end; end; |
Wegen den Scrennshot: hab noch net rausbekommen wie ich hier Bilder einfüge, aber im Prinzip sieht man da eh nur ein Weißes Feld was durch 2 Linien in 4 Teile geteilt wird (praktisch ein Koordinatensystem) und im linkem oberen Feld des KS ist ein schmaler Strich drinne...
PS: aahhh  hab das Bild in den Anhang rein...
Einloggen, um Attachments anzusehen!
|
|
jfheins
      
Beiträge: 918
Erhaltene Danke: 158
Win 10
VS 2013, VS2015
|
Verfasst: So 10.05.09 21:31
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31:
| procedure TForm1.Button1Click(Sender: TObject);
var x,y, scalex, scaley: real; MittelpunktX, MittelpunktY; begin
image1.Canvas.MoveTo(160,321); image1.Canvas.LineTo(160,0);
image1.Canvas.MoveTo(321,160); image1.Canvas.LineTo(0,160);
MittelpunktX := Image1.Width div 2; MittelpunktY := Image1.Height div 2;
scalex := 10; scaley := 200; x:=-10; while x<10 do begin x:=x+1/scalex; y:=x/(5+sqr(x));
image1.canvas.pixels[round(scalex * x+MittelpunktX),round(-1 * scaley * y + yMittelpunktY)]:=clblack; end; end; |
Bitte selber nachvollziehen 
Zuletzt bearbeitet von jfheins am So 10.05.09 21:58, insgesamt 3-mal bearbeitet
|
|
Jakob_Ullmann
      
Beiträge: 1747
Erhaltene Danke: 15
Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
|
Verfasst: So 10.05.09 21:33
Kein Wunder. Du gehst die Sache völlig falsch an, glaube ich ...
Das Grundgerüst:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| i := 0; x := (i - BreiteDesBildes div 2) / EinheitX; y := 5/(5+sqr(x)); Image1.Canvas.BewegeNach(i, MittelpunktY - y * EinheitY); for i := 0 to BreiteDesBildes - 1 do begin x := (i - MittelpunktX) / EinheitX; y := 5/(5+sqr(x)); Image1.Canvas.LinieZiehen(i, MittelpunktY - y * EinheitY); Image1.Canvas.BewegeNach(i, MittelpunktY - y * EinheitY); end; i := BreiteDesBildes - 1; x := (i - MittelpunktX) / EinheitX; y := 5/(5+sqr(x)); Image1.Canvas.LinieZiehen(i, MittelpunktY - y * EinheitY); |
Wobei EinheitX zum Beispiel 50 sein kann (vorher initialisieren!)
edit: Mist, da war einer schneller!
edit2: Bei so kleinen Quelltexten finde ich immer den Fehler leicht, wenn ich mich dumm stelle, und den Quelltext zeilenweise von Hand "interpretiere".
|
|
|