Autor Beitrag
XZeranski
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 38



BeitragVerfasst: Fr 28.03.03 16:25 
Hallo, ich bin noch relativ neu im Delphi programmieren und habe folgende Frage:

Wenn ich einen Funktionswert habe wie kann ich den in einem Bild grafisch darstellen lassen?
Also z.b. für 3*x möchte ich den Graphen zeichnen lassen. Kann ich das mit einem Image und den Canvas befehlen machen? Aber welche Befehle müsste ich benutzen damit ich eine Linie und keine Punkte bekomme?

Thx!
Alibi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 458

Win2K SP3
Delphi 6 Ent
BeitragVerfasst: Fr 28.03.03 16:40 
Yep, Canvas ist genau der richtige Weg.

Mit LineTo geht das gut.

Was ähnliches wie Funktionszeichnen hab ich hier gemacht:
www.philiplb.de/cgi-...gramdetail&id=25

In der Facharbeit ist die Zeichenroutine erklärt (Mitsamt der Routine natürlich). Ist recht ähnlich.
XZeranski Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 38



BeitragVerfasst: Fr 28.03.03 16:52 
Danke für deine Hilfe, Mit LineTo hab ich es eben versucht und für lineare Funktionen funktioniert es wirklich gut. Aber was ist z.b. bei quadratischen Funktionen? Da funktioniert es ja leider nicht mehr...
madigeMade
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24



BeitragVerfasst: Fr 28.03.03 17:06 
Hi Zeranski!

Da jede Fkt. gleich aufgebaut ist, nämlich das jedem X-Wert ein Y- Wert zugeodnet wird, musst du es auch bei dieser Funktion machen. Jedem X Wert wird ein Y- Wert zugeornet, z.B. für y=x²
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
var x,y: real;
begin
x:=-10;
  while x<10 do
  begin
    x:=x+0.01;
    y:=x*x;
    image1.canvas.pixels[round(x+50),round(-y+100)]:=clblack;
  end;
end;


Versuchs ma...

Gruß de Made

_________________
Ich kam, sah und schrieb ein Prog.


Zuletzt bearbeitet von madigeMade am Fr 28.03.03 17:21, insgesamt 1-mal bearbeitet
Alibi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 458

Win2K SP3
Delphi 6 Ent
BeitragVerfasst: Fr 28.03.03 17:11 
Klar funktioniert lineto mit nicht-linearen Funktionen. Siehe das Lissajousprogramm. Die Formeln sind alles andere als Linear. :)

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
var
  i, y: integer;
begin
  y := 1;
  canvas.MoveTo(0,0);
  for i := 1 to 10 do begin
    y := i * i;
    canvas.LineTo(i,-y); // - y deswegen, weil die y-Achse umgedreht ist in Delphi
  end;
end;
XZeranski Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 38



BeitragVerfasst: Fr 28.03.03 18:42 
Danke für eure Hilfen,
@madigeMade: Es erscheint zwar eine Parabel, aber irgendwie sieht die entlang der x-Achse sehr zusammengestaucht aus. Woher kommt das?

@Alibi: Irgendwie funktioniert deine Idee nicht...
XZeranski Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 38



BeitragVerfasst: Fr 28.03.03 19:08 
Also wenn ich für x mal -5 bis 5 nehme wird das nur ein sehr kleines Gebilde. Ich müsste dann wohl den Maßstab umrechnen um ihn an mein Canvas von 500*500 anzugleichen. Aber wo bekomm ich die Werte her damit ich das umrechnen kann?
UGrohne
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Veteran
Beiträge: 5502
Erhaltene Danke: 220

Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
BeitragVerfasst: Fr 28.03.03 19:15 
Da gibts sowas wie Mathe :wink: Du brauchst ein Welt- und ein BilschirmkoordinatenSystem, am besten nimmst Du zwei Funktionen, mit denen Du diese umrechnen lassen kannst.

Du hast die linke und rechte Grenze, nehmen wir an -5 und 5 in den Einheiten, -5 entspricht dabei Pixel 0 und 5 dem Image1.Width, daraus ergibt sich, dass 1 auf dem Bildschirm Image1.width/(rechts-links), also image1.width/10 ist. Du gehst dann Pixelweise voran und rechnest den Pixelwert in Weltkoordinaten um (die Formel müsstest Du ja leicht aus dem gerade gesagtem erstellen können), rechnest den y-Wert mit Deiner Formel aus und wandelst diesen y-Wert wieder über eine Funktion (analog zu dem oben) in Bildschirmkoordinaten um, und zeichnest da einen Punkt.

Gruß
XZeranski Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 38



BeitragVerfasst: Fr 28.03.03 19:32 
Also müsste ich bei einem Image von 500*500 Pixel die Formel x² mit 0.02 multiplizieren, da ja eine Einheit auf dem Bildschirm 50 Einheiten auf dem Papier entspricht (bei einem System von -5 bis 5). Also rechne ich 1/50 und erhalte 0.02.

Ist das so korrekt?
Alibi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 458

Win2K SP3
Delphi 6 Ent
BeitragVerfasst: Fr 28.03.03 20:02 
Meine Idee war keine Lösung, die du 1zu1 übernehmen kannst, eher ein Denkanstoß. :)