Winkel in VB berechnen

  • VB.NET

Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von Annonator.

    Winkel in VB berechnen

    Hallo Community,

    ich hab mal wieder ein Problem wo mir meine Mathe sowie Google-Such fähigkeiten nicht mehr weiterhelfen.
    Wäre nett wenn ihr mir sagen könnt wie ich den Winkel zwischen P1 und P2 berechnen kann.

    Hier mal ein Bild zur verdeutlichung:

    P1 ist ein fester Punkt
    P2 kann sich überall in der grauen Umrahmten fläche befinden

    Wie kiann ich jetzt mit nur diesen zwei Daten den Winkel berechnen??

    Gruß Eistee
    de.wikipedia.org/wiki/Lineare_Funktion

    das interessiert dich dabei:
    upload.wikimedia.org/math/8/8/…b7f245b9d19670ba54175.png
    Fehler für 90 Grad musste noch abfangen...

    und VB rechnet im Bogenmaß also um in Grad umzurechnen einfach * 180 / PI
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Ich hatte da schonma eine Klasse "Koordinaten" hier hochgeladen.
    Kuckma, ob das hier für dich interessant wäre.
    Das ist eine Klasse zur Umrechnung von Polar- in Karthesische Koordinaten und zurück. Da sind sicher n par kleine Anpassungen nötig, aber die eigentliche Berechnung kannst du sicher nutzen. ;)
    :thumbsup: Seit 26.Mai 2012 Oppa! :thumbsup:
    gefällt dir meine Lösung nicht?^^

    Polarkoordinaten sind da nicht unbedingt so genau, da man erst den Radius berechnen muss... und durch viele Rechnungen wirds ungenau :P jedoch muss das Abfangen des 90° Winkels dabei nicht gemacht werden(aber dafür 4 Abfragen)

    suchs dir raus...aber eigentlich könnte man sich das auch selbst machen:de.wikipedia.org/wiki/Polarkoordinaten
    die vier Abfragen sieht man hier:
    upload.wikimedia.org/math/1/e/…a6b2f138795729dc762ae.png
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    das bedeutet Delta also Differenz (Differenz zwischen x/y also x2 - x1 und y2-y1)...
    Irgentwie komisch das denn doppelt in der Funktion steht..

    Ich habe mir das jetzt mal angesehen und hoffe ich liege richtig
    wäre ja mal ein erfolg wenn ich es "verstehen" würde..

    Winkel = (f(x2) - f(x1)) / (x2 - x1)

    f von x2 bekomme ich so herraus:


    hier ersetze ich das x durch x2(der x wert von Punkt2) dasgleiche für f von x1 nur mit dem x wert von Punkt 1

    Ist das so richtig??

    _____________________________________

    @Vatter
    Habe mir das Projekt dazu angesehen und ich muss sagen das es irgentwie noch komplizierter
    aussieht als das was ich hier grade versuche zu verstehen :S
    du benötigst f von x gar nicht...

    hier umgestellt für VB:
    y1 und x1 sind die Koordinaten des ersten Punktes...
    y2 und x2 sind die Koordinaten des zweiten Punktes...

    VB.NET-Quellcode

    1. Dim Winkel As Single = Math.Atan((y2-y1)/(x2-x1)) * 180 / Math.PI
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---

    Eistee schrieb:

    Habe mir das Projekt dazu angesehen und ich muss sagen das es irgentwie noch komplizierter
    aussieht

    Nu ja, da hab ich auch die Umrechnung in beiden Richtungen drin. Also Umrechnung einer Strecke mit bekannten Endkoordinaten in Winkel und Distanz und zurück. Ich hab das für son PingPong genutzt. Zuerst hatte ich da mit ganzahligen Point()-Variablen gerechnet. Aber da waren bei Bewegungen von 2 Pixeln je Timer.Tick nur eine begrenzte Anzahl Winkel drin. Also hab ich die Koordinaten im Hintergrund als Single gespeichert und bei der Anzeige gerundet. Damit hat sich mein Bällchen schön in alle Richtungen bewegt und das mit konstanter Geschwindigkeit. Konnt ja sein,dass es dir hilft. 8-)
    :thumbsup: Seit 26.Mai 2012 Oppa! :thumbsup:

    Einen Winkel zwischen 2 Punkten gibt es nicht meines Wissens :)

    warum ist da oben wohl so ein schönes Bildchen?^^

    P.S.: Die Sicherheitsabfrage der vielfachen von 90 ° fehlt noch...d.h. du musst überprüfen ob X1 = X2(wenn dann noch überprüfen ob Y1 < Y2 oder umgekehrt und entsprechend den Winkel zurückgeben und dann noch für Y1 = Y2...;)
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---

    jvbsl schrieb:

    Arcustangens die Umkehrfunktion des tangens...

    Das kann ja nicht sein:

    VB.NET-Quellcode

    1. alpha = Math.Atan(Math.Tan(45))
    2. MessageBox.Show("Atan von Tan von 45 = " & alpha)

    Komisch das da nicht 45 sondern 1,01770 steht

    Ich weiß das müsste 45 sein, aber irgendwas stimmt das nicht 8|

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Nibel“ ()

    hehe wie bereits gesagt, VB rechnet im Bogenmaß, also folgendermaßen:

    VB.NET-Quellcode

    1. alpha = Math.Atan(Math.Tan(45/180*Math.PI))*180 /Math.PI

    somit sollte alpha wieder 45 sein ;)
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Auch wenn das hier schon ein bisschen her ist, möchte ich trotzdem noch meine Lösung präsentieren, ich hab grad so was ähnliches gemacht und bin durch Zufall auf diesen Threat gestoßen:

    VB.NET-Quellcode

    1. Private Sub Panel1_MouseMove(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Panel1.MouseMove
    2. 'Definieren der Punkte
    3. Dim Mittelpunkt As Point = New Point(Panel1.Width / 2, Panel1.Height / 2)
    4. Dim Fixpunkt As Point = New Point(Panel1.Width / 2, 0)
    5. Dim Mausposition As Point = e.Location
    6. 'Definieren der Längen
    7. Dim AMiFi As Double = Panel1.Height / 2
    8. Dim AMiMa As Double = Math.Sqrt(Math.Pow(Mausposition.X - Mittelpunkt.X, 2) + Math.Pow(Mausposition.Y - Mittelpunkt.Y, 2))
    9. Dim AFiMA As Double = Math.Sqrt(Math.Pow(Mausposition.X - Fixpunkt.X, 2) + Math.Pow(Mausposition.Y, 2))
    10. 'Definieren des Winkels
    11. Dim CosAlpha As Double = (Math.Pow(AMiFi, 2) + Math.Pow(AMiMa, 2) - Math.Pow(AFiMA, 2)) / (2 * AMiFi * AMiMa)
    12. Dim AlphaBogen As Double = Math.Acos(CosAlpha)
    13. Dim Alpha As Double = (AlphaBogen * 180) / Math.PI
    14. If Mausposition.X < Panel1.Width / 2 Then
    15. Alpha = Alpha + (2 * (180 - Alpha))
    16. End If
    17. End Sub


    Ich definiere Punkte aus denen später ein Dreieck werden soll 1. Punkt ist der Mittelpunkt meines Panels der 2. Punkt ist bei mir der Mauszeiger und der 3. Punkt ist ein beliebiger Ort, er liegt auf der Linie von der später der Winkel gemessen wird, also bei mir ist 0 Grad, wenn man den Mauszeiger über dem Mittelpunkt positioniert in deiner Zeichnung erhält man 0 Grad wenn man den Mauszeiger rechts vom Mittelpunkt Positioniert. Den Winkel erechne ich durch den Kosinussatz: cosα = (b² + c² - a²) / (2bc). Die Seite a entspricht im Code der Variable AFiMA (A wie Abstand), b = AMiFi und c = AMiMa. Wobei b und c auch verwechselt werden können. In Zeile 13 wird aus dem Bogenmaß eine "richtige" Gradzahl. In Zeile 14 und 15 wird der Winkel für die 2. Hälfte angepasst, denn sonst würde dann statt 185 dort 175 stehen weil wieder zurückgezählt wird.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Annonator“ ()