Autor Beitrag
butterkeks
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 56

Win XP, Win 7
Delphi 2007
BeitragVerfasst: Sa 26.02.05 18:07 
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:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
var xpos : integer;
    Lfreq1, Lamp1, Lfreq2, Lamp2 : integer;
begin
//start der zeichnung
image1.canvas.moveto (30130);
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:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
var xpos : integer;
begin
//start der zeichnung
image1.canvas.moveto (30130);
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Sa 26.02.05 19:22 
Sowas kriegste normalerweise nur als Geburtstagsgeschenk!

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:
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; // eine volle Periode

  amp2 := 20;
  freq2 := 1/100// Periodenlänge 100 Pixel

  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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 56

Win XP, Win 7
Delphi 2007
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 56

Win XP, Win 7
Delphi 2007
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 56

Win XP, Win 7
Delphi 2007
BeitragVerfasst: So 27.02.05 10:57 
Danke nochmal...ich habs endlich hinbekommen...!
butterkeks Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 56

Win XP, Win 7
Delphi 2007
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: So 27.02.05 12:43 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
function F1(const x : real) : real;
begin
 Result := amp1*sin(freq1*2*pi*x);
end;

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
For Image1_X := Canvas.ClipRect.Left to Canvas.ClipRect.Right do
 // Image1_X geht vom linken bis zum rechten Rand des Image1
begin
 LineTo(Image1_X, -trunc(F1((Image1_X-X0)/Zoom)*Zoom)+Y0); 
            // Image1_X-X0: Koordinatensystem-Ursprung in die Mitte des Image1 verschieben (in X-Richtung)
            // Y0: Koordinatensystem-Ursprung in die Mitte des Image1 verschieben (in Y-Richtung)
            // Zoom: Zoomfaktor. "Zoom = 2" => Alles doppelt so gross zeichnen. "Zoom = 1/2" => alles halb so gross zeichnen. 
            // Das Minuszeichen vor Trunc: Koordinatensystem auf den Kopf stellen (weil die y-Achse Richtung oben zeigt)
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 ;)