Wie vermeide ich Selbstüberschneidungen beim Anwenden eines Strichs auf eine Kurve?

11

Ich habe mehrere Spline2D-Objekte in meinem Code, von denen jedes über eine Positions-, Geschwindigkeits- und Beschleunigungsmethode verfügt, die zu einem bestimmten Zeitpunkt einen Vektor der angegebenen Menge zurückgibt. Ich habe diese Vektoren verwendet, um Geometrie zu konstruieren, um Gradientenstriche für die Kurven zu erstellen, aber ich habe Probleme mit Selbstschnittpunkten bei steilen Kurven. Als Beispiel ist hier eine Kurve, in der dies auftritt:

Drahtmodell: http://twitpic.com/2zplw1/full
Gefüllt: http://twitpic.com/2zpmnt/full

Wie Sie sehen können, schneidet sich in der zweiten Kurve der innere Teil selbst, was dieses hässliche Artefakt verursacht. Gibt es einen guten Algorithmus / eine gute Methode, um Kurven zu streichen, ohne diese Selbstüberschneidung zu verursachen?

EDIT : Extremere Beispiele sowie ein Modell dessen, was ich erreichen möchte:

Drahtmodell: http://twitpic.com/2ztwzi/full
Gefüllt: http://twitpic.com/2ztwkt/full
Ideales Ergebnis (Mock-Up): http://twitpic.com/2ztxa8/full

ThatsGobbles
quelle
Wow, ich hatte die Konnotation des Titels nicht einmal bemerkt, als ich ihn schrieb. :)
ThatsGobbles

Antworten:

3

Wenn Sie diese mit der GPU und einer modernen 3D-API (z. B. OpenGL / D3D) rendern, scheint es mir, dass Sie dies mit Tiefenprüfungen beseitigen können. Wenn Sie Ihre äußeren Verts z = FAR und Ihre inneren Verts z = NEAR zuweisen, sollte die Tiefenprüfung verhindern, dass die Überlappung angezeigt wird. Mit OpenGL:


  // don't forget to clear depth buffer to 1.0f at beginning of frame.
  glClearDepth(1.0f);
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  // enable depth testing.
  glEnable(GL_DEPTH_TEST);
  glDepthFunc(GL_LEQUAL);

// draw the Spline2D for each segment in spline for each vert in segment if (vert is an outer vert), set vert.z = 1.0, otherwise set vert.z=0.0

Vorsichtsmaßnahme: Dies funktioniert nicht, wenn Sie durchscheinende Striche benötigen.

jpaver
quelle
1
Tolle Antwort, genau das, was ich dachte, aber Sie irren sich darüber, dass es nicht für durchscheinende Striche funktioniert, wenn Sie zulassen, dass der Z-Puffer in einem Durchgang geschrieben wird und dann die Farbe im zweiten.
Richard Fabian
Danke, meine Striche sind in der Tat undurchsichtig, also hat das sehr einfach und wunderbar funktioniert!
ThatsGobbles
1

Der "Fix" hängt davon ab, wie die resultierende Ausgabe aussehen soll. Das Problem ist hier nicht wirklich gut genug definiert: Wie soll es aussehen?

Ich würde vorschlagen, dass Sie zuerst versuchen, ein noch extremeres Beispiel für den Fehler zu machen, und dann Photoshop / Paint verwenden, um ihn zu beheben. Vielleicht finden Sie Inspiration für eine Lösung.

Willst du, dass es zusammenklappt? Überlappung mit der Kante? Ziehen, bis es sich nicht überlappt?

Richard Fabian
quelle
Guter Punkt, ich werde später in Illustrator oder Inkscape eine schärfere Kurve und eine "ideale" Kurve erstellen.
ThatsGobbles
Originaler Beitrag bearbeitet!
ThatsGobbles