Frage

Ein kurzer Hintergrund: Ich arbeite an einer webbasierten Zeichenanwendung und muss 1px dicke Splines zeichnen, die ihre Steuerpunkte durchlaufen.

Das Problem, mit dem ich zu kämpfen habe, ist, dass ich jede der Pixel zwischen P1 und P2 zeichnen muss, als würde ich ein 1px -Bleistift -Tool verwenden. Also kein Anti-Aliasing und ein Pixel gleichzeitig. Dies muss manuell ohne die Verwendung eines Zeilen-/Kurvenbibliothekscodes erfolgen, da mein Bürstensystem davon abhängt, dass eine Pixelkoordinate auf die Leinwand angewendet wird.

Im Wesentlichen muss ich den einen Pixel kombinieren, der aus dem Bresenham-Algorithmus mit den von der Catmull-ROM-Gleichung zurückgegebenen Koordinaten stammt. Ich habe Probleme, weil die Catmull-ROM-Punkte nicht gleichmäßig verteilt sind (daher kann ich nicht einfach sagen, dass es 100 Pixel in der Kurve geben und die Gleichung 100 Mal ausführen sollte). Ich habe versucht, einen geschätzten Startwert des Maximums der X- und Y -Deltas zu verwenden und die Lücken mit Bresenham zu füllen, aber aufgrund von Runden landete ich immer noch einige "schmutzige" Abschnitte (dh die Linie bewegt sich deutlich nach oben und zu den Richtig, aber ich bekomme immer noch zwei Pixel mit derselben Y -Komponente, was zu einem "Fett" -Abschnitt der Linie führt).

Ich bin mir sicher, dass dies gelöst wurde, da fast jedes Grafikprogramm, das Splines zeichnet, die sauberen Pixelkurven unterstützen muss, nach denen ich suchte. Nach vielem Mathe -Forschung bin ich jedoch ein bisschen verwirrt und immer noch ohne Lösung. Irgendein Rat?

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

alt text

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

alt text

Mit der Catmull-Rom-Spline-Gleichung benötigen wir vier Punkte, um ein Segment zu erstellen. P0 und P3 werden als Tangenten für eingehende und ausgehende Richtung aus dem P1-> P2-Segment verwendet. Mit einem Catmull-Rom-Spline wird der blaue Abschnitt alles interpoliert, wenn sich T von 0 auf 1 bewegt.

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, dass Kontrollpunkte durchlaufen werden müssen. Die ungleichmäßige Verteilung von Interpolationspunkten ist das, was mich für eine Schleife wirft.

Edit2: Hier ist ein Beispiel für das, was ich meine, wenn ich sage, meine resultierende Kurve ist schmutzig:

alt text

Die roten Pfeile weisen auf einige Orte hin, an denen es kein Pixel geben sollte. Dies tritt auf, da sich die X- und Y -Komponenten der Berechnung der Koordinate nicht mit gleicher Geschwindigkeit ändern. Wenn also jede der Komponenten abgerundet wird (so habe ich einen genauen Pixelort), kann es sein, dass entweder X oder Y nicht gestoßen wird, da die berechnete Koordinate beispielsweise (42,4999, 50,98) ist. Wenn Sie die Runde gegen einen Boden oder eine Ceil tauschen, löst das Problem nicht, da sie sich nur dort ändert, wo es auftritt.

War es hilfreich?

Lösung

Hier hast du Ein Papier, das die Methode zur Wiederparametrisierung von Splines beschreibt um gleichermaßen Abstandpunkte entlang der Kurvenlänge zu erhalten. Ich denke, dies kann Ihr Problem lösen, wenn Sie es an Catmull-ROM-Kurven anpassen können (sollte nicht zu schwierig sein, denke ich)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top