# Abstand zweier Winkel berechnen



## Senator42 (10 August 2012)

Da nun das eine Problem gelöst ist, kommt doch schon das nächste.

Folgende Funktion stellt fest ob ein Winkel  +90 oder -90 Grad vom ersten nicht überschreitet.
Die Frage ist: geht das einfacher? (mit sin,cos..)
Die Winkel sind 0.0 .. 360.0 Grad. Jede Kombination möglich.

*Vorzugsweise* möchte ich wissen ob der Abstand weniger als (Grenzwert: 0..180) ist.
Ob links oder rechts ist dabei egal.

In diesen Code ist der Grenzwert: 90.0 Grad.


```
in    WinkelAlt    INT            
in    WunkelJetzt    INT            
out    isOK    BOOL

      L     #WinkelAlt
      L     L#90
      -D    
      T     #x1

      L     #WinkelAlt
      L     L#90
      +D    
      T     #x2

      L     #x1
      L     L#0
      >=D                               // 0...360
      SPB   Ue0

      L     #WinkelAlt
      L     L#90
      -D    
      L     L#360
      +D    
      T     #x1
      SPA   ck2

Ue0:  L     #x2
      L     L#360
      <=D   
      SPB   ck                          // bis 360

      L     #WinkelAlt
      L     L#90
      +D    
      L     L#360
      -D    
      T     #x2

      L     #WinkelAlt
      L     L#90
      -D    
      T     #x1

ck2:  O(    
      L     #WunkelJetzt
      L     #x1
      >=D   
      )     
      O(    
      L     #WunkelJetzt
      L     #x2
      <=D   
      )     
      =     #isOK
      BEA   

ck:   U(    
      L     #WunkelJetzt
      L     #x1
      >=D   
      )     
      U(    
      L     #WunkelJetzt
      L     #x2
      <=D   
      )     
      =     #isOK
      BE
```

BTW: der Wetterochs.de hat mal eine Formel gepostet mit der ein Abstand zweier Punkte auf einer Kugel berechnet wird.  EIN SUPER SUPER MONSTER an cos sin quadrat wurzel hoch 3 ......
4 Zeilen Lang !


----------



## Senator42 (10 August 2012)

*Lösung zum Probelm*

es scheint dieses funktioniert:

' abs( { [ abs(a - b) + 180  ] % 360 }  - 180 )


----------



## Onkel Dagobert (10 August 2012)

Hallo Senator,

was verstehst du denn unter "Abstand zweier Winkel"? Du willst das Winkelmaß in "Grad" als Ergebnis? Und dabei das kleinere Ergebnis der beiden möglichen Lösungen?

Gruß, Onkel


----------



## Senator42 (10 August 2012)

Onkel Dagobert schrieb:


> Hallo Senator,
> 
> was verstehst du denn unter "Abstand zweier Winkel"? Du willst das Winkelmaß in "Grad" als Ergebnis? Und dabei das kleinere Ergebnis der beiden möglichen Lösungen?
> 
> Gruß, Onkel


na da selbe wie:
x1 = 10; x2 = 30;  abstand = ABS( x1 - x2 );

Aber mit Winkel !

Bsp 1.
eine Welle steht bei 45 Grad; x1 = 45;
dann bei 120 Grad; X2 = 120;
also ist sie 120 - 45 = 75 Grad wo anders.

Bsp 2.
eine Welle steht bei 350 Grad; x1 = 350;
dann bei 220 Grad; X2 = 220;
also ist sie 350 - 220 = 130 Grad wo anders.

Bsp 3.
eine Welle steht bei 350 Grad; x1 = 350;
dann bei 20 Grad; X2 = 20;
also ist sie *f(350;20)* = 30 Grad wo anders.

Differenz der beiden Winkel; die (bei mir) 0..360 sein können


----------



## hucki (10 August 2012)

