Abstand zweier Winkel berechnen

Senator42

Level-1
Beiträge
927
Reaktionspunkte
80
Zuviel Werbung?
-> Hier kostenlos registrieren
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.

Code:
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 !
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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
 
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
 
Code:
[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]
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
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° :ROFLMAO: .

Code:
y := ABS(a-b)
if y > 180 then
   y := 360 - y
end_if
 
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.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
..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:

Code:
y := b-a      // b: neue Position, a: alte Position
if b<a then            // oder if y<0
  y := y + 360
end_if
 
...
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.
...
@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:
...
Code:
[FONT=courier new]y := ABS(a-b)
if y > 180 then
   y := 360 - y
end_if[/FONT]
 
Hallo Alle,

#5 ist genau das gesuchte.
besonders
Code:
 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.
 
... denn ich brauche 2 Grenzen.
So?
Code:
[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]
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
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.
 
Hallo,

nur mal so am Rande : Es gibt hier auch noch die Möglichkeit, den Befehl MOD einzusetzen.
Code:
meinWinkel := (akt_Winkel + maxWinkel) mod maxWinkel
ergibt einen Winkel im Bereich 0.. maxWinkel ... (ohne Sprünge etc.)

Gruß
Larry
 
Zurück
Oben