AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Tangeskurve

Ein Thema von faux · begonnen am 15. Feb 2005 · letzter Beitrag vom 15. Feb 2005
Antwort Antwort
Seite 3 von 3     123   
Benutzerbild von faux
faux

Registriert seit: 18. Apr 2004
Ort: Linz
2.044 Beiträge
 
Turbo Delphi für Win32
 
#21

Re: Tangeskurve

  Alt 15. Feb 2005, 18:38
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....
Faux Manuel
Wer weiß, dass er nichts weiß, weiß mehr, als der der nicht weiß, dass er nichts weiß.
GoTrillian
  Mit Zitat antworten Zitat
Bart82

Registriert seit: 27. Aug 2004
24 Beiträge
 
Delphi 7 Professional
 
#22

Re: Tangeskurve

  Alt 15. Feb 2005, 18:44
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!
Carsten
Life's a piece of shit
when you look at it!
- Monty Python -
  Mit Zitat antworten Zitat
Benutzerbild von dizzy
dizzy

Registriert seit: 26. Nov 2003
Ort: Lünen
1.932 Beiträge
 
Delphi 7 Enterprise
 
#23

Re: Tangeskurve

  Alt 15. Feb 2005, 18:46
Mit ohne Pi kommst du wahrscheinlich nur sehr unwahrscheinlich auf ein Vielfaches von (Pi/2). Daher "triffst" du die Polstellen erst garnicht.
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel
  Mit Zitat antworten Zitat
Benutzerbild von faux
faux

Registriert seit: 18. Apr 2004
Ort: Linz
2.044 Beiträge
 
Turbo Delphi für Win32
 
#24

Re: Tangeskurve

  Alt 15. Feb 2005, 18:51
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?
Faux Manuel
Wer weiß, dass er nichts weiß, weiß mehr, als der der nicht weiß, dass er nichts weiß.
GoTrillian
  Mit Zitat antworten Zitat
Bart82

Registriert seit: 27. Aug 2004
24 Beiträge
 
Delphi 7 Professional
 
#25

Re: Tangeskurve

  Alt 15. Feb 2005, 18:59
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;
Carsten
Life's a piece of shit
when you look at it!
- Monty Python -
  Mit Zitat antworten Zitat
Benutzerbild von dizzy
dizzy

Registriert seit: 26. Nov 2003
Ort: Lünen
1.932 Beiträge
 
Delphi 7 Enterprise
 
#26

Re: Tangeskurve

  Alt 15. Feb 2005, 18:59
Zitat von faux:
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 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
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel
  Mit Zitat antworten Zitat
Benutzerbild von Binärbaum
Binärbaum

Registriert seit: 19. Jan 2005
Ort: Elstra
764 Beiträge
 
Delphi 7 Enterprise
 
#27

Re: Tangeskurve

  Alt 15. Feb 2005, 19:01
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
There are exactly 10 kinds of people: those who understand binary, and those who don't.
---
"Software reift beim Kunden. Bei Hardware ist es anders: Hardware fault beim Kunden." - Rainer G. Spallek
  Mit Zitat antworten Zitat
Benutzerbild von faux
faux

Registriert seit: 18. Apr 2004
Ort: Linz
2.044 Beiträge
 
Turbo Delphi für Win32
 
#28

Re: Tangeskurve

  Alt 15. Feb 2005, 19:04
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.
Faux Manuel
Wer weiß, dass er nichts weiß, weiß mehr, als der der nicht weiß, dass er nichts weiß.
GoTrillian
  Mit Zitat antworten Zitat
Benutzerbild von Binärbaum
Binärbaum

Registriert seit: 19. Jan 2005
Ort: Elstra
764 Beiträge
 
Delphi 7 Enterprise
 
#29

Re: Tangeskurve

  Alt 15. Feb 2005, 20:36
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
There are exactly 10 kinds of people: those who understand binary, and those who don't.
---
"Software reift beim Kunden. Bei Hardware ist es anders: Hardware fault beim Kunden." - Rainer G. Spallek
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 3     123   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:53 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz