Grafikfeld verschieben

  • VB.NET

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von vb-checker.

    Grafikfeld verschieben

    Hallo zusammen,

    ich hab ein kleines Problemchen.
    Und zwar sollen wir von der Uni aus ein Prgramm entwickeln, welches die Brechung eines Lichtstrahles an einer Linse graphisch darstellt.
    Wir haben die Programmierung der Grafik in unserer Gruppe halbwegs hinbekommen, jedoch sitzt sie nich an der Gewünschten stelle.
    Im Anhang hab ich 2 Bilder hochgeladen.
    Wir möchten die Grafik im rot markiertem Bereich des ersten Bildes haben. Ich habe zu Hause etwas rumprobiert doch ich bekomme das nicht wirklich hin.
    Wenn ich das mache sieht das immer so aus wie im zweiten Bild.
    Kann mir vllt jemand sagen oder einen tipp geben wie ich das verändern kann?

    Hier der Quellcode:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim rlinks As Integer
    3. Dim rrechts As Integer
    4. Dim llinks As Integer
    5. Dim lrechts As Integer
    6. Dim redPen As Pen = New Pen(Color.Red, 2)
    7. Dim eintrittshöhe As Integer
    8. Dim eintrittswinkel As Integer
    9. Dim eintrittsx As Integer
    10. Dim starty As Integer
    11. Dim blackpen As Pen = New Pen(Color.Black, 2)
    12. Dim blackthin As Pen = New Pen(Color.Black, 1)
    13. Dim greenpen As Pen = New Pen(Color.Green, 2)
    14. Dim clearall As Pen = New Pen(Color.White, 2000)
    15. Dim graythin As Pen = New Pen(Color.Gray, 1)
    16. Dim alphalinks As Integer
    17. Dim alpharechts As Integer
    18. Dim h As Integer
    19. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    20. rlinks = TextBox1.Text
    21. rrechts = TextBox2.Text
    22. h = TextBox5.Text
    23. eintrittshöhe = TextBox3.Text
    24. eintrittswinkel = TextBox4.Text
    25. eintrittsx = (300 + lrechts) - Math.Sqrt(rrechts ^ 2 - eintrittshöhe ^ 2)
    26. starty = 300 - eintrittshöhe - Math.Tan(eintrittswinkel * Math.PI / 180) * (eintrittsx - 50)
    27. Me.CreateGraphics.DrawLine(clearall, 0, 0, 1000, 1000)
    28. Me.CreateGraphics.DrawLine(blackpen, 50, 300, 550, 300)
    29. Me.CreateGraphics.DrawLine(graythin, 300, 290, 300, 310)
    30. Me.CreateGraphics.DrawLine(graythin, 50, 300 - eintrittshöhe, 550, 300 - eintrittshöhe)
    31. Me.CreateGraphics.DrawLine(graythin, 60, 300 - eintrittshöhe, 60, 300)
    32. Me.CreateGraphics.DrawArc(graythin, 170, 300 - eintrittshöhe - CInt((eintrittsx - 50) / 2), eintrittsx - 50, eintrittsx - 50, 180, eintrittswinkel)
    33. Me.CreateGraphics.DrawString("h", SystemFonts.DefaultFont, Brushes.Black, 40, 300 - (eintrittshöhe / 2))
    34. Me.CreateGraphics.DrawString("alpha", SystemFonts.DefaultFont, Brushes.Black, 180, 300 - eintrittshöhe - ((300 - eintrittshöhe - starty) / 8))
    35. If rrechts > 0 Then
    36. If rlinks > 0 Then
    37. llinks = Math.Sqrt((rlinks * rlinks) - (h * h))
    38. lrechts = Math.Sqrt((rrechts * rrechts) - (h * h))
    39. alphalinks = (Math.Asin(h / rlinks)) * 180 / Math.PI
    40. alpharechts = (Math.Asin(h / rrechts)) * 180 / Math.PI
    41. Me.CreateGraphics.DrawArc(greenpen, 300 - (rlinks + llinks), 300 - rlinks, 2 * rlinks, 2 * rlinks, 360 - alphalinks, 2 * alphalinks)
    42. Me.CreateGraphics.DrawArc(greenpen, 300 - (rrechts - lrechts), 300 - rrechts, 2 * rrechts, 2 * rrechts, 180 - alpharechts, 2 * alpharechts)
    43. Me.CreateGraphics.DrawLine(redPen, 50, starty, eintrittsx, 300 - eintrittshöhe)
    44. End If
    45. If rlinks < 0 Then
    46. rlinks = Math.Abs(rlinks)
    47. llinks = Math.Sqrt((rlinks * rlinks) - (h * h))
    48. lrechts = Math.Sqrt((rrechts * rrechts) - (h * h))
    49. alphalinks = (Math.Asin(h / rlinks)) * 180 / Math.PI
    50. alpharechts = (Math.Asin(h / rrechts)) * 180 / Math.PI
    51. Me.CreateGraphics.DrawArc(greenpen, 300 - (rlinks - llinks), 300 - rlinks, 2 * rlinks, 2 * rlinks, 180 - alphalinks, 2 * alphalinks)
    52. Me.CreateGraphics.DrawArc(greenpen, 300 - (rrechts - lrechts), 300 - rrechts, 2 * rrechts, 2 * rrechts, 180 - alpharechts, 2 * alpharechts)
    53. Me.CreateGraphics.DrawLine(redPen, 50, starty, eintrittsx, 300 - eintrittshöhe)
    54. End If
    55. End If
    56. If rrechts < 0 Then
    57. If rlinks > 0 Then
    58. rrechts = Math.Abs(rrechts)
    59. llinks = Math.Sqrt((rlinks * rlinks) - (h * h))
    60. lrechts = Math.Sqrt((rrechts * rrechts) - (h * h))
    61. alphalinks = (Math.Asin(h / rlinks)) * 180 / Math.PI
    62. alpharechts = (Math.Asin(h / rrechts)) * 180 / Math.PI
    63. Me.CreateGraphics.DrawArc(greenpen, 300 - (rlinks + llinks), 300 - rlinks, 2 * rlinks, 2 * rlinks, 360 - alphalinks, 2 * alphalinks)
    64. Me.CreateGraphics.DrawArc(greenpen, 300 - (rrechts + lrechts), 300 - rrechts, 2 * rrechts, 2 * rrechts, 360 - alpharechts, 2 * alpharechts)
    65. End If
    66. End If
    67. End Sub
    68. End Class


    Dazu müsste ich noch sagen, das ich nicht unbedingt viel ahnung vom programmieren habe.
    Die ganze grafik hat ein Kollege von mir aus unserer Gruppe programmiert, ich soll jetzt nur das Grafik mit dem Layout verbinden.

    Wär schön wenn mir jemand helfen könnte.
    Bilder
    • VB 1.png

      256,34 kB, 1.600×900, 191 mal angesehen
    • VB 2.png

      256,43 kB, 1.600×900, 188 mal angesehen
    1. Option strict On und alle Folgefehler beseitigen.
    2. nur 1x Graphics creieren:

    VB.NET-Quellcode

    1. Dim g As Graphics = Me.CreateGraphics
    2. g.DrawLine(clearall, 0, 0, 1000, 1000)
    3. ' ...
    3. füge überall zu den x- und y-Koordinaten einen gemeinsamen Offset hinzu:

    VB.NET-Quellcode

    1. Dim xOffset As Integer = 0
    2. Dim yOffset As Integer = 20
    3. g.DrawLine(clearall, 0, 0, 1000 + xOffset, 1000 + yOffset)
    4. ' usw.
    Diesen Offset richtest Du so ein, wie Du es haben willst.
    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!
    statt auf die Form zu zeichnen, könntest du in ein Panel zeichnen. Dieses kannst du dort plazieren, wo die Grafik hin soll. Dann musst du nur noch im Code auf das Panel statt auf die Form zeichnen (praktisch alle "Me" durch "panel1" ersetzen.

    Skybird schrieb:

    Das sind ja Ubisoftmethoden hier !