Problem beim Zeichnen mehrerer Layer



  • Wäre es nicht einfach einfacher nicht in Layern zu zeichnen und am Ende dann noch die Brücken drauf? Dann könnte man (optional) für die Brücke auch noch ein spezielle Grafik einführen, damit sich das nicht nur durch eine schmale weiße Linien unterscheidet. Wenn das nicht geht, würde ich die einzelnen Segmente nochmal unterteilen, z.B. die Gerade über das Sechseck in Anfang, Mitte, Ende. So das man für jedes Stück einzeln entscheiden kann, ob es im selber Layer wie eine anderes Segment ist oder darüber. Aktuell kann man so eine Reihenfolge ja gar nicht festlegen für solche Sonderfälle wie man auf https://ibb.co/9HbcZXR in der unteren Reihe sieht.



  • @TGGC
    Ich möchte das auch nicht zu kompliziert machen, die Bearbeitung sieht so aus, dass der Benutzer (genauer: ich) XML schreiben muss. Da stecke ich lieber etwas mehr Arbeit in die Logik, damit die selbständig erkennt, wo sich zwei Segmente kreuzen bevor ich für verschiedene Tiles mehr XML brauche.
    Beispiel:

    <tile>
       <track>
          <segment start="N" end="S" layer="0"/>
          <segment start="SE" end="NW" layer="1">
       </track>
    </tile>
    

    Aus den Infos erkenne ich, dass es zwei Geraden sind, die sich in der Mitte des Tile kreuzen. Da sie in unterschiedlichen Layern liegen weiß ich, dass ich für das zweite Segment eine Brück zeichnen muss, weil es über dem ersten liegt. Ist natürlich etwas Arbeit, alle möglichen Kreuzungspunkte zu finden und entsprechend zu behandeln.

    Zur Info: Hier ist eine Liste, der Tiles die es gibt. 😉



  • Es spricht ja nichts dagegen, Logik zu schreiben, die das macht. Aber der User muss es dann trotzdem erstmal angeben. Und das geht mit der Layer Logik nicht. Angenommen, du hast 3 Segmente, die etwa so angeordnet sind:

    \       /
     \A   B/
    ---------
       \ /
        X
       / \
      /   \
    
    

    Bei A und B sind die Segmente verbunden und bei X ist eine Brücke. Wie soll das mit deinem Layerkonzept gehen? Teilst du das irgendwie in Layer auf, fehlt entweder bei A oder B die Verbindung. Offensichtlich muss eine Bahnstrecke nämlich nicht komplett in einem Layer laufen sondern kann den Layer wechseln. Du musst diesen Sonderfall irgendwie behandeln.



  • @TGGC

    Wenn ich im ersten Schritt alle Rahmen zeichne und im zweiten Schritt alle Strecken ist ggf. alles mit allem verbunden (Layer werden in diesen Schritten ignoriert). Im dritten Schritt bestimme ich die Kreuzungspunkte anhand der Layer, das müsste doch eigentlich ausreichen. Damit würden die Segmente, die nicht verbunden sein sollten, wieder getrennt. Die Layer werden dann nur noch für die Bestimmung der Kreuzungspunkte gebraucht.



  • Alles schön und gut - aber zum dritten Mal : man kann nicht in allen Konfigurationen die Brücken und Kreuzungspunkte korrekt unterscheiden aus den Layern.

    Und dann landest du halt bei meinem Vorschlag: Layer komplett weglassen und dafür Brücken explizit angeben oder einzelne Linien müssen den Layer abschnittsweise wechseln können.



  • Sorry, verstehe ich nicht.
    Gib mir doch bitte mal ein Beispiel, wo´s nicht funktioniert.



  • @TGGC sagte in Problem beim Zeichnen mehrerer Layer:

    Angenommen, du hast 3 Segmente, die etwa so angeordnet sind:

    \       /
     \A   B/
    ---------
       \ /
        X
       / \
      /   \
    
    

    Bei A und B sind die Segmente verbunden und bei X ist eine Brücke. Wie soll das mit deinem Layerkonzept gehen? Teilst du das irgendwie in Layer auf, fehlt entweder bei A oder B die Verbindung.



  • 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.



  • Wie funktioniert https://ibb.co/9HbcZXR rechts unten? Oder generell irgendeiner von den unteren.

    Das Problem mit dem Layer, was ich bisher sehe ist, wenn alle Verbindungen miteinander verbunden sind indirekt d.h. du kann von jedem Segment in ein anderes irgendwie kommen ... aber eben nicht alle direkt miteinander verbunden sind.

    Sprich Auffahrten. Wie realisiert du Auffahrten, die ja von einer Layer in ein anderes Layer übergehen, wenn ich das richtig sehe.



  • @Leon0402

    <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="SW" end="SE" layer="0"/> <!-- Segment 3: Weite Kurve Südwesten -> Südosten, liegt unten-->
          <segment start="NW" end="SE" layer="1"/> <!-- Segment 4: 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: gleicher Layer, nix zu tun
    Test Segment 1 mit Segment 4: unterschiedliche Layer, aber keine Kreuzung

    Test Segment 2 mit Segment 3: gleicher Layer, nix zu tun
    Test Segment 2 mit Segment 4: unterschiedliche Layer, Kreuzung in der Mitte des Tiles: Brücke über Segment 2 zeichnen, da Segment 4 drüber liegt

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

    Hier die passenden Schritte dazu, hab die Zwischenschritte weggelassen.



  • @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.


Anmelden zum Antworten