Ich arbeite seit einiger Zeit an einer Grafikbibliothek und bin an einem Punkt angelangt, an dem ich Bezier- und linienbasierte Schriftarten zeichnen muss. Bis zu diesem Punkt stecke ich fest:
Die grünen Linien sind die Bezier-Pfade, und der weiße Teil wird gerendert.
Der Code, den ich für Beziers verwende, ist hier . Der für Linien ist hier . Für diejenigen, die das nicht wissen, ist Lua.
Pfadwiedergabe (Linien): 32 - 39 Der Algorithmus lautet wie folgt:
- Iteration von 0 nach 1 in bestimmten Intervallen
- Berechnen von x und y mit dieser Formel:
(1-index)^2*x1+2*(1-index)*index*x2+index^2*x3
Bis zu diesem Punkt funktioniert alles gut. Die grünen Linien werden mit der Pfadmethode generiert.
Der weiße Teil wird ganz anders gerendert:
- Ich bekomme die x-Koordinaten der Beziers und Linien bei einem bestimmten Y, die sie in eine Tabelle einfügen.
- Ich durchlaufe die Tabelle und ändere jedes Mal, wenn ich auf einen Punkt stoße, den Wert des Status. In der gleichen for-Schleife wird auch geprüft, ob der Status aktiviert ist. Wenn ja, zeichne ich ein Pixel auf den Bildschirm.
Um die x-Werte von ay zu finden, verwende ich die getX-Methode (Zeile 46 in Bezier und Zeile 31 in Zeile).
Der Code, den ich für die Zeichnung selbst verwende, ist folgender:
local xBuffer = {}
local state = false
for i=0,500 do
for k,v in pairs(beziers) do
a,b = v.getX(i)
if a then
xBuffer[round(a)] = 1
if b then
xBuffer[round(a)] = 1
end
end
end
for k,v in pairs(lines) do
a = v.getX(i)
if a then
xBuffer[round(a)] = 1
end
end
state = false
for x=0,600 do
if xBuffer[x] then
state = not state
end
if state then
love.graphics.points(x,i)
end
end
end
Kurze Erklärung: Für i durchläuft v paarweise die Tabelle, die Paaren als Argument gegeben wurde. love.graphics.points (x, y) setzt einen Punkt auf x, y.
Danke im Voraus.
quelle
Antworten:
Wenn Sie es eilig haben, Ihren Renderer zum Laufen zu bringen, und die bereits ausgefüllte polygonale Routine bereits ordnungsgemäß funktioniert , kann ich einen alternativen, möglicherweise einfacheren Ansatz vorschlagen? Obwohl ich mit Lua nicht vertraut bin, scheinen Sie nach dem genauen Schnittpunkt einer Scanlinie mit dem quadratischen Bezier zu suchen, was zwar bewundernswert, aber möglicherweise übertrieben ist.
IIRC verringert sich bei jeder Unterteilung der Fehler zwischen dem Bezier und nur einem geraden Liniensegment, das die Endpunkte verbindet, um den Faktor ~ 4x, sodass nicht viele Unterteilungen erforderlich sind, bis die stückweise lineare Approximation nicht mehr von der wahren zu unterscheiden ist Kurve. Sie können auch den Begrenzungsrahmen der Kontrollpunkte verwenden, um zu entscheiden, ob Sie den Unterteilungsprozess frühzeitig verlassen können, da dies auch eine konservative Begrenzung der Kurve ist.
quelle