Vom Bogenmass zum Winkel?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
steelbasic
Beiträge: 63
Registriert: 02.09.2004 19:41
Wohnort: Niedersachsen

Vom Bogenmass zum Winkel?

Beitrag von steelbasic »

Hallo,

ich möchte im rechtwinkeligen Dreieck den Winkel alpha berechnen.

sin alpha = Gegenkathete / Hypotenuse

0,5 = 68,5mm / 137mm

sin (invers) = 30 Grad


Benutze ich nun

Code: Alles auswählen

Winkel.f = ASin(SinusWinkel.f)
wird mir das Ergebnis als Bogenmaß 0,52... zurückgegeben.

Wie komme ich an den Winkel?[/code]
Viele Grüße
Hein Blöd
Benutzeravatar
Franky
Beiträge: 1132
Registriert: 29.08.2004 16:31
Wohnort: Münsterland
Kontaktdaten:

Beitrag von Franky »

och, ganz leicht.

Max Bogenmaß=2*Pi

Max Winkelmaß=360°

Da Bogenmaß proportional zum Winkelmaß:

Winkel.f=BogenWinkel*360/(2*Pi)

;)

Code: Alles auswählen

Procedure.f GibWinkel(x,y);Achtung, Vorzeichen beachten, wie unten gegeben
 laenge=Sqr(x*x+y*y)
 If Laenge<>0
 If x<0
   If y<0
    winkel.f=ASin(-y/laenge)*360/(2*#PI)
   Else 
     winkel.f=360+ASin(-y/laenge)*360/(2*#PI)                                
    EndIf
  Else 
      winkel.f=180-ASin(-y/laenge)*360/(2*#PI)                               
  EndIf
  ProcedureReturn winkel.f
 Else 
    ProcedureReturn 0
 EndIf 
EndProcedure


If OpenWindow(1,100,100,300,300,"Test")
        CreateGadgetList(WindowID(1))
               CreateImage(1,300,300)
               ImageGadget(1,0,0,300,300,ImageID(1))
               Repeat 
                    event=WaitWindowEvent()
                    If event=#WM_CLOSE
                           quit=1
                    ElseIf event=#WM_MOUSEMOVE
                        x=150-WindowMouseX(1)
                        y=WindowMouseY(1)-150
                            StartDrawing(ImageOutput(1))
                              Box(0,0,300,300)
                              FrontColor(RGB(255,0,0))
                              LineXY(150,150,150-x,150+y)
                              winkel.f=GibWinkel(x,y)
                              DrawText(0,0,StrF(winkel,2),RGB(255,0,0),RGB(0,0,0))
                           StopDrawing()
                           SetGadgetState(1,ImageID(1))
                    EndIf
               Until quit=1
EndIf
Was ich aber nicht ganz verstehe ist, warum es so kompliziert mit If-Abfragen gemacht werden muss, mathematisch geht es ja ohne
Zuletzt geändert von Franky am 27.12.2007 18:16, insgesamt 1-mal geändert.
Falsch zugeordnetes Zitat des Tages: "O'zapft is" - Edward Snowden :)
Benutzeravatar
Scarabol
Beiträge: 1427
Registriert: 30.11.2005 21:00

Beitrag von Scarabol »

Hi,

Code: Alles auswählen

; Gibt den Winkel in Grad zurück
Procedure.d Degree(Rad.d)
  ProcedureReturn Rad*180/#PI
EndProcedure

; Gibt den Winkel als Radiant zurück
Procedure.d Radiant(Deg.d)
  ProcedureReturn Deg*#PI/180
EndProcedure
Gruß
Scarabol
Abgeschlossen Projekte:
Schreibmaschine, Bildschirmlupe, Wings3DtoOgreMeshConverter
Watch: PureArea

PB-V: 4
WinXP
Benutzeravatar
steelbasic
Beiträge: 63
Registriert: 02.09.2004 19:41
Wohnort: Niedersachsen

Beitrag von steelbasic »

Funktioniert :allright:

Vielen Dank Euch beiden
Viele Grüße
Hein Blöd
Benutzeravatar
Scarabol
Beiträge: 1427
Registriert: 30.11.2005 21:00

Beitrag von Scarabol »

@Franky
OMG :shock: :shock: :shock:

Was hast du den da gemacht?
Kannst du mal bitte deine Änsätze und hintergründe näher erläutern und vor allem auch ma meinen Code anschauen...

Zu den If Abfragen:
PB rechnet falsch, mathematisch ist bei 3 Uhr ist mathematisch gesehen 0° und dann gegen den Uhrzeigersinn größer werdend - PB sieht das wohl anders...

Gruß
Scarabol
Zuletzt geändert von Scarabol am 27.12.2007 19:21, insgesamt 1-mal geändert.
Abgeschlossen Projekte:
Schreibmaschine, Bildschirmlupe, Wings3DtoOgreMeshConverter
Watch: PureArea

PB-V: 4
WinXP
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag von STARGÅTE »

ich macht sich das leben schwer ^^
anstatt mit TAN / ATAN zu arbeiten:

Code: Alles auswählen

Procedure.f Winkel(x.f,y.f)
 Winkel.f
 If x = 0
  If y <  0 : Winkel = -90 : EndIf 
  If y >= 0 : Winkel =  90 : EndIf 
 Else 
  Winkel = ATan(y/x)/(#PI/180) 
  If x < 0 : Winkel + 180 : EndIf 
 EndIf 
 ProcedureReturn Winkel
EndProcedure
aber steelbasic wollte ja eh nur n umrechner von daher ^^ reciht ja deins Scarabol
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Franky
Beiträge: 1132
Registriert: 29.08.2004 16:31
Wohnort: Münsterland
Kontaktdaten:

Beitrag von Franky »

@Scarabol:
Zuerstmal kann ich etwas vereinfachen, ich hattte, als es nicht direkt klappte etwas mit den Vorzeichen hantiert und dann is ein rest verblieben.
Es geht auch so:


Zuerst errechne ich über den Satz des Pythagoras die Hypothenuse

Code: Alles auswählen

 laenge=Sqr(x*x+y*y)
nu teste ich, ob die auch nich 0 is (weil sonst die Rechnung unten nicht klappen würde, da wird durch laenge dividiert)

Code: Alles auswählen

 If Laenge<>0
Da ASin nur Werte zwischen -#Pi/2 und #Pi/2 ausgeben kann, muss ich
zuerst schauen, ob wir uns in der linken (x<0) oder der rechten Hälfte (x>0) des kreises befinden. x entspricht einem vielfachen des Cosinus.

Code: Alles auswählen

 If x<0
Da wir auf der Rechten hälfte einen Sprung im System haben (358,359,0) ;), muss man hier noch prüfen, ob y größer oder kleiner ist.

Code: Alles auswählen

   If y>0
    winkel.f=ASin(y/laenge)*180/(#PI)
   Else 
     winkel.f=360+ASin(y/laenge)*180/(#PI)                                
    EndIf
Man könnte es auch zusammenschneidern als

Code: Alles auswählen

   winkel.f=360+Asin(y/laenge)*180/#Pi
   if winkel>360
         winkel=winkel-360
   endif 
Tja, ansonsten die Linke Seite abarbeiten, bei der man halt sagen muss, dass 180 genau im Mittelpunkt der ASin-Funktionswerte liegt und wenn allet schief läuft, ist der Winkel halt 0.

Code: Alles auswählen

  Else 
      winkel.f=180-ASin(y/laenge)*180/(#PI)                               
  EndIf
  ProcedureReturn winkel.f
 Else 
    ProcedureReturn 0
 EndIf 
EndProcedure
Und was die Formel an sich angeht:

Code: Alles auswählen

      winkel.f=ASin(y/laenge)*180/(#PI)                               
y/laenge entspricht dem Sinus des Dreiecks. und da der Einheitskreis nen umfang von 2*Pi hat bzw. ein Kreis allgemein 360° hat, die ASin-Funktion Bogenmaßwerte, sprich Werte des Einheitskreises ausgibt, erhält man den Winkel aus

Asin(Sinus)*360/2*#Pi. Und das lässt sich kürzen zu ASin(Sinus)*180/#Pi


Soweit alles verstanden? Gut, ich nämlich jetzt auch :mrgreen:
Falsch zugeordnetes Zitat des Tages: "O'zapft is" - Edward Snowden :)
Antworten