Berechnung Winkel in gleichschenkligem Dreieck

  • VB.NET
  • .NET (FX) 3.0–3.5

Es gibt 27 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Mal in die einzelnen Bestandteile zerlegt:

    - Winkelbestimmung :(Math.Atan2(y - center.X, x - center.Y) * 180.0 / Math.PI) - baseAngle
    - Obere Sperre: Math.Min(360.0F - blockAngle / 2,
    - Untere Sperre: Math.Max(blockAngle / 2,
    - Damit das Ergebnis in [0, 360°) liegt: + 720.0F) Mod 360.0F))
    Die Winkelbestimmung sollte klar sein, der Atan2 gibt den Winkel zwischen center und dem Punkt bzgl. 0° an. Anschließend wird auf den Basiswinkel rotiert, der die Seite des Blocks angibt. Danach wird von dort aus mit oberer und unterer Schranke verhindert, dass ungültige Werte angenommen werden.
    Die obere Sperre gibt eben an, dass der Winkel nicht größer wird, als durch den Block zulässig. Die untere Sperre macht selbiges. baseAngle bildet die Mitte des Blocks, d.h. der Block liegt im Intervall (baseAngle - blockAngle / 2, baseAngle + blockAngle / 2).

    Der letzte Punkt ist optional. Die 720.0F werden aufaddiert, damit das Ergebnis zwangsweise positiv ist. Sowohl das Ergebnis von Atan2, als auch baseAngle können negativ sein. Würde man es genau nehmen, müsste man baseAngle Mod 360 statt baseAngle schreiben, aber ich gehe davon aus, dass der Winkel in [-359.9...9°, 359.9...9°] liegt.

    Viele Grüße
    ~blaze~
    Vielen Dank! Ich Schau mir das noch genauer an, versuche dann die Value-Berechnung, und melde mich erneut!
    Danke euch beiden, und besonderen Danke für die Erklärungen!

    Lg.
    Mfg: Gather
    Private Nachrichten bezüglich VB-Fragen werden Ignoriert!


    Vielen Dank! Es hat alles geklappt und langsam blicke ich auch durch die Mathematik dahinter durch.
    Grundsätzlich fehlte dann nurnoch eine einfache Value-Berechnung:

    VB.NET-Quellcode

    1. _Value = CInt((_Maximum - _Minimum) * percentage) + _Minimum

    Beziehungsweise zum Umkehren in der Value Eigenschaft: percentage = CSng((_Value - _Minimum) / (_Maximum - _Minimum))

    Es funktioniert nun tadellos, danke nochmals für die tolle Hilfe!
    Bilder
    • screen.PNG

      4,1 kB, 322×299, 83 mal angesehen
    Mfg: Gather
    Private Nachrichten bezüglich VB-Fragen werden Ignoriert!


    Gather schrieb:

    percentage = CSng((_Value - _Minimum) / (_Maximum - _Minimum))
    Da hast Du aber glück, dass das in VB geschrieben ist. In C# würde das falsch rechnen, denn die Division ist in VB eine Double-Division, in C# eine Integer-Division.
    Ich hab das Gefühl, dass Du mit dem (gedanklichen) Auflösen des Einzeilers von @~blaze~ nicht ganz klar kommst, deswegen hab ich das alles mal vereinzelt, das entspricht auch eher meinem Stil.
    Zum Debuggen ist ein Multi-Zeiler auch besser, da kannst Du alles mit dem Taschenrechner nachrechnen.
    Wie sich das auf die Performance auswirkt, hab ich nicht getestet.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Es wirkt sich nicht sonderlich aus. Allerdings ist es bei so einfacher Mathematik auch nicht so schlimm, das in einer Zeile zu lösen. Es ist halt dann etwas unzugänglicher, wenn man nicht weiß, wie der Algorithmus arbeitet.

    Es ist übrigens keine Integerdivision; es wird ja ein Single geteilt.

    Viele Grüße
    ~blaze~

    ~blaze~ schrieb:

    keine Integerdivision
    OK, das kann ich jetzt nicht nachvollziehen, da ich die Deklaration von _Maximum und _Minimum nicht fand, da hab ich mal ein Integer gedacht.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    ~blaze~ schrieb:

    sondern auf den gesamten Bruch
    Jou. Das sind dann die Fehler, die sich in nem Einzeiler schwer finden lassen. :D
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!