我已经在图形库上工作了一段时间,现在已经到了必须绘制Bezier和基于行的字体的地步。到目前为止,我仍然坚持:





绿线是贝塞尔曲线,白色部分是被渲染。

我在Beziers中使用的代码在这里。一行是在这里。对于那些不知道那是Lua的人。

路径渲染(行):32-39
算法如下:


以特定间隔从0到1迭代
使用以下公式计算x和y:到目前为止,一切正常。绿线是使用路径方法生成的。

白色部分以完全不同的方式呈现:


我得到贝塞尔曲线的x坐标和
我遍历该表,每次遇到一个点时,都会更改state的值。在同一for循环中,还检查状态是否为on。如果是,则在屏幕上绘制一个像素。

要使用a的x值,请使用getX方法(Bezier中的第46行和Line中的第31行)。

我用于图形本身的代码是以下代码:对。 love.graphics.points(x,y)在x,y处设置一个点。

预先感谢。

评论

没有人回应的原因吗?我应该重新表述这个问题吗?

成立之初,只有这么多人有时间回答,而您到目前为止只有5个意见。这个stackexchange还是一个婴儿,还没有很多用户给它时间。

好。谢谢。我没意识到有这么少的人在这里。

#1 楼

如果您急于使渲染器正常工作,并且已经使填充的多边形例程正常运行,我是否可以建议一种替代的方法,可能更简单?尽管我不熟悉Lua,但是看来您正在解决扫描线与二次Bezier的精确交点,尽管这是令人钦佩的,但可能会导致过大杀伤力。分段,然后将它们扔到多边形扫描转换器中。我建议仅使用(递归)二进制细分:即具有控制点的二次贝塞尔曲线$(\ overline {A},\ overline {B}和\ overline {C})$可以分为两个贝塞尔曲线,$(\ overline {A},\ overline {D},\ overline {E})$和$(\ overline {E},\ overline {F},\ overline {C})$
其中
$$
\开始{align *}和\ overline {D} = \ dfrac {\ overline {A} + \ overline {B}} {2} \\&
\ overline {E} = \ dfrac {\ overline {A} +2 \ overline {B} + \ overline {C}} {4} \\&
\ overline {F} = \ dfrac {\ overline {B} + \ overline {C} } {2}
\ end {align *}
$$
(如果您只有定点数学,这也很棒)。

每次IIRC细分后,贝塞尔曲线和只是连接端点的直线段之间的误差下降了约4倍,因此分段线性逼近与真实曲线难以区分之前不需要很多细分。您还可以使用控制点的边界框来确定是否可以尽早退出细分过程,因为这也将是曲线上的保守边界。

评论


$ \ begingroup $
谢谢! A,B,C是向量吗?另外,我正在使用scanline方法,因为它可以让我获得所需的确切点数。您能否看一下代码并猜测为什么它不起作用?只是公式。另外,我会回应,但我没有15个声誉。
$ \ endgroup $
–创作者
16 Jan 12'在13:04



$ \ begingroup $
是的,A B&C是向量;在您的情况下为2D,但它同样适用于N个尺寸。至于检查代码...就像我说的我不知道Lua,甚至正确使用标准的多边形扫描线渲染器也很棘手-例如在计算恰好位于顶点位置的交叉时,必须非常小心。当您将其扩展到直接处理Beziers时(大约20年前我做了),这仍然更加困难。对不起,我没有时间。
$ \ endgroup $
–西蒙F
16年1月12日在14:09

$ \ begingroup $
感谢您的帮助。刚发现问题。二次方程中的a和c取反。
$ \ endgroup $
–创作者
16年1月12日在16:22