Autor Beitrag
Probation91
Hält's aus hier
Beiträge: 5

Win XP

BeitragVerfasst: 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 user profile iconKha: URL gewrappt, die mochte unser Parser wohl nicht so sehr...
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19313
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 10.05.09 19:07 
Hallo und :welcome: 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 Threadstarter
Hält's aus hier
Beiträge: 5

Win XP

BeitragVerfasst: So 10.05.09 19:21 
Hi!

Also ich hatte mir das so vorgestellt:

ausblenden 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 user profile iconKha: Delphi-Tags hinzugefügt
jfheins
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 918
Erhaltene Danke: 158

Win 10
VS 2013, VS2015
BeitragVerfasst: So 10.05.09 19:37 
Du musst noch entsprechend skalieren - der interessante y-Bereich ist zwischen -0,25 und 0,25 ;)
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19313
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 5

Win XP

BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1747
Erhaltene Danke: 15

Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
BeitragVerfasst: 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.

user profile iconjfheins hat folgendes geschrieben Zum zitierten Posting springen:
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 :wink: )

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:

ausblenden Delphi-Quelltext
1:
2:
MittelpunktX := Image1.Width div 2;
MittelpunktY := Image1.Height div 2;


und beim Umrechnen:

ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 5

Win XP

BeitragVerfasst: So 10.05.09 21:00 
Okay, also das hier ist mein Quelltext:


ausblenden 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 :idea: hab das Bild in den Anhang rein...
Einloggen, um Attachments anzusehen!
jfheins
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 918
Erhaltene Danke: 158

Win 10
VS 2013, VS2015
BeitragVerfasst: So 10.05.09 21:31 
ausblenden volle Höhe 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:
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// 10 Pixel/Einheit
scaley := 200// 200 Oixel/Einheit

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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1747
Erhaltene Danke: 15

Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
BeitragVerfasst: So 10.05.09 21:33 
Kein Wunder. Du gehst die Sache völlig falsch an, glaube ich ...

Das Grundgerüst:

ausblenden 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; // ungetestet, sollte aber klappen
  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".