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 13:29 
Hi, ich hab ein Prob mit der sinusfunktion von Delphi...oder besser mit canvas..
ich will eine Sinuskurve in delphi zeichnen und diese entweder komplett vergrössern, sodass man wenigstens die Form einer Sinuskurve erkennen kann, oder die Frequenz und die Amplitude verändern können. In den anderen Threads habe ich auch keine hilfe gefunden...

ich hab hier mal den quellcode auszug der schleife die die Sinuskurve bisher zeichnet:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
repeat
begin
// +130 damit die sinuskurve in mein image gezeichnet werden kann.
ypos := round(amp*(sin(temp*freq))) +130;
image1.Canvas.lineto(xpos, ypos);

xpos := xpos + 1;
temp := temp + 1;
end
until xpos >= 360;


wenn ich die frequenz verändere, sieht man fast keinen unterschied und ich weiss nicht wie ich die berechnung und das zeichnen sonst durchführen soll...
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Sa 26.02.05 13:44 
Hallo.
butterkeks hat folgendes geschrieben:
ein Prob mit der sinusfunktion von Delphi

Könntest du dein Problem genauer schildern?

Amp muss in deinem Programm ca. 100 sein, und freq so 0.01.

Der Sinus ist 2pi-periodisch! (Wenn du in "Grad" rechnen willst, dann musst du sin(x*pi/180) schreiben. Das ist aber eine willkürliche, unmathematische Definition und es gibt eigentlich nie einen Grund in Grad zu rechnen; ausser wenn die Problemstellung es so verlangt...)

Gruss
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 14:20 
also zuerst mal zu meinem problem...
ich will zwei Sinuskurven in einem Image zeichnen und diese dann zu einer weiteren addieren.

Ich habe jetzt nur das Problem das ich nicht weiss wie man es anstellt das man die Kurve möglichst weit selbst definieren kann.
loetmann
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 29


Delphi 3
BeitragVerfasst: Sa 26.02.05 14:21 
moin moin,

so?:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
image1.Canvas.movetoto(0130);
freq:=200;
amp:=50;
For xpos:=0 to 200 do 
begin
 ypos:= trunc(130+amp*sin(2*pi*xpos/freq));
 image1.Canvas.lineto(xpos, ypos);
end;

zeichnet eine Sinuskurve mit 0-Achse auf 130, mit einer Amplitude von 50 nach oben und unten.
eine Kurve geht hierbei über 200 Pixel (xposMax), dann wird sie wiederholt.

Ein Gruß

Moderiert von user profile iconChristian S.: Code- durch Delphi-Tags ersetzt.
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 14:47 
ja...DANKE!

wie lange ich danach gesucht hab... :D
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Sa 26.02.05 14:47 
butterkeks hat folgendes geschrieben:
möglichst weit selbst definieren kann

a*sin(w*x-x0)+y0
=> Verschiebungen in x/y und Streckung in x/y Richtung
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 16:57 
hey danke, aber ich hab inzwischen schon wieder 2 neue probleme...
als erstes: ich kann die frequenz zwar bestimmen, aber wenn ich eine höhere frequenz eingebe, wird die schwingung nicht kürzer sondern länger.

quellcode:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
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;


und zum zweiten...zeichnen kann ich jetzt, aber bei der addition zeichnet er mir nur einen strich nach unten...den quellcode habe ich hier:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
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;
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Sa 26.02.05 17:02 
butterkeks hat folgendes geschrieben:
aber ich hab inzwischen schon wieder 2 neue probleme...

Ich würde nen neuen Thread starten, sonst liest das niemand mehr, weil das Thema ein Häkchen hat.

Wenn die Frequenz zu hoch ist, nämlich höher als es der Bildschirm darstellen kann, dann geht das ganze natürlich nicht mehr. Dann kommen sogenannte Aliasing-Effekte rein. Der gleiche Effekt tritt auf, wenn du im Fernsehen das Rad eines Autos rückwärts drehen siehst, obwohl das Auto vorwärts fährt. Was kannst du dagegen tun? Kantenglättung mit Antialiasing. Wenn dir das zu mühsam ist: Du musst auf jeden Fall sicherstellen, dass du eine Sinusperiode mit allermindestens 2 Punkten abtastest; je mehr desto besser. Wenn du dann ne zu hohe Frequenz wählst, kriegst du dann halt einfach nen schwarzen Balken ;)

Übrigens: Wieso teilst du durch Freq? Es ist Amplitude*sin(Frequenz*2pi*x-x0)+y0. Frequenz ist dann in Sinusperioden pro Pixel. Wenn du Pixel pro Sinusperiode willst, dann bennen die Variable anders, z.B. P wie Periodenlänge oder sowas. Frequenz=1/Periodenlänge.