Seite 2 von 5
Verfasst: 11.11.2004 18:56
von Robert Wünsche
ich benutze andere nur in extremen ausnamefällen !
(der text ist urheberrechtlich geschützt, also dürft ihr ihn mir nicht nachtragen !

)
Verfasst: 11.11.2004 18:59
von MLK
Kaeru Gaman hat geschrieben:... aber geht auch einfacher:
stimmt!
Code: Alles auswählen
Procedure angle_is_close ( angle1.l, angle2.l, range.l )
If angle1+angel2 >= 0 And angle1 <= 360 And angle2 <= 360
Diff = Int(Abs(angle1-angle2))
ProcedureReturn (Diff < range)
Else
ProcedureReturn -1
EndIf
EndProcedure
Verfasst: 11.11.2004 18:59
von Kaeru Gaman
...und als kleine zugabe :
Code: Alles auswählen
;**********************************************************
Procedure get_rotate_angle ( start_angle.l, end_angle.l )
Result.l
If start_angle >= 0 And start_angle <= 360 And end_angle >= 0 And end_angle <= 360
sign.l
Diff.l
Diff = end_angle-start_angle ; die Winkel-differenz
sign = 1
If Diff < 0 : Diff = -Diff : sign = -sign : EndIf
If Diff > 180 : Diff = 360-Diff :sign =-sign: EndIf
; den längeren weg genommen ? dann jetzt den kürzeren...
Result = sign*Diff
Else
Result = 0
EndIf
ProcedureReturn Result
EndProcedure
;**********************************************************
;testwerte hier einsetzen
a = 335
b = 25
d = get_rotate_angle( a, b )
out$ = "start_angle = " + Str(a) + Chr(10)
out$ + "end_angle = " + Str(b) + Chr(10)
out$ + "to rotate = " + Str(d)
MessageRequester("get_rotate_angle Testrun", out$ , 0)
...diese proc gibt null aus, wenn einer der beiden winkel <0 oder >360 ist,
oder wenn beide winkel gleich sind...
sonst den zu drehenden winkel...
Verfasst: 11.11.2004 19:02
von Kaeru Gaman
@MLK:
ich habe PB 3.30... wenn ich mich recht entsinne, ging abs() nur mit floats (oder wars nich mit floats ???

)
... und die boole'schen ausdrücke funzen nich richtig...
sonst hätte ichs auch in eine zeile gepackt...
@Sunny
wollte dich ja auch nich vorführen....
... und wie du siehst, hat MLK noch einen draufgesetzt...
Verfasst: 11.11.2004 19:05
von MLK
abs() liefert ne float zurück, int() macht sie dann wieder ganz. und boolsche ausdrücke gehen scheinbar nur mit floats nicht.
Verfasst: 11.11.2004 19:07
von Kaeru Gaman
...neee...
hab eben gerade die koordinatenbegrenzung ausprobiert:
x + stp + 832*(x<-32) - 832*(x>800)
x ist als long definiert... funzt nich... oder hab ich mich da verproggt ?
Verfasst: 11.11.2004 19:11
von Ynnus
MLK hat geschrieben:Kaeru Gaman hat geschrieben:... aber geht auch einfacher:
stimmt!
Code: Alles auswählen
Procedure angle_is_close ( angle1.l, angle2.l, range.l )
If angle1+angel2 >= 0 And angle1 <= 360 And angle2 <= 360
Diff = Int(Abs(angle1-angle2))
ProcedureReturn (Diff < range)
Else
ProcedureReturn -1
EndIf
EndProcedure
Bin ich jetzt zu blöd um das System zu verstehen, oder wie soll das Funktionieren?
Code: Alles auswählen
Procedure angle_is_close ( angle1.l, angle2.l, range.l )
If angle1+angel2 >= 0 And angle1 <= 360 And angle2 <= 360
Diff = Int(Abs(angle1-angle2))
ProcedureReturn (Diff < range)
Else
ProcedureReturn -1
EndIf
EndProcedure
Debug angle_is_close(300, 291, 2)
Debug angle_is_close(300, 303, 2)
Debug angle_is_close(300, 301, 2)
Ich erhalte alle 3 Mal den Wert 2 zurück, was soll ich denn bitte damit anfangen? Bei den ersten beiden Beispielen ist der Abstand größer, somit müsste das Ergebnis doch 0 oder -1 oder sowas sein. Beim 3ten Debugg ist es in der Reichweite, dennoch ist der Rückgabewert 2. Wie soll ich nun diese 2 von den anderen beiden unterscheiden?
Mir gibt deine Prozedur nur immer den Range-Wert zurück, was soll ich denn damit anfangen?
Verfasst: 11.11.2004 19:14
von Kaeru Gaman
HA!
sage ich doch... boole'sche ausdrücke funzen nich richtig....
.... erst testen, dann posten
@MLK schönes beispiel... mit konstanten funzt es ja auch... nur nich mit variablen
@Sunny:
normalerweise sollte ein ausdruck in klammern seinen true/false wert liefern: boole'sche ausdrücke..
(5=5) = true = 1
(5=6) = false = 0
Verfasst: 11.11.2004 19:16
von MLK
tatsache.. das geht nur solange ohne variablen gearbeitet wird:
Code: Alles auswählen
x=5
y=4
Debug 23*(x<4)
Debug 23*(x>4)
Debug 23*(5<4)
Debug 23*(5>4)
Debug 23*(x<y)
Debug 23*(x>y)
Debug 23*(5<y)
Debug 23*(5>y)
und der hier sollte aber gehen:
Code: Alles auswählen
Procedure angle_is_close ( angle1.l, angle2.l, range.l )
If angle1>= 0 And angle2 >= 0 And angle1 <= 360 And angle2 <= 360
Diff = Int(Abs(angle1-angle2))
If Diff <= range
ProcedureReturn 1
EndIf
Else
ProcedureReturn -1
EndIf
EndProcedure
Verfasst: 11.11.2004 19:20
von Kaeru Gaman
... und damit ist es praktisch nutzlos....
... sagt jemand fred bescheid ?
fred ? bescheid !