Entwickler-Ecke
Sonstiges (Delphi) - Sinuskurven zeichnen
butterkeks - Sa 26.02.05 13:29
Titel: Sinuskurven zeichnen
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:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| repeat begin 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 - 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 - 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 - Sa 26.02.05 14:21
moin moin,
so?:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| image1.Canvas.movetoto(0, 130); 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
Christian S.: Code- durch Delphi-Tags ersetzt.
butterkeks - Sa 26.02.05 14:47
ja...DANKE!
wie lange ich danach gesucht hab... :D
delfiphan - 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 - 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:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| 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; |
und zum zweiten...zeichnen kann ich jetzt, aber bei der addition zeichnet er mir nur einen strich nach unten...den quellcode habe ich hier:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| 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; |
delfiphan - 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.
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!