Zeichnende, pixelperfekte 1px-Splines (speziell Catmull-Rom)

8

Ein kurzer Hintergrund: Ich arbeite an einer webbasierten Zeichnungsanwendung und muss 1px dicke Splines zeichnen, die durch ihre Kontrollpunkte verlaufen.

Das Problem, mit dem ich zu kämpfen habe, ist, dass ich jedes Pixel zwischen p1 und p2 so zeichnen muss, als ob ich ein 1px-Stiftwerkzeug verwende. Also kein Anti-Aliasing und ein Pixel nach dem anderen. Dies muss manuell ohne Verwendung eines Linien- / Kurvenbibliothekscodes erfolgen, da mein Pinselsystem davon abhängt, dass eine Pixelkoordinate verwendet wird, um die Pinselspitze auf die Leinwand anzuwenden.

Im Wesentlichen muss ich das Ein-Pixel-Stepping von etwas wie dem Bresenham-Algorithmus mit den Koordinaten kombinieren, die von der Catmull-Rom-Gleichung zurückgegeben werden. Ich habe Probleme, weil die Catmull-Rom-Punkte nicht gleichmäßig verteilt sind (ich kann also nicht einfach sagen, dass es 100 Pixel in der Kurve geben und die Gleichung 100 Mal ausführen soll). Ich habe versucht, einen geschätzten Anfangswert des Maximums der X - und Y - Deltas zu verwenden und die Lücken mit Bresenham zu füllen, aber aufgrund der Rundung habe ich immer noch einige "schmutzige" Abschnitte (dh die Linie bewegt sich eindeutig nach oben und zur richtig, aber ich bekomme immer noch zwei Pixel mit der gleichen Y-Komponente, was zu einem "fetten" Abschnitt der Linie führt.

Ich bin sicher, dass dies gelöst wurde, weil fast jedes Grafikprogramm, das Splines zeichnet, die sauberen Pixelkurven unterstützen muss, nach denen ich suche. Nach ziemlich viel Mathe-Forschung bin ich ein bisschen verwirrt und immer noch ohne eine Lösung. Irgendwelche Tipps?

EDIT: Hier ist ein Beispiel für eine Kurve, die ich möglicherweise rendern muss:

Was könnte ein erwartetes Ergebnis haben, das so aussieht (beachte, dass dies eine Schätzung ist):

Mit der Catmull-Rom-Spline-Gleichung benötigen wir vier Punkte, um ein Segment zu erstellen. P0 und P3 werden als Tangenten für die eingehende und ausgehende Richtung von dem P1- & gt; P2-Segment verwendet. Bei einem Catmull-Rom-Spline wird nur der blaue Abschnitt interpoliert, wenn sich t von 0 nach 1 bewegt. P0 und P3 können dupliziert werden, um sicherzustellen, dass der grüne Teil gerendert wird. Das ist für mich kein Problem.

>

Der Einfachheit halber muss ich die Pixel auf der Kurve zwischen P1 und P2 rendern, da ich Tangenten in Form von P0 und P3 habe. Ich muss nicht unbedingt Catmull-Rom-Splines verwenden, aber sie scheinen das richtige Werkzeug für diesen Job zu sein, da Kontrollpunkte durchlaufen werden müssen. Die ungleichmäßige Verteilung der Interpolationspunkte wirft mich auf eine Schleife.

EDIT2: Hier ist ein Beispiel, was ich meine, wenn ich sage, dass meine resultierende Kurve schmutzig ist:

Die roten Pfeile zeigen einige Stellen an, an denen kein Pixel sein sollte. Dies tritt auf, weil die X- und Y-Komponenten der Koordinate, die berechnet werden, sich nicht mit der gleichen Rate ändern. Wenn also jede der Komponenten gerundet wird (so dass ich eine genaue Pixelposition habe), kann es sein, dass entweder X oder Y nicht aufgestockt wird, weil die berechnete Koordinate beispielsweise (42.4999, 50.98) ist. Die Runde gegen einen Boden oder eine Decke zu tauschen löst das Problem nicht, da es nur ändert, wo es auftritt.

    
Xenethyl 27.12.2010, 20:05
quelle

1 Antwort

2

Hier haben Sie eine Papierbeschreibungsmethode für die Neuparametrisierung von Splines um Erhalten Sie gleichmäßig beabstandete Punkte entlang der Kurvenlänge. Ich denke, das kann Ihr Problem lösen, wenn Sie es an Catmull-Rom-Kurven anpassen können (sollte nicht zu schwierig sein, denke ich)

    
Dr. belisarius 27.12.2010, 22:36
quelle

Tags und Links