Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Tangeskurve (https://www.delphipraxis.net/40412-tangeskurve.html)

Binärbaum 15. Feb 2005 17:48

Re: Tangeskurve
 
Zitat:

Zitat von idontwantaname
könnte irgendwann eine division durch 0 erfolgen ??

Ja, nämlich immer dann, wenn der Winkel ein ganzzahliges ungerades vielfache von Pi/2 ist. Also bei (2*k+1)*Pi.
Um das abzufangen kann man folgendes machen:
Delphi-Quellcode:
var x: Integer;//Winkel in Grad
...

if (x-90) mod 180 = 0 then begin
 //Tangens ist an dieser Stelle nicht definiert
 ...
end
else begin
 //Kurve zeichnen
end;
MfG
Binärbaum

faux 15. Feb 2005 17:52

Re: Tangeskurve
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo!

Also eine Division schließe ich mal aus, denn dann würde die Fehlermeldung ja "Division by Zero" lauten...
Zur Sicherheit hab ich das mal mit folgender Anweisung ausgeschlossen:

Delphi-Quellcode:
for x := 0 to Image1.Width do
  if cos(x / Image1.Width * Frq.Value * pi) <> 0 then
  begin
    y := round(Amp.Value * tan(x / Image1.Width * Frq.Value * pi));
    LineTo(x, Image1.Height div 2 - y);
  end;
Also ich hab die Stelle jetzt:

Delphi-Quellcode:
for x := 0 to Image1.Width do
begin
  y := round(Amp.Value * tan(x / Image1.Width * Frq.Value * pi)); //Hier ist es....
  LineTo(x, Image1.Height div 2 - y);
end;
Den Wert hab ich noch nicht herausgefunden, aber vielleicht bringt da ja jemand zusammen...

faux 15. Feb 2005 17:57

Re: Tangeskurve
 
Zitat:

Zitat von idontwantaname
wieso eigentlich:
Delphi-Quellcode:
for x := 0 to Image1.Width
wäre es nicht eher:
Delphi-Quellcode:
for x := 0 to Image1.Width - 1

dann müsste es aber auch
Delphi-Quellcode:
for x := 1 to Image1.Width - 1
heißen...

Aber es ist schon so in Ordnung. Denn 1. zeichnet Delphi die Werte trotzdem, und außerdem ist der Wert Image1.Width IMHO noch im Bild.

dizzy 15. Feb 2005 18:01

Re: Tangeskurve
 
Zitat:

Zitat von faux
und außerdem ist der Wert Image1.Width IMHO noch im Bild.

Ist er NICHT. Zeichne mal einen einzelnen Pixel dahin, und sag mir ob du ihn siehst ;). Deinem Screenshot nach ist es aber wohl nicht die Zeichenroutine (die in der Regel gegen "Überm-Rand-Zeichnen" gesichert sind), sondern dein Prog fliegt bei einer Polstelle raus.
Ich vermute mal, dass das Ergebnis der Division, wenn 0 schon ausgeschlossen ist, zu groß für den Datentyp wird, und deshalb abgebrochen wird. Du solltest also Divisionen von -0.0...01 bis +0.0...01 ausschließen, und nicht nur 0 selbst.

Gruss,
Fabian

ibp 15. Feb 2005 18:01

Re: Tangeskurve
 
was ist mit den x-werten, wo tangens unendlich ist (cos(x)=0)! wo filterst du die in deinem code aus?

faux 15. Feb 2005 18:12

Re: Tangeskurve
 
Hallo!

Ich hab die FOR - Schleife jetzt Schritt für Schritt nachgerechnet (*g*)...
Und bin auch mit meinem TR bei 61 auf eine Polstelle gestoßen...
Und siehe da: Bei X = 61 hängt das Programm....

Wieso ist das so?
Deswegen:
Formel:
tan(X / Image1.Width * 4 * Pi)
Image1.Width ist 488

Rechengang:
tan(X) = sin(X) / cos(x)
cos(61 / 488 * 4 * Pi) = 0

Wieso erkennt das mein Programm nicht, wenn ich schreibe:
Delphi-Quellcode:
if cos(X / Image1.Width * 4 * Pi) <> 0

Binärbaum 15. Feb 2005 18:15

Re: Tangeskurve
 
Zitat:

Zitat von faux
Also eine Division schließe ich mal aus, denn dann würde die Fehlermeldung ja "Division by Zero" lauten...

Die meldung heißt ja "Invalid floating point operation", und die Division durch null ist meiner Meinung nach auch eine ungültige Operation :wink:

MfG
Binärbaum

faux 15. Feb 2005 18:24

Re: Tangeskurve
 
Zitat:

Zitat von ibp
was ist mit den x-werten, wo tangens unendlich ist (cos(x)=0)! wo filterst du die in deinem code aus?

Genau das meine ich, das mache ich nämlich und trotzdem tritt der Fehler auf:

Delphi-Quellcode:
for x := 0 to Image1.Width do
begin
  if cos(x / Image1.Width * 4 * pi) <> 0 then
  begin
    y := round(tan(x / Image1.Width * 4 * pi));
    LineTo(x, Image1.Height div 2 - y);
  end;
end;

Bart82 15. Feb 2005 18:34

Re: Tangeskurve
 
@ibp: Das sind ja die Stellen mit Division durch 0! Die sind raus.

dizzy 15. Feb 2005 18:35

Re: Tangeskurve
 
Weil 0 bei Floats nicht unbedingt genau 0 ist. Du musst eine klitze kleine Spanne um 0 herum abfangen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:57 Uhr.
Seite 2 von 3     12 3      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz