Maße aus Dreieck

  • VB.NET

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

    Maße aus Dreieck

    Hi ^^

    Ich habe da einen Code gefunden, mit dem man die "B"-Seite eines Dreiecks mit der Maus bewegen kann. Das sieht alles schon sehr schön aus, doch schöner wäre es, wenn man die Maße der Winkel ALPHA, BETA und GAMMA sowie der Seiten a, b und c irgendwie anzeigen könnte. Folgender Code:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Drawing
    2. Public Class MainForm
    3. Private ReadOnly m_A As New PointF(100, 500)
    4. Private m_B As New PointF(700, 100)
    5. Private ReadOnly m_C As New PointF(700, 500)
    6. Private Sub MoveCorner(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove
    7. m_B = e.Location
    8. Invalidate()
    9. End Sub
    10. Private Sub PaintForm(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
    11. Dim points() As PointF = {m_A, m_B, m_C}
    12. e.Graphics.FillPolygon(Brushes.Green, points)
    13. e.Graphics.DrawPolygon(Pens.Blue, points)
    14. e.Graphics.DrawString("A", Font, Brushes.Black, m_A)
    15. e.Graphics.DrawString("B", Font, Brushes.Black, m_B)
    16. e.Graphics.DrawString("C", Font, Brushes.Black, m_C)
    17. e.Graphics.DrawString("a", Font, Brushes.Black, MidPoint(m_B, m_C))
    18. e.Graphics.DrawString("b", Font, Brushes.Black, MidPoint(m_A, m_C))
    19. e.Graphics.DrawString("c", Font, Brushes.Black, MidPoint(m_A, m_B))
    20. End Sub
    21. Private Shared Function MidPoint(ByVal a As PointF, ByVal b As PointF) As PointF
    22. Return New PointF(0.5! * (a.X + b.X), 0.5! * (a.Y + b.Y))
    23. End Function
    24. End Class


    Gibt es da irgendwie die Möglichkeit die Maße abzurufen?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Michael K.“ ()

    Du hast Start- und Endkoordinaten aller Punkte?

    Dann kannst du die Seiten als Vektoren darstellen. Und wenn du das kannst, kannst du auch deren Länge berechnen (Phytagoras / "Normalisieren").
    Und wenn du in einem Dreieck die drei Seitenlängen kennst, kannst du auch die Winkel errechnen (Cosinussatz + Winkelsumme)
    »There's no need to "teach" atheism. It's the natural result of education without indoctrination.« — Ricky Gervais
    Ja diese Trigosätze kenne ich alle. Ich wollte eigentlich nur wissen, wie man denn nun die Maße der SEITEN abrufen kann. Hab vorher nicht darüber nachgedacht, dass man die Winkel in JEDEM Dreieck auch errechnen kann ^^

    Ich rufe die Seiten jetzt so ab (gesamter Code im Startpost): b.Text = m_C.X - m_A.X. Hoffentlich ist das richtig :S
    Du hast Punkt A und Punkt B:

    Der AB-Vektor bewegt sich in X-Richtung B.X - A.X LE und in Y-Richtung B.Y - A.Y.
    Diese beiden Werte musst du nun einzeln quadrieren, dann addieren, und dann die Wurzel ziehen um die Länge zu ermitteln:

    VB.NET-Quellcode

    1. Dim length As Double = Math.Sqrt( (B.X - A.X)^2 + (B.Y - A.Y)^2 )


    Btw: Du darfst eine Differenz (Integer / Double o.Ä.) nicht einem String zuweisen. Das ist nicht Strict On ^^
    »There's no need to "teach" atheism. It's the natural result of education without indoctrination.« — Ricky Gervais
    Ich stehe da vor einem neuen Problem: Ich möchte gerne, dass man irgendeine Seite angibt und diese dann automatisch gekürzt wird. Die Schwierigkeit bei dem ganzen ist herauszufinden, wie viel man bei X und Y zurechnen muss, damit die angegebene Länge erreicht wird "C{x=14/y=16} - Seite a soll um 4 gekürzt werden. Auf welcher Koordinate liegt der Punkt C jetzt" <- So eine Aufgabe ungefähr. :S
    Bilder
    • Bild.png

      4,76 kB, 273×233, 150 mal angesehen

    Michael K. schrieb:

    wie viel man bei X und Y zurechnen muss


    Deine Denkweise ist ungünstig. Denk nicht in x oder y, Denk in Vektoren!

    Die Problemstellung "Seite a soll um 4 gekürzt werden" ergibt keine eindeutige Lösung.
    Es fehlt eine Nebenbedingung wie "beide Eckpunkte werden um den gleichen Vektor/Abstand verschoben".

    Deine Problem ist, wie ich bereits sagte erst einmal rein mathematischer Natur. In diesem Forum bist du hier eigentlich falsch. Dein Problem ist nicht die Programmierung sondern die Mathematik.

    Da du offensichtlich keine Ahnung von dieser Geometrie (auf Mittelstufenniveau) hast, sieht es so aus, als ob du hier nach Code bettelst. Dabei hast du noch nicht mal eine korrekte Fragestellung formuliert.
    Hallo Michael K.,

    Wie schon erwähnt muss du ein wenig umdenken.
    Vektoren sind wichtige Konstrukte in der Mathematik. Vektoren kannst du beliebig verängern/verkürzen und an andere Vektoren anhängen.
    Wie kommst du auf die Winkel? Da gibt's ein paar Möglichkeiten:
    • Cosinussatz(Wenn stur mit Längen gerechnet wird)
    • Skalarprodukt(Wenn du dich den Vektoren öffnest)


    Grüsse

    Higlav
    Wo hast du genau das Problem?
    1. Punkt B und Punkt C holen
    2. Vektor bilden(aus Delta B, C)
    3. Vektorlänge um 4cm kürzen(X, Y und Z im Verhältnis zu 4cm kürzen)
    4. Neuen Punkt C von der Spitze des Vektor lesen
    5. Fettich!

    Grüsse

    Higlav

    Edit: Ich hab's mal versucht:

    VB.NET-Quellcode

    1. Public Structure Point3D
    2. Public Sub New(XValue#, YValue#, ZValue#)
    3. XVal = XValue
    4. YVal = YValue
    5. ZVal = ZValue
    6. End Sub
    7. Private XVal#, YVal#, ZVal#
    8. Public Property X#
    9. Get
    10. Return XVal
    11. End Get
    12. Set(value#)
    13. XVal = value
    14. End Set
    15. End Property
    16. Public Property Y#
    17. Get
    18. Return YVal
    19. End Get
    20. Set(value#)
    21. YVal = value
    22. End Set
    23. End Property
    24. Public Property Z#
    25. Get
    26. Return ZVal
    27. End Get
    28. Set(value#)
    29. ZVal = value
    30. End Set
    31. End Property
    32. Public Shared Operator +(A As Point3D, B As Point3D) As Point3D
    33. Return New Point3D(A.X + B.Y, A.Y + B.Y, A.Z + B.Z)
    34. End Operator
    35. Public Shared Operator -(A As Point3D, B As Point3D) As Point3D
    36. Return New Point3D(A.X - B.Y, A.Y - B.Y, A.Z - B.Z)
    37. End Operator
    38. Public Shared Operator =(A As Point3D, B As Point3D) As Boolean
    39. Return A.X = B.X And A.Y = B.Y And A.Z = B.Z
    40. End Operator
    41. Public Shared Operator <>(A As Point3D, B As Point3D) As Boolean
    42. Return Not A = B
    43. End Operator
    44. Public Overrides Function ToString() As String
    45. Return "{" & String.Format("{0}, {1}, {2}", X, Y, Z) & "}"
    46. End Function
    47. End Structure
    48. Public Structure Vector3D
    49. Public Sub New(FromPoint As Point3D, ToPoint As Point3D)
    50. APoint = FromPoint
    51. BPoint = ToPoint
    52. End Sub
    53. Private APoint As Point3D
    54. Private BPoint As Point3D
    55. Public Property A As Point3D
    56. Get
    57. Return APoint
    58. End Get
    59. Set(value As Point3D)
    60. APoint += value
    61. BPoint += value
    62. End Set
    63. End Property
    64. Public Property B As Point3D
    65. Get
    66. Return BPoint
    67. End Get
    68. Set(value As Point3D)
    69. BPoint += value
    70. End Set
    71. End Property
    72. Public Property X#
    73. Get
    74. Return B.X - A.X
    75. End Get
    76. Set(value#)
    77. BPoint.X = A.X + value
    78. End Set
    79. End Property
    80. Public Property Y#
    81. Get
    82. Return B.Y - A.Y
    83. End Get
    84. Set(value#)
    85. BPoint.Y = A.Y + value
    86. End Set
    87. End Property
    88. Public Property Z#
    89. Get
    90. Return B.Z - A.Z
    91. End Get
    92. Set(value#)
    93. BPoint.Z = A.Z + value
    94. End Set
    95. End Property
    96. Public Property Value#
    97. Get
    98. Return Math.Sqrt(X ^ 2 + Y ^ 2 + Z ^ 2)
    99. End Get
    100. Set(value#)
    101. Dim v = value / Me.Value
    102. X *= v
    103. Y *= v
    104. Z *= v
    105. End Set
    106. End Property
    107. ''' <summary>
    108. ''' Gibt die Quersumme der multiplizierten Koordinatenwerte zurück.
    109. ''' </summary>
    110. Public Shared Operator *(A As Vector3D, B As Vector3D) As Double
    111. Return A.X * B.X + A.Y * B.Y + A.Z * B.Z
    112. End Operator
    113. ''' <summary>
    114. ''' Bildet das Skalarprodukt
    115. ''' </summary>
    116. Public Shared Operator And(A As Vector3D, B As Vector3D) As Double
    117. Return (A * B) / (A.Value * B.Value)
    118. End Operator
    119. End Structure
    120. Public Module SolveMichaelsProblem
    121. Sub Main()
    122. Dim A As New Point3D(1, 1, 1)
    123. Dim B As New Point3D(8, 2, 4)
    124. Dim C As New Point3D(4, 3, 12)
    125. Dim VBC As New Vector3D(B, C)
    126. VBC.Value -= 4
    127. C = VBC.B
    128. Console.WriteLine("Neuer Punkt C: {0}", C.ToString)
    129. Dim VBA As New Vector3D(B, A)
    130. Dim Beta = Math.Acos(VBC And VBA)
    131. Console.WriteLine("Betawinkel: {0}rad", Beta)
    132. Dim VAC As New Vector3D(A, C)
    133. Dim Delta = Math.Acos(VBC And VAC)
    134. Console.WriteLine("Deltawinkel: {0}rad", Delta)
    135. Console.WriteLine("Alphawinkel: {0}rad", Math.PI - Beta - Delta)
    136. End Sub
    137. End Module

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

    Michael K. schrieb:

    Oh man, ich weiß jetzt echt nicht weiter
    Hast Du es mal mit Lineal und Zirkel probieert, dass Du eine Vorstellung bekommst, wie es funktionieren könnte?
    Löse solch Aufgaben zuerst auf dem Papier, dann hast Du Klarheit im Kopf.
    Danach gieße sie in Code. :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!
    OT: @RodFromGermany: Ich hoffe, du nimmst es mir nicht übel, wenn ich dich in meiner Signatur zitiere? Sollte kein Geschleime sein, aber dieser Satz hätte auch von mir sein können und er gefällt mir so gut. :D
    Ja ich hab ja schon alles auf Papier ^^
    Ich bin nur durch die ganze Vektorensache nichts durchgestiegen.
    Vielen Dank @Higlav:. Ich bin den Code intesivst durchgegangen und verstehe jetzt auch wie man auf die neue Koordinate kommt. Da ist allerdings ein kleines Problem mit dem runden oder so. Ich gebe in die Textbox jetzt eine Zahl (a = 0,72). Das Programm rechnet dann die Koordinate für den Punkt C aus und alle Seiten (a,b,c) werden neu berechnet. Für a habe ich ja 0,72 eingegeben. Nachdem er alles ausgerechnet hat steht aber 0,719999936954698 in der Textbox. Dabei sollte da ja ganz genau 0,72 stehen. Kann man den Fehler beheben?
    Ja, das passiert bei Verwendung von Fliesskommazahlen gelegentlich. Um dem entgegenzuwirken runde die Zahlen oder mache Gebrauch vom Datentyp Decimal. Der Code wird dann minimst langsamer laufen.
    Naja ich finde runden ist nicht so eine ganz gute Idee. Ich finde es irgendwie nicht benutzerfreundlich, wenn man 0,72 eingibt und dann auf einmal 0,719999936954698 da steht :D
    Und macht der Datentyp Decimal überhaupt einen Unterschied zu Double und Single?

    Michael K. schrieb:

    und dann auf einmal 0,719999936954698 da steht

    Das vermeidest du indem du bei der .ToString() Methode die richtige Überladung verwendest, welche ein FORMAT entgegen nimmt.

    Dann kannst du z.B. die Nachkommastellen oder noch besser die gültigen Stellen festlegen.
    @markus.obi:: Da kann man auswählen wie viele Nachkommastellen man haben möchte? Was ist da der Unterschied zu Math.Round?

    Ich hab da ein weiteres Problem: Wenn man eine Zahl hat (Ergebnis von b² + c² - a²/2bc) und den Winkel davon haben möchte dann muss man das doch mit Acos machen. Bei mir kommt aber kein Winkel sondern irgendeine Dezimalzahl heraus 8|