Problem beim Zeichnen mehrerer Layer



  • @DocShoe sagte in Problem beim Zeichnen mehrerer Layer:

    Das geht mit meinem Ansatz:
    Vorgehen in Bildform: Tile
    <tile>
    <track>
    <segment start="NW" end="NE" layer="0"/> <!-- Segment 1: Weite Kurve Nordwesten -> Nordosten, liegt unten-->
    <segment start="NE" end="SW" layer="0"/> <!-- Segment 2: Gerade Nordosten -> Südwesten, liegt unten-->
    <segment start="NW" end="SE" layer="1"/> <!-- Segment 3: Gerade Nordwesten -> Südosten, liegt oben -->
    </track>
    </tile>

    Test Segment 1 mit Segment 2: gleicher Layer, nix zu tun
    Test Segment 1 mit Segment 3: unterschiedliche Layer, aber keine Kreuzung (obwohl sich die Strecken beim Startpunkt überlappen)
    Test Segment 2 mit Segment 3: unterschiedliche Layer, Kreuzung in der Mitte des Tiles, da sich Geraden nur in der Mitte kreuzen können -> Brücke über Segment 2 zeichnen, da Segment 3 drüber liegt
    Vermutlich stellen wir uns unter "Layer" unterschiedliche Dinge vor. Ich meine mit Layer die Z-Koordinate, das hat mit dem Zeichnen selbst nix mehr zu tun.

    Nein. So gibt es zwei Brücken und eine Kreuzung. Und bei mir gibts auch nur Geraden, keine Kurven. Das Beispiel, das ich gab hat 2 Kreuzungen und eine Brücke. Ganz allgemein kann dein Ansatz kein komplett zusammenhängendes Netz darstellen, was auch Brücken hat. Ein Segment das im Layer N+1 lieht geht mit einer Brücke über alle Segemte in Layer N, hängt also nicht mit diesen Segmenten zusammen -> Widerspruch. Liegen alle Segmente in Layer N, gibt es keine Brücke -> Widerspruch.



  • Vielleicht hab ich ein Detail unterschlagen, Tunnelblick und so...

    • Segmente gehen, mit wenigen Ausnahmen, von Seitenmitte zu Seitenmitte. Es gibt keine Strecken, die zB von einer Spitze des Sechsecks zu einer anderen Spitze gehen.
    • fast alle Tiles, mit wenigen Ausnahmen, setzen sich aus drei Segementtypen zusammen:
      1. eine Gerade verbindet eine Sechseckseitenmitte mit der gegenüber liegenden Seitenmitte
      2. eine enge Kurve verbindet eine Sechseckseitenmitte mit einer benachbarten Seitenmitte
      3. eine weite Kurve verbindet eine Sechseckseitemitte mit einer Seitenmitte im Abstand 2. Das kann theoretisch auch mit einer Geraden realisiert werden, wird´s aber nie.

    Alles, was damit nicht erschlagen werden kann, sind Exoten, die separat behandelt werden müssen.


  • Mod

    @DocShoe sagte in Problem beim Zeichnen mehrerer Layer:

    Alles, was damit nicht erschlagen werden kann, sind Exoten, die separat behandelt werden müssen.

    Wie machst du das? Und sollte das Ziel nicht sein, einen einfachen Regelsatz zu finden, der alle möglichen Fälle perfekt modelliert? Ist ja jetzt nicht so, dass letzteres besonders schwierig wäre. Du bist bloß zu versteift auf deinen bisherigen Ansatz, der das aber nicht leisten kann. TGGC hat mindestens zwei funktionierende, allumfassende Ansätze skizziert.



  • @DocShoe sagte in Problem beim Zeichnen mehrerer Layer:

    Test Segment 1 mit Segment 4: unterschiedliche Layer, aber keine Kreuzung

    Ah sehe ich das richtig: Verbunden heißt entweder gleiche Layer oder keine Kreuzung? Bin bisher davon ausgegangen, dass man in der gleichen layer sein muss.

    Auf Anhieb würde ich tatsächlich sagen, dass das passen könnte für die meisten Sachen, sofern es nicht noch komplexer wird (was aber nicht geplant ist, soweit ich das verstanden habe)



  • TGGC´s Lösung ist flexibler, ja, erfordert aber auch mehr Aufwand. So müsste ich ja für jede Brücke die Ausrichtung und Position explizit angeben. Einen seiner Vorschläge muss ich sowieso umsetzen, allerdings habe ich mir das etwas anderes vorgestellt. TGGC´s Vorschlag, die Segmente zu verkleinern werde ich so umsetzen, dass durch zwei weitere Parameter der Startoffset und die Länge der Strecke beeinflusst werden kann. Also zB so

    <tile>
       <track>
         <segment start="N" end="S" offset="0.25" length="0.5"/>
       </track>
    <tile>
    

    Der offset ist der Versatz vom Original-Startpunkt (in Streckenlänge, also hier ein Viertel). length ist die effektive Länge der Strecke, ebenfalls in Strecklänge (hier also die halbe original-Streckenlänge). Für Kurven entsprechend ähnlich für Startwinkel und Bogenlänge.

    PS:
    Die Sonderfälle kann ich damit dann auch erschlagen.


  • Mod

    Den Vorschlag mit den expliziten Brücken fand ich den schwächeren. Ich würde an deiner Stelle einfach Layerwechsel unterstützen. Dann entfällt die ganze Brückenproblematik komplett, da sie inhärent Teil der Struktur wird. Du hättest überhaupt gar keine expliziten Brücken mehr, sondern einfach Strecken die sich entweder kreuzen, oder ober- bzw. untereinander her führen. Das heißt, du würdest einfach deine Layer von unten nach oben zeichnen, brauchtest dabei überhaupt nichts zu beachten, und hättest automatisch das richtige Ergebnis.
    -> Einfachere Regeln -> Einfacherer Code -> Weniger Raum wo Fehler passieren können
    (Ok, einen Nachteil hat die Sache schon: Deine Strukturdefinition wird etwas komplizierter. Aber derzeit kann deine Definitionssyntax sowieso nicht alle Fälle leisten, daher war klar, dass diese komplizierter werden muss)



  • IMO kann das Beispiel unten links in https://ibb.co/9HbcZXR nicht ohne Layer-Wechsel funktionieren.
    Alle Geleise sollen am Rand Abzweigungen haben, müssten daher also im selben Layer sein. Allerdings soll dort wo sich die zwei weiten Bögen kreuzen keine Kreuzung sein. Also müssten sie dort in unterschiedlichen Layern sein.

    Von der Beschreibung her könnte man es auch anders umsetzen: man gibt einfach bei jedem Segment an mit welchen anderen Segmenten es direkt verbunden ist.

    Zeichnen könnte man das ganze vermutlich so:

    • Man zeichnet erstmal jedes Segment einzeln in einen eigenen Puffer (Hintergrund, Rahmen und Track in den selben Puffer)
    • Dann prüft man für jeden einzelnen Pixel welche Segmente an der selben Stelle einen "nicht-Hintergrund" Pixel haben
    • Man wählt das Segment mit dem höchsten Index aus
    • Wenn der Segment-Pixel ein Track-Pixel ist, zeichnet man einen Track-Pixel in das fertige Bild
    • Wenn der Segment-Pixel ein Rahmen-Pixel ist, prüft man den selben Pixel aller verbundenen Segmente: wenn eines der verbundenen Segmente dort einen Track-Pixel hat, zeichnet man auch einen Track Pixel in das fertige Bild. Ansonsten zeichnet man einen Rahmen Pixel.

  • Mod

    Anderer Vorschlag: Ist es wichtig, wer oben und wer unten ist? Falls nicht, dann ist das eine Art Graphenproblem, und ein Bauteil ist komplett definiert durch seine Verbindungen. Und die kann man dann einfach zeichnen, wie es einem beliebt, es wird immer aufgehen.

    Der interessante Fall ist so etwas wie die Kachel ganz oben mit der Kreuzung. Ist das für die Anwendung äquivalent dazu, als ob da gar keine Kreuzung wäre, sondern einfach nur die Menge der Verbindungen

    • [links oben : oben]
    • [links oben : rechts unten]
    • [links oben : unten]
    • [oben : rechts unten]
    • [oben : unten]
    • [rechts unten : unten]

    ? Wenn das das gleiche ist wie die eingezeichnete Kreuzung, dann ist der Graphenansatz vollständig und wahrscheinlich das einfachste, was du finden wirst.


  • Mod

    simple idee:

    1. du zeichnest jedes segment mit seinem index in einen buffer
    2. fuer jeden pixel im index-buffer ueberpruefst du, ob seine nachbarn (im radius vom halben rahmen) mehr als 2 kleiner sind im index, in dem fall zeichnest du die rahmenfarbe, sonst die farbe der linie (die du anhand des index nachschauen koenntest).


  • Achtung: Brücke explizit angegeben, heisst nicht alles von Hand machen. Ich würde dazu einfach das Layer Attribut durch bridge_over="x, y, z" ersetzen, wobei das dann eine Liste von Indizes der anderen Segmente sind, wo die Brücke drüber geht. Daraus ergibt sich dann automatisch wo die Brücke liegt, wie sie orientiert ist und auch wie die Segmente zu unterteilen sind, falls das fürs Zeichnen nötig ist. Die Liste ist für fast alle Segmente leer, da nur sehr wenige über Brücken führen, dann muss das Attribut nicht mal notiert werden.


Log in to reply