OOP-Problem bei Zeichenroutine

  • VB.NET

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

    OOP-Problem bei Zeichenroutine



    Ich habe vor Linien wie in dem Bild oben zu zeichnen - möglichst die, die mit "GUT" betitelt sind^^
    Soweit ich verstanden habe ist doch ein Grundsatz von Objektorientiertem Programmieren, dass die Objekte (in dem Fall eine Einzelne Linie)
    weiß, wo und wie sie sich zu zeichnen hat.
    Eine Linie hat Eigenschaften wie Dicke, Start- und Endpunkt, Farbe etc. Desshalb kann ich nicht alle auf einmal zeichen, da jede individuell ist
    und als eigenständiges Objekt behandelt wird... Das Große Problem ist meine Zeichenroutine (und ich kenne keine "bessere"): Erst wird eine
    dicke schwarze Linie gezeichnet, dann eine etwas dünnere gelbe - Die Linie wirkt "umrandet". Das ergebnis, wenn jede Linie sich selbst zeichnet
    ist das "SCHLECHTE". Zeichne ich erst alle schwarzen Linien und dann die Gelben wird es "GUT".

    der Gute zustand lässt sich also nur erreichen, wenn sich die Linie in zwei Phasen zeichnet - das ist aber extrem schlecht. Mein Lösungsansatz
    wäre eine bessere Zeichenroutine mittels GDI, die mit einem Arbeitsgang auskommt. Die Frage ist wie.. habt ihr Ideen???

    Alternativ müsste ich umdenken zu dem Ansatz mit den zwei Zeichenphasen. Eine übergeordnete Klasse müsste sich dann um das Zeichnen
    seiner Objekte kümmern. Dieser Ansatz Zerstört dann aber die ganzen Vorteile des OOP, und, da noch weitere Objekte (die sich GDI-Technich
    gottseidank in einem schritt zeichnen lassen) dazukommen, mein Plan mit eigenen Interfaces zu arbeiten..

    weiß jemand mit diesem Problem umzugehen?
    Die Lösung deines Problems wird wohl sein, dass du zuerst alle Linien und dann alle Füllungen zeichnest.
    Mit einem Arbeitsgang wirst du da eher nicht auskommen.
    Was du allerdings machen könntest, wäre, die Linien als extra Objekt zu behandeln und deiner Klasse eine Eigenschaft Depth gibst.
    Könnte so aussehen:

    VB.NET-Quellcode

    1. Class DrawableObject
    2. Private _Owner As Control
    3. Private Shared Index As Integer = 0
    4. Public Property Owner As Control
    5. Get
    6. Return _Owner
    7. End Get
    8. Set (ByVal value As Control)
    9. If value IsNot Nothing Then
    10. If _Owner IsNot Nothing Then
    11. RemoveHandler _Owner.Paint, AddressOf OnPaint
    12. End If
    13. _Owner = value
    14. AddHandler _Owner.Paint, AddressOf OnPaint
    15. End If
    16. End Set
    17. End Property
    18. Public Property Depth As Integer
    19. ' weitere Eigenschaften
    20. Public Sub New()
    21. Index += 1
    22. Depth = Index
    23. ' Konstruktor-Zeug
    24. End Sub
    25. Protected Overridable Sub OnPaint(ByVal sender As Object, ByVal e As PaintEventArgs)
    26. ' zeichnen
    27. End Sub
    28. End Class

    Das Ganze speicherst du dann in einer nach der Depth-Eigenschaft sortieren Liste, die in einem Durchgang nacheinander gezeichnet wird.
    Somit hätten deine ganzen Linien niedrige Depth-Werte und deine Füllungen Depth-Werte über denen der Linien.
    Schon mal danke für deine Lösung!
    Der Depth-Wert ist aber nicht nötig, da die zu zeichnenden Objekte sortiert vorliegen und auch nicht durcheinander kommen werden^^
    ist eben nur sehr ärgerlich, dass die Linien die einzigen Objekte sind, die aus dem ganzen system "rausfallen".. aber was will man tun xD
    Du könntest die Linien in ein GraphicsPath Objekt reinstecken und dann zuerst Ränder, und dann Füllungen. Das GraphicsPath Objekt dürfte etwas schneller sein als alles einzelne Linien.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils

    FreakJNS schrieb:

    der Gute zustand lässt sich also nur erreichen, wenn sich die Linie in zwei Phasen zeichnet - das ist aber extrem schlecht.

    Ich sehe da nicht so das Problem.

    Deine Zeichen-Objekte wissen sich also auf 2 Weisen zu zeichnen: einmal dick und schwarz, annermal bisserl dünner und gelb.
    Im Pain-Event rufst du erstmal DrawObject.PaintBlack() für alle auf, und danach DrawObject.PaintYellow()

    Oder du parametrisierst das Zeichnen, also dass beim Aufruf die Dicke angegeben wern kann.
    Pack alles Zeichnen in eine Routine mit dem Parameter, der schwarz-dick und gelb-dünn unterscheidet.
    Dann rufst Du diese Routine nacheinander 2x auf, einmal mit Parameter schwarz-dick, danach gelb-dünn.
    Das tut der OOP absolut keinen Abbruch.
    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!