```
[FONT=courier new]FUNCTION "Winkelabstand" : VOID
[/FONT][FONT=courier new]TITLE =[/FONT]
[FONT=courier new]VERSION : 0.1[/FONT]

[FONT=courier new]VAR_INPUT[/FONT]
[FONT=courier new]  WinkelAlt : INT ;           [/FONT]//0-360°
[FONT=courier new]  WinkelJetzt : INT ;         [/FONT]//0-360°
[FONT=courier new]  Grenzwert : INT ;           [/FONT]//0-180°
[FONT=courier new]END_VAR[/FONT]
[FONT=courier new]
VAR_OUTPUT[/FONT]
[FONT=courier new]  Abstand : INT ;             [/FONT]//0-180°
[FONT=courier new]  IsOK : BOOL ;    [/FONT]
[FONT=courier new]END_VAR[/FONT]
[FONT=courier new]
[/FONT]
[FONT=courier new]BEGIN[/FONT]

[FONT=courier new]NETWORK[/FONT]
[FONT=courier new]TITLE =Winkelabstand[/FONT]
[FONT=courier new]       L     #WinkelAlt; [/FONT]
[FONT=courier new]       L     #WinkelJetzt; [/FONT]
[FONT=courier new]       <I    ;[/FONT][FONT=courier new]                //Größerer Winkel in Akku1?[/FONT]
[FONT=courier new]       SPBNB _001; [/FONT]
[FONT=courier new]       TAK   ;                //[/FONT][FONT=courier new]Größer[/FONT][FONT=courier new]en Winkel in Akku1[/FONT]
[FONT=courier new]_001:  -I    ;                //Differenz[/FONT]
[FONT=courier new]       L     180; [/FONT]
[FONT=courier new]       TAK   ;                //Differenz zurück in Akku1[/FONT]
[FONT=courier new]       <I    ;                //wenn Differenz größer als 180, dann[/FONT]
[FONT=courier new]       SPBNB _002; [/FONT]
[FONT=courier new]       L     360; [/FONT]
[FONT=courier new]       TAK   ; [/FONT]
[FONT=courier new]       -I    ;                //Differenz von 360 abziehen[/FONT]
[FONT=courier new]_002:  T     #Abstand;        //Ergebnis speichern[/FONT]
[FONT=courier new]       L     #Grenzwert; [/FONT]
[FONT=courier new]       <=I   ;                //Innerhalb Grenzwert?[/FONT]
[FONT=courier new]       =     #IsOK; [/FONT]

[FONT=courier new]END_FUNCTION[/FONT]
```


----------



## Onkel Dagobert (10 August 2012)

Aha, dann habe ich es trotz deiner Vorlagen doch richtig gedeutet.
Dann berechne doch einfach die absolute Differenz, wie du es schon tust. Wenn diese Differenz >180 ist, dann subtrahiere das Ergebnis von 360. Ein Kreis ist immer rund und hat 360°  .


```
y := ABS(a-b)
if y > 180 then
   y := 360 - y
end_if
```


----------



## Onkel Dagobert (11 August 2012)

Senator42 schrieb:


> ..Bsp 3.
> eine Welle steht bei 350 Grad; x1 = 350;
> dann bei 20 Grad; X2 = 20;
> also ist sie *f(350;20)* = 30 Grad wo anders.
> ...



Schätze, ich lag wohl doch nicht richtig. Du suchst die Winkeländerung über der Zeit bzw. über der Drehbewegung!?


----------



## hucki (11 August 2012)

Onkel Dagobert schrieb:


> Schätze, ich lag wohl doch nicht richtig. Du suchst die Winkeländerung über der Zeit bzw. über der Drehbewegung!?


Ich denke doch. Ich hab' das auch so verstanden, dass die beiden Punkte auf dem Kreis nicht mehr als 90° auseinander liegen dürfen. Dem entsprechen zumindest alle Beispiele und wir haben ja auch beide das gleiche Ergebnis. Nur einmal in AWL und einmal in SCL.


----------



## Onkel Dagobert (11 August 2012)

Senator42 schrieb:


> ..Differenz der beiden Winkel; die (bei mir) 0..360 sein können



Die Frage zu formulieren ist in diesem Fall wahrscheinlich schwieriger als eine Lösung zu finden.
Falls also die Differenz zwischen neuer und alter Position gesucht ist, dann vielleicht so:


```
y := b-a      // b: neue Position, a: alte Position
if b<a then            // oder if y<0
  y := y + 360
end_if
```


----------



## hucki (11 August 2012)

Senator42 schrieb:


> ...
> Bsp 2.
> eine Welle steht bei 350 Grad; x1 = 350;
> dann bei 220 Grad; X2 = 220;
> ...


@dagobert,
ich denke immer noch, dass Deine erste Lösung die Richtige ist.
Die Welle hat sich im zitierten Bsp. zwar um 230° bewegt, aber die Winkeldifferenz zur alten Position sind (-)130°.
Und da das Plus oder Minus ihn nicht interessiert, ist m.M.n. Deine erste Formel die gesuchte Lösung:


