![]() |
IF-Anweisung
Hi Leute,
wie schafft man es mit der IF-Anweisung die folgenden vier Bereiche zu unterscheiden? Es handelt sich quasi um den Einheitskreis und Cosinus. 1.Quadrant: Winkel*10 von 0 bis 900 2.Quadrant: Winkel*10 von 901 bis 1800 3.Quadrant: Winkel*10 von 1801 bis 2700 4.Quadrant: Winkel*10 von 2701 bis 3600 Winkel ist als double deklariert, da ich ihn vorher aus einem maskedit in 1/10° schritten einlesen will. Hier meine Idee, aber...
Code:
Fehlermeldung:
If cos(winkel*10)>0 and cos(winkel*10)<900 then
Begin quadrant:= 1; vorzeichen:= 1; end; If cos(winkel*10)>900 and cos(winkel*10)<1800 then Begin quadrant:= 2; vorzeichen:= -1; end; If cos(winkel*10)>1800 and cos(winkel*10)<2700 then Begin quadrant:= 3; vorzeichen:= -1; end; If cos(winkel*10)>2700 and cos(winkel*10)<3600 then Begin quadrant:= 4; vorzeichen:= 1; end; Error: Operation "and" not supported for types "Double" and "Double". Die Fehlermeldung ist mir klar, aber ich muss ja den Winkel in 1/10° Schritten einlesen können (z.B. Winkel= 120,1°) Ich weiß nicht wie ich mein obiges Problem mit der If-Anweisung lösen kann. Vielleicht hat der ein oder andere eine sinnvolle Idee oder einen Tipp. Gruß Slash |
AW: IF-Anweisung
Hallo,
dir fehlen Klammern:
Delphi-Quellcode:
.
If (cos(winkel*10)>0) and (cos(winkel*10)<900) then
Du solltest aber
Delphi-Quellcode:
vor den If-Anweisungen einmal rechnen, den Wert in einer Variablen abspeichern und nur die Variable prüfen, ohne ständig das gleiche wieder und wieder zu rechnen
cos(winkel*10)
[Edit] Wen muss man bestechen um eine funktionierende Delphi-Tag-Ausrichtung zu erhalten? |
AW: IF-Anweisung
Danke!
Du hast vollkommen recht! Die Klammern...oh man ^^ Hat sich erledigt! |
AW: IF-Anweisung
so ;)
Delphi-Quellcode:
Was soll eigentlich passieren, wenn lCosWinkel die Werte 0/3600, 900, 1800, 2700 hat?
var
lCosWinkel : Double; lCosWinkel := cos( winkel * 10 ); If ( lCosWinkel > 0 ) and ( lCosWinkel < 900 ) then Begin quadrant:= 1; vorzeichen:= 1; end; If ( lCosWinkel > 900 ) and ( lCosWinkel < 1800 ) then Begin quadrant:= 2; vorzeichen:= -1; end; If ( lCosWinkel > 1800 ) and ( lCosWinkel < 2700 ) then Begin quadrant:= 3; vorzeichen:= -1; end; If ( lCosWinkel > 2700 ) and ( lCosWinkel < 3600 ) then Begin quadrant:= 4; vorzeichen:= 1; end; Mit deiner Routine sind die dann im Nirwana, oder schlimmstenfalls haben die noch den alten Wert von quadrant, Vorzeichen Zitat:
Bei einem Kreis ist 0°=360° und nach deiner Vorgabe würde das im Quadrant 1 und 4 liegen. Und so ein Winkel im Bereich 900 < Winkel < 901 ??? |
AW: IF-Anweisung
So sollte das jetzt passen oder?
Code:
Und ein Winkel im Bereich 900 < winkel 901 wirds nicht geben. Es werden ja nur 1/10° Schritte eingelesen.
If (cos(winkel*10)>=0) and (cos(winkel*10)=<900) then
Begin quadrant:= 1; end; If (cos(winkel*10)>900) and (cos(winkel*10)<=1800) then Begin quadrant:= 2; end; If (cos(winkel*10)>1800) and (cos(winkel*10)<=2700) then Begin quadrant:= 3; end; If (cos(winkel*10)>2700) and (cos(winkel*10)<=3600) then Begin quadrant:= 4; end; Also wären nur möglich 90° oder 90,1°. |
AW: IF-Anweisung
Ähhhmmm ... also der Code wird so nicht funktionieren. Keiner der Codes.
Erstmal erwartet die Cos-Funktion einen Winkel in rad, ich lese hier mal raus dass der Winkel in deg eingegeben wird. Zum Anderen ist das Ergebnis des Cosinus eine Zahl zwischen -1 und 1. Eine Abfrage wie
Delphi-Quellcode:
ist also relativ sinnlos.
If (cos(winkel*10)>2700) and (cos(winkel*10)<3600) then
Wenn der Quadrant und das Vorzeichen des Cosinus ermittelt werden sollen, wäre meine Lösung wie folgt:
Delphi-Quellcode:
uses
Math var Winkel: Integer; // In Zehntelgrad, d.h. 904 = 90,4° begin Quadrant = Winkel div 900 + 1; Vorzeichen = Sign(cos(DegToRad(Winkel/10))); end; |
AW: IF-Anweisung
Zitat:
Code:
also wohl eher
904 mod 4 + 1 = 1 (90,4°)
905 mod 4 + 1 = 2 (90,5°) 906 mod 4 + 1 = 3 (90,6°)
Code:
Winkel div 900 + 1
|
AW: IF-Anweisung
Zitat:
|
AW: IF-Anweisung
Zitat:
Der Winkel wird in Deg eingegeben, dann aber in Rad umgewandelt(Ist hier in dem Ausschnitt nicht angegeben und nicht erkennbar, das stimmt). Ja, Cosinus wandert zwischen 1 und -1, korrekt. Das Problem warum ich das mit IF THEN mache,ist, wir müssen das damit machen. ;-) Klar gibts noch bessere Methoden, wie du sie auch hier vorgestellt hast. |
AW: IF-Anweisung
Also wenn man solche Bereiche einteilen will, ohne dass man etwas vergisst, dann ist folgendes Vorgehen ratsam:
Delphi-Quellcode:
function Group( const Value : Extended ) : Integer;
begin // man kann die oberen und unteren Grenzen im Vorfeld behandeln if ( Value < 0 ) or ( Value >= 360 ) then begin // alternativ eine Exception werfen lassen raise Exception.CreateFmt( 'Wert %f ungültig. (0° <= Wert < 360°)', [ Value ] ); // oder einfach einen Result zurückgeben, bei dem man weiß, da stimmt was nicht Result := -1; Exit; end; // oder wie hier beim Winkel kann man ja auch diesen umrechnen while ( Value < 0 ) do Value := Value + 360; while ( Value >= 360 ) do Value := Value - 360; // *** ab hier geht der Vergleich los *** // obere Grenze abfangen if ( Value >= 360 ) then Result := -1 else if ( Value >= 270 ) then Result := 4 // 270 <= Value < 360 else if ( Value >= 180 ) then Result := 3 // 180 <= Value < 270 else if ( Value >= 90 ) then Result := 2 // 90 <= Value < 180 else if ( Value >= 0 ) then Result := 1 // 0 <= Value < 90 // untere Grenze abfangen else Result := -1; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:31 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