Delphi-PRAXiS
Seite 3 von 3     123   

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)

faux 15. Feb 2005 18:38

Re: Tangeskurve
 
Hm:

Ich hab jetzt folgendes Herausgefunden:

es liegt am Pi...

Fragt mich nicht wieso, aber das dürfte wohl an der Reihenentwicklung von Tanges liegen...

Lässt man das Pi weg, gibts keine Probleme, aber sobald man das Pi reistellt, hängt das Programm an den Polstellen...
Vielleicht liegt das daran, dass der Cosinus von Pi -1 und der Sinus von Pi 0 sind...

also:

Delphi-Quellcode:
y := round(tan(Amp.Value * x / Image1.Width * Frq.Value * Pi)); //Das Programm hängt
y := round(tan(Amp.Value * x / Image1.Width * Frq.Value)); //Es läuft
Bitte um Hilfe, das verwirrt mich zu tiefst....

Bart82 15. Feb 2005 18:44

Re: Tangeskurve
 
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;
Es ist besser du machst eine Abfrage auf das Argument, dass das nicht die unerlaubten Werte annimmt. Da die cosinus-Funktion eine Gleitkommazahl zurück gibt wird die fast nie exakt 0 sein, sondern u.U. 0.00...1!

dizzy 15. Feb 2005 18:46

Re: Tangeskurve
 
Mit ohne Pi kommst du wahrscheinlich nur sehr unwahrscheinlich auf ein Vielfaches von (Pi/2). Daher "triffst" du die Polstellen erst garnicht.

faux 15. Feb 2005 18:51

Re: Tangeskurve
 
Zitat:

Zitat von Bart82
Es ist besser du machst eine Abfrage auf das Argument, dass das nicht die unerlaubten Werte annimmt. Da die cosinus-Funktion eine Gleitkommazahl zurück gibt wird die fast nie exakt 0 sein, sondern u.U. 0.00...1!

Das ist eine gute Idee...

Danke...

Wie würde die lauten?
Wann ergibt der Cosinus eines Wertes null?

Bart82 15. Feb 2005 18:59

Re: Tangeskurve
 
Der Cosinus ist für Pi/2 und 3*Pi/2 (allgemein (2n-1)*Pi/2 mit n=1,2,3...) 0.
z.B.
Delphi-Quellcode:
while Argument >= 3*Pi/2 do begin
  Argument - Pi; // so kommst du in den Bereich von 0 bis ausschließlich 3*Pi/2
end;
if Argument <> Pi/2 do begin
                 // hier dein Code
end;

dizzy 15. Feb 2005 18:59

Re: Tangeskurve
 
Zitat:

Zitat von faux
Zitat:

Zitat von Bart82
Es ist besser du machst eine Abfrage auf das Argument, dass das nicht die unerlaubten Werte annimmt. Da die cosinus-Funktion eine Gleitkommazahl zurück gibt wird die fast nie exakt 0 sein, sondern u.U. 0.00...1!

Das ist eine gute Idee...

Das hatte ich dir auch schon geschrieben...

Zitat:

Zitat von faux
Wann ergibt der Cosinus eines Wertes null?

Bei Vielfachen von (Pi/2). (Meinem obigen Posting auch zu entnehmen, wenn auch nicht in aller Deutlichkeit.)
Aber das hilft dir nicht weiter, da man bei Float-Werten NIE sicher sein kann einen Wert ganz genau zu treffen. (Zur Erklärung hab ich hier schon mal was längeres gepostet - müsstest mal suchen.)

Also:
Delphi-Quellcode:
if (cos(irgendwas) < -0.00000001) or (cos(irgendwas) > 0.00000001) then
begin
....
end;
Unter Win32-Delphi gibt's die Funktion Math.isZero(zahl), die die nötige Spanne aus dem Datentyp ermittelt, und testet.

\\edit: Und Binärbaum hat unter mir die effizientere Variante gepostet :)

Binärbaum 15. Feb 2005 19:01

Re: Tangeskurve
 
Mach's doch so:
Delphi-Quellcode:
var sinus, cosinus: Double;
    x: Integer;
begin
 for x := 0 to Image1.Width do
 begin
   SinCos(x / Image1.Width * 4 * pi, sinus, cosinus);
   if abs(cosinus) > 0.00001 then//0.00001 bei Bedarf ändern
   begin
     y := round( sinus/ cosinus);//sin(alpha)/cos(alpha)=tan(alpha)
     LineTo(x, Image1.Height div 2 - y);
   end;
 end;
end;
Damit hast du auch solche Fälle überprüft, wo der Cosinus "beinahe" null ist und dürftest so auf der sicheren Seite sein.

MfG
Binärbaum

faux 15. Feb 2005 19:04

Re: Tangeskurve
 
Zitat:

Zitat von Bart82
Der Cosinus ist für Pi/2 und 3*Pi/2 (allgemein (2n-1)*Pi/2 mit n=1,2,3...) 0.
z.B.

ok, sorry... ist logisch:

x mod 90 mod 2 gilt in dezimalgrad
also:
90° = pi/2 rad
270* = pi(2/3) rad
usw.

Binärbaum 15. Feb 2005 20:36

Re: Tangeskurve
 
Zitat:

Zitat von faux
x mod 90 mod 2 gilt in dezimalgrad
also:
90° = pi/2 rad
270* = pi(2/3) rad
usw.

Erstens: 270° sind 3/2*Pi Radiant (war also evtl. nur ein Tippfehler von dir ? )
Zweitens: x mod 90 mod 2 ist nicht nur bei den Polstellen null.
Bsp: x=4 --> 4 mod 90 mod 2 = 0
oder
x=180 --> 180 mod 90 mod 2 = 0, obwohl bei 180° keine Polstelle ist.
Damit funktioniert das schonmal nicht, und deswegen muss man es ändern.
Also wenn schon über modulo, dann (x-90) mod 180 .

MfG
Binärbaum


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:58 Uhr.
Seite 3 von 3     123   

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