Onkel Dagobert schrieb:


> ...
> 
> ```
> [FONT=courier new]y := ABS(a-b)
> ...


----------



## Onkel Dagobert (11 August 2012)

Hallo hucki,

ich bin durch diese Aussage stutzig geworden.


Senator42 schrieb:


> ..Differenz der beiden Winkel; die (bei mir) 0..360 sein können



Naja, egal. Senatoren muß man erst einmal verstehen lernen  .


Gruß, Onkel


----------



## hucki (11 August 2012)

Die Winkel können 0-360° sein.
Bei der Differenz hätte es geheißen: die ... 0-360° sein kann.

Aber am Besten kann das wohl der Senator beantworten.


----------



## Senator42 (15 August 2012)

Hallo Alle,

#5  ist genau das gesuchte.
besonders

```
T     #Abstand;        //Ergebnis speichern
```

ist gut, denn ich brauche 2 Grenzen.

Die Maschine soll Stahlwellen (4mm x 65mm) geraderichten indem auf der höchsten Stelle mit einem Stempel gedrückt wird.
Danach ist die Welle
a) immer noch so oder etwas weniger verbogen
b) seitlich verbogen
c) nach unten überbogen
Daher die Differenz der Winkel von, vor dem Richten und danach:
a ist also Abstand<70 Grad
b ist Abstand<120 Grad
c >=120
Eine Verbiegung geht bis zu 200µm (krummere gehen nicht durch die Maschine).
Gerade wird mit 0..30µm definiert.

Ach, und die Moleküle von Stahl verhalten sich nicht immer reproduzierbar :-(
Abhandlungen im Web gehen von Druck als Führungsgrüße ab zu festen Positionen.
Die sog. Streckgrenzen nach gewissen Newtons bringen gar nichts. (Moleküle haben Eigenleben). 

Vielen Dank an alle.


----------



## hucki (15 August 2012)

Senator42 schrieb:


> ... denn ich brauche 2 Grenzen.


So?


```
[FONT=courier new]FUNCTION "Winkelabstand" : VOID
TITLE =
VERSION : 0.2

VAR_INPUT
  WinkelAlt : INT ;          //0-360°
  WinkelJetzt : INT ;        //0-360°
  Grenzwert_Min : INT ;      //0-180°
  Grenzwert_Max : INT ;      //0-180°
END_VAR

VAR_OUTPUT
  Differenz : INT ;          //0-180°
  IsOK : BOOL ;    
END_VAR


BEGIN

NETWORK
TITLE =Winkeldifferenz
      L     #WinkelAlt; 
      L     #WinkelJetzt; 
      <I    ;                //Größerer Winkel in Akku1?
      SPBN  _001; 
      TAK   ;                //Größeren Winkel in Akku1
_001: -I    ;                //Differenz
      L     180; 
      TAK   ;                //Differenz zurück in Akku1
      <I    ;                //wenn größer als 180, dann
      SPBN  _002; 
      L     360; 
      TAK   ; 
      -I    ;                //Differenz von 360 abziehen
_002: T     #Differenz;      //Differenz ausgeben
      L     #Grenzwert_Min; 
      TAK   ; 
      <=I   ;                //Min erreicht?
      U(    ; 
      L     #Grenzwert_Max; 
      <=I   ;                //Max nicht überschritten?
      )     ; 
      =     #IsOK; 

END_FUNCTION[/FONT]
```


----------



## Senator42 (15 August 2012)

danke für die Mühe. Ich hab mich also unklar ausgedrückt.

*habe die 
*
*  #Differenz*
*
bereits benutzt, nämlich so:*
L #Differenz
L 120
>=i
spb Tue das wenn Abstand über 120 (bis 180) // mehr als 180 gibt es nicht

L #Differenz
L 70
>=i
spb Tue das wenn Abstand ab 70 ist
spa Tue das wenn  Abstand bis 70 ist

Ich habe 3 verschiedene Fälle zu beachten.


----------



## Larry Laffer (16 August 2012)

Hallo,

nur mal so am Rande :  Es gibt hier auch noch die Möglichkeit, den Befehl MOD einzusetzen.

```
meinWinkel := (akt_Winkel + maxWinkel) mod maxWinkel
```
ergibt einen Winkel im Bereich 0.. maxWinkel ... (ohne Sprünge etc.)

Gruß
Larry


----------

