Formel(n) gesucht für grafische Darstellung einer Diskette

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von oobdoo.

    Formel(n) gesucht für grafische Darstellung einer Diskette

    Ich suche Formel(n) für eine grafische Darstellung einer Diskette.



    Ich wollte in meinem Projekt eine Floppydisk grafisch darstellen, scheiter aber am Erstellen der Formeln. :(
    Mit Versuch und Irrtum würde ich es wohl nach vielen Tagen hinbekommen, würde mir aber gerne die dafür
    benötigte Zeit dafür ersparen.

    Hat jemand sowas schonmal gemacht und kann mir dabei weiterhelfen?
    Aktuelles Projekt: Z80 Disassembler für Schneider/Amstrad CPC :love:
    @oobdoo Sieh mal bei Graphics nach unter DrawPie() und FillPie() nach:
    docs.microsoft.com/de-de/dotne…?view=dotnet-plat-ext-3.1
    docs.microsoft.com/de-de/dotne…?view=dotnet-plat-ext-3.1
    Ansonsten malst Du von außen nach innen Kreise und Radien.
    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!
    Danke, das mit dem DrawPie war der richtige Hinweis. Der Befehl war mir unbekannt, obwohl er in meinen VB Buch drin steht.
    Ich verbinde mit Pi eher die Kreiszahl oder einen Raspi. :)

    Beim blättern zur richtigen Seite um 100 Seiten vertan und folgendes gefunden. :whistling:

    VB.NET-Quellcode

    1. Dim blackPen As Pen = New Pen(Color.Black, 3)
    2. Dim x0 As Single = piboDisk.ClientSize.Width / 2.0F
    3. Dim y0 As Single = piboDisk.ClientSize.Height / 2.0F
    4. Dim i As Single
    5. g.DrawLine(blackPen, 0, 0, x0 * 2, y0 * 2)
    6. g.DrawLine(blackPen, 0, x0 * 2, y0 * 2, 0)
    7. For i = 0.1 To 1 Step 0.05
    8. g.DrawEllipse(blackPen, x0 - i * x0, y0 - i * y0, 2 * i * x0, 2 * i * y0)
    9. Next




    Manchmal sieht man den Wald vor lauter Bäumen nicht.
    Aktuelles Projekt: Z80 Disassembler für Schneider/Amstrad CPC :love:

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

    oobdoo schrieb:

    Ich verbinde mit Pi eher die Kreiszahl oder einen Raspi.
    Pie ist ein Tortenstück.
    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!
    Englisch gehört noch weniger zu meinen Stärken als Mathe. ;)



    So sieht mein gemalte Diskette aus.

    VB.NET-Quellcode

    1. Dim g As Graphics = piboDisk.CreateGraphics
    2. Dim mybrush As Brush = New SolidBrush(Color.White)
    3. Dim x0 As Single = piboDisk.ClientSize.Width / 2.0F
    4. Dim y0 As Single = piboDisk.ClientSize.Height / 2.0F
    5. Dim blackPen As Pen = New Pen(Color.Black, 1)
    6. Dim whitepen As Pen = New Pen(Color.White, 1)
    7. Dim rect As RectangleF
    8. Dim startAngle As Single = 0.0F
    9. Dim sweepAngle As Single = 360 / 40
    10. Dim ii As Single
    11. Dim i As Single
    12. Dim pos As Single = 0
    13. Dim counter As Integer = 0
    14. For ii = 1 To 10
    15. rect = New RectangleF(x0 - 100 - (pos \ 2), y0 - 100 - (pos \ 2), 200 + pos, 200 + pos)
    16. For i = 1 To 360 Step sweepAngle
    17. g.DrawPie(blackPen, rect, i, sweepAngle)
    18. counter += 1
    19. Next
    20. pos += 30
    21. Next
    22. counter -= 40 ' nur zur überprüfung der sichtbaren sektoren
    23. g.FillEllipse(mybrush, x0 - 198 \ 2, y0 - 198 \ 2, 198, 198)


    Nun würde ich gerne die einzelnen Sektoren bestimmen können, wenn ich mit der Maus über das Bild fahre.
    Außerdem würde ich gerne die Sektoren einzen auch mit einer bestimmten Farbe Ausfüllen können.

    Ich habe aber keine Idee wie ich da am besten vorgehen könnte.
    Aktuelles Projekt: Z80 Disassembler für Schneider/Amstrad CPC :love:
    Wird ja immer anspruchsvoller. Noch mehr Vorstellungen? Nicht, dass es noch viel komplizierter wird und Dir am Ende ne animierte 3D-Darstellung vorschwebt.
    Schau mal bleistiftsweise bei diesem stackoverflow-Thread rein, in dem CreatePath beschrieben wird.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Wäre es rechteckig dann würde ich es auch hin bekommen. Aber bei rund mit den ganzen Formeln, das übersteigt dann meine Möglichkeiten des Verstehens.
    Ebenso wie Dein Link.

    VB.NET-Quellcode

    1. Using p = New GraphicsPath()
    2. p.AddArc(outerRect, startAngle, arcLength)
    3. p.AddArc(innerRect, startAngle + arcLength, -arcLength)
    4. p.CloseFigure()
    5. g.FillPath(Brushes.Green, p)
    6. g.DrawPath(Pens.Black, p)
    7. End Using


    Mit dem GraphicsPath kann ich überhaupt nix anfangen.

    Nachtrag:
    Hab gerade ne Idee und Code aus einem anderen Forum. 8o
    Mit Glück bekomme ich dann das Füllen und mit der Maus rüberfahren gelöst.
    Aktuelles Projekt: Z80 Disassembler für Schneider/Amstrad CPC :love:

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „oobdoo“ ()

    CreatePath geht so: Es wird eine Figur beschrieben, deren Einzelteile miteinander automatisch verbunden werden. Der fertige Pfad kann danach gezeichnet werden.
    1. Du ergänzt zum leeren Pfad nen Bogen, und zwar den größeren außen.
    2. Du ergänzt nen 2. Bogen, den kleineren innen.
    3. Das Ende vom 1. Bogen wird automatisch mit dem Anfang vom 2. Bogen verbunden.
    4. Mit CloseFigure wird das Ende des letzten Teils (also hier des 2. Bogens) mit dem Anfang des 1. verbunden.
    5. Dann das ganze gefüllt zeichnen lassen (FillPath) -> Dein Segment
    6. Dann das ganze als Linien zeichnen (DrawPath) -> der Rand
    AddArc will eigentlich das Gleiche wie DrawPie: ein Außenmaßrechteck, in dem sich der Bogen bewegen soll, Startwinkel, Winkel-"Weite"
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Ich hatte zeitgleich auf im Forum64 nach einer Lösung gefragt. Der User EgonOlsen71 hatte mir dann diesen Source gegeben und mir auch erlaubt ihn hier zu veröffentlichen.

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Form1_Shown(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Shown
    3. Dim innerRadius = 30
    4. Dim circleCount = 6
    5. Dim circleDistance = 10
    6. Dim xCenter = 160
    7. Dim yCenter = 100
    8. Dim sectionCount = 24
    9. Dim angle, x1, x2, y1, y2, endRadius, radius As Single
    10. Dim graphics As Graphics = Me.CreateGraphics
    11. Dim pen As Pen
    12. pen = New Pen(Brushes.Black, 1)
    13. ' Kreise zeichnen
    14. For i = 0 To circleCount
    15. radius = innerRadius + i * circleDistance
    16. graphics.DrawEllipse(pen, xCenter - radius, yCenter - radius, 2 * radius, 2 * radius)
    17. Next
    18. ' Linien zur Unterteilung
    19. For a = 0 To 359 Step 360 / sectionCount
    20. angle = (a / 360) * 2 * Math.PI
    21. x1 = Math.Sin(angle) * innerRadius
    22. y1 = Math.Cos(angle) * innerRadius
    23. endRadius = (innerRadius + circleDistance * circleCount)
    24. x2 = Math.Sin(angle) * endRadius
    25. y2 = Math.Cos(angle) * endRadius
    26. graphics.DrawLine(pen, x1 + xCenter, y1 + yCenter, x2 + xCenter, y2 + yCenter)
    27. Next
    28. ' Gefüllte Flächen als Beispiel
    29. For p = 0 To 24 Step 6
    30. For i = 0 To 5
    31. fill(i + p, i, sectionCount, circleDistance, xCenter, yCenter, innerRadius, graphics, pen)
    32. Next
    33. Next
    34. End Sub
    35. Private Sub fill(ByVal section As Integer, ByVal circle As Integer, ByVal sectionCount As Integer, ByVal circleDistance As Integer, ByVal x As Single, ByVal y As Single, ByVal innerRadius As Single, ByVal graphics As Graphics, ByVal pen As Pen)
    36. Dim startAngle, endAngle, x1, y1, x2, y2, angle, tmp As Single
    37. startAngle = (360 / sectionCount) * section
    38. endAngle = (360 / sectionCount) * (section + 1)
    39. For a = startAngle To endAngle Step 0.5
    40. angle = (a / 360) * 2 * Math.PI
    41. tmp = circle * circleDistance + innerRadius
    42. x1 = Math.Sin(angle) * tmp
    43. y1 = Math.Cos(angle) * tmp
    44. tmp = tmp + circleDistance
    45. x2 = Math.Sin(angle) * tmp
    46. y2 = Math.Cos(angle) * tmp
    47. graphics.DrawLine(pen, x1 + x, y1 + y, x2 + x, y2 + y)
    48. Next
    49. End Sub
    50. End Class


    Sein Ergebnis sieht dann so aus.



    Meine Abwandlung um mit der Maus später die einzelnen Sektoren zu identifizieren schaut aktuell so aus.


    Dort hat jeder Sektor seine eigene Farbe. Beim Erstellen dieser Grafik will ich mir ein Array anlegen worin die
    Farbdaten + Sektorinformationen gespeichert sind. Diese Grafik liegt dann unsichtbar im Hintergrund und
    wird für das Ermitteln einer Farbe unter dem Mauszeiger benötigt. Aufgrund der angelegten Tabelle sollte ich
    dann die genauen Sektordaten zur Mausposition ermitteln können. Das wird die Aufgabe von heute Abend/Nacht
    sein. :)
    Aktuelles Projekt: Z80 Disassembler für Schneider/Amstrad CPC :love:
    Es scheint als habe sich dort ein Bug eingeschlichen. Zeile 35 fill(i + p, i, sectionCount, circleDistance, xCenter, yCenter, innerRadius, graphics, pen)
    Das i+p ist der Fehler, es darf an der Stelle nur ein p stehen. Warum ist das wichtig wenn doch grafisch alles in Ordnung scheint?

    Ich verwende die Grafik um bei einem MausMove immer den dazugehörenden Sektor und Track zu ermitteln. Dazu werden die Farbdaten + Sektor + Track in ein Array geschrieben.
    Kenne ich die Farbe un ter der Maus, dann habe ich auch den passenden Sektor/Track dazu. Das klappte aber nicht wenn in Zeile 35 i+p steht.
    Damit entsteht dann auch eine andere Grafik.

    Aktuelles Projekt: Z80 Disassembler für Schneider/Amstrad CPC :love: