![]() |
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:
Bitte um Hilfe, das verwirrt mich zu tiefst....
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 |
Re: Tangeskurve
Delphi-Quellcode:
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!
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; |
Re: Tangeskurve
Mit ohne Pi kommst du wahrscheinlich nur sehr unwahrscheinlich auf ein Vielfaches von (Pi/2). Daher "triffst" du die Polstellen erst garnicht.
|
Re: Tangeskurve
Zitat:
Danke... Wie würde die lauten? Wann ergibt der Cosinus eines Wertes null? |
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; |
Re: Tangeskurve
Zitat:
Zitat:
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:
Unter Win32-Delphi gibt's die Funktion Math.isZero(zahl), die die nötige Spanne aus dem Datentyp ermittelt, und testet.
if (cos(irgendwas) < -0.00000001) or (cos(irgendwas) > 0.00000001) then
begin .... end; \\edit: Und Binärbaum hat unter mir die effizientere Variante gepostet :) |
Re: Tangeskurve
Mach's doch so:
Delphi-Quellcode:
Damit hast du auch solche Fälle überprüft, wo der Cosinus "beinahe" null ist und dürftest so auf der sicheren Seite sein.
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; MfG Binärbaum |
Re: Tangeskurve
Zitat:
x mod 90 mod 2 gilt in dezimalgrad also: 90° = pi/2 rad 270* = pi(2/3) rad usw. |
Re: Tangeskurve
Zitat:
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. |
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