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 ! :mrgreen: )

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 ??? :freak: )

... 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.

Code: Alles auswählen

Debug 3<6
Debug 2.1<2.0

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 :wink:

@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 !