Entwickler-Ecke
Sonstiges (Delphi) - Sinuskurven addieren
butterkeks - Sa 26.02.05 18:07
Titel: Sinuskurven addieren
Ich habe ein problem beim addieren von zwei sinuskurven...
ich will zwei kurven in einem image zeichnen und sie dann addieren...
kann mir irgendeiner sagen wie ich das machen kann?
hier ist der bisherige quellcode der addition:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| var xpos : integer; Lfreq1, Lamp1, Lfreq2, Lamp2 : integer; begin image1.canvas.moveto (30, 130); For xpos:=30 to 360 do begin ypos:= (trunc(130+Lamp1*sin(2*pi*(xpos-30)/Lfreq1))) + (trunc(130+Lamp2*sin(2*pi*(xpos-30)/Lfreq2))); image1.Canvas.lineto(xpos, ypos);
end; |
und als zweites funktioniert die zeichnung auch noch nicht so wie sie soll...
ich kann zwar die Sinuskurven zeichnen und auch die amplitude und die frequenz verändern, aber die frequenz wirkt sich genau verkehrt herum aus...also bei höherer frequenz weniger schwingungen.
quellcode dazu:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| var xpos : integer; begin image1.canvas.moveto (30, 130); For xpos:=30 to 360 do begin ypos:= trunc(130+amp*sin(2*pi*(xpos-30)/freq)); image1.Canvas.lineto(xpos, ypos);
end; |
delfiphan hat mir dazu schon mal was geschrieben:
Zitat: |
Übrigens: Wieso teilst du durch Freq? Es ist Amplitude*sin(Frequenz*2pi*x-x0)+y0. |
allerdings weiss ich nicht was dabei x, x0 und y0 sein soll...
delfiphan - Sa 26.02.05 19:22
Sowas kriegste normalerweise nur als Geburtstagsgeschenk!
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: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64:
| Const Zoom = 1;
Type MathFunction = function(const x : real) : real;
Var amp1, freq1, amp2, freq2 : real; X0, Y0 : Integer;
Procedure Plot(f : MathFunction; const Canvas : TCanvas); Var X, L : Integer; begin with Canvas do begin L := Canvas.ClipRect.Left; MoveTo(L, -trunc(f((L-X0)/Zoom)*Zoom)+Y0); For X := L+1 to Canvas.ClipRect.Right do LineTo(X, -trunc(f((X-X0)/Zoom)*Zoom)+Y0); end; end;
function F1(const x : real) : real; begin Result := amp1*sin(freq1*2*pi*x); end;
function F2(const x : real) : real; begin Result := amp2*sin(freq2*2*pi*x); end;
function F3(const x : real) : real; begin Result := F1(x)+F2(x); end;
procedure TForm1.FormCreate(Sender: TObject); begin with Image1 do begin amp1 := Height / 4; freq1 := 1/Width; amp2 := 20; freq2 := 1/100; X0 := Width div 2; Y0 := Height div 2;
with Canvas do begin MoveTo(0,Y0);LineTo(Width,y0); MoveTo(X0,0);LineTo(X0,Height); Pen.Width := 2; Pen.Color := clGray; Plot(@F1,Canvas); Plot(@F2,Canvas); Pen.Color := clBlack; Plot(@F3,Canvas); end; end; end; |
butterkeks - Sa 26.02.05 21:06
hey danke vielmals...
ich hab das gerade mal ausprobiert aber er erkennt z.B. Zoom und image nicht...
ich bin noch nicht so weit mit delphi das ich alle befehle kenne aber muss z.B. bei
"with image do" nicht noch was dazu? ich meine with image1.xxx oder so...
delfiphan - Sa 26.02.05 23:01
butterkeks hat folgendes geschrieben: |
ich hab das gerade mal ausprobiert aber er erkennt z.B. Zoom und image nicht... |
-Zoom ist ja auf der zweiten Zeile definiert. Vielleicht hast du beim Kopieren nicht ganz alles erwischt.
-Es muss natürlich ein TImage mit dem Namen "Image1" auf dem Form sein.
butterkeks hat folgendes geschrieben: |
muss z.B. bei "with image do" nicht noch was dazu? ich meine with image1.xxx oder so... |
Nein das stimmt; ich teste natürlich den Code, bevor ich ihn poste ;)
butterkeks - So 27.02.05 09:35
hmmm...ich habs nochmal neu probiert, aber ich bekomme immernoch die meldung undefinierter bezeichner onCreate, image1, height, width, canvas und moveto.
delfiphan - So 27.02.05 10:40
Du kannst nicht einfach den Source reinkopieren und kompilieren! Schau dir doch mal den Source genauer an.
Image1: Wie gesagt, du musst ein Image1 auf dem Form haben. OnCreate: Du musst einen OnCreate Event kreieren.
Du hast doch schon ein Programm, das halbwegs funktioniert. Dort hast du auch einen onCreate oder onClick Event oder sowas. Und ein Image1 wirst du ja dort auch haben.
butterkeks - So 27.02.05 10:57
Danke nochmal...ich habs endlich hinbekommen...!
butterkeks - So 27.02.05 12:27
ich hab noch ein problem entdeckt...in deinem quelltext benutzt du die variable "x" aber du legst nirgends fest was drin stehen soll...bei meinen berechnungen glaube ich ist dieser faktor das was die fehler verursacht...wofür steht dieses x?
delfiphan - So 27.02.05 12:43
Delphi-Quelltext
1: 2: 3: 4:
| function F1(const x : real) : real; begin Result := amp1*sin(freq1*2*pi*x); end; |
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| For Image1_X := Canvas.ClipRect.Left to Canvas.ClipRect.Right do begin LineTo(Image1_X, -trunc(F1((Image1_X-X0)/Zoom)*Zoom)+Y0); end; |
Ich hoffe das macht es ein bisschen verständlicher.
amp1, freq1, 2 und pi sind Konstanten. Du brauchst in deinem Sinus auch eine Variable; sonst wird die ganze Auswertung konstant und du kriegst überhaupt keine Schwingung. Also Mathenachhilfe gebe ich hier also nicht ;)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!