贝塞尔曲线是参数曲线,意味着有一个参数t
,人们可以在其中评估多项式,以找出曲线上的点的位置。
某些常见案例的多项式可以在en.wikipedia.org/wiki/B%C3%A9zier_curve#Specific_cases
找到要在屏幕上绘制贝塞尔曲线,可以通过微小的步长来评估从0
到1
的多项式不断增加的t
。然而,这将是非常浪费的,因为一般来说,参数“空间”不对应于屏幕“空间”,即几个小步骤可能只落在一个像素上。
我的问题是:如何找到将笛卡尔距离从前一点增加至少1个像素的最小步长?
以其他方式表达:我想在屏幕上绘制贝塞尔曲线。如何选择t
应该增长的(统一)步骤,以便我再也不会在一个像素上绘制一次?当t
增长太快时,我不介意“漏洞”,我只是不想重绘已绘制的像素。
修改
通过“如何找到”我的意思是O(1)。是的,我可以使用De Casteljau's algorithm,但我希望有一种方法可以快速“猜测”最佳t
步骤。
答案 0 :(得分:1)
上面的评论(jozxyqk)给你一个提示。我会尝试使用样条绘图的递归二进制除法。
让我们假设您从参数空间的粗分辨率(delta_t = 0.1)开始,它在样条曲线 s , s(t = 0)上给出11个点, s(t = 0.1),..., s(t = 0.9), s(t = 1)。 计算 s(t_i)和 s(t_i + 1)之间的距离。如果> 1,则在这两个点之间进行二进制细分。等等...
但老实说,我想在没有任何递归循环或细分的情况下计算所有点的分辨率更高更快。特别是如果你使用多线程编程。