我已经阅读了所有关于这个主题的文章,但是我没有把一部分代码翻译成我能理解的简单python。在
我得到了这个,基于de Casteljau算法的this very good explanation:
def divideCurve(p0, cp0, cp1, p1, t):
# p0 and p1 are the start/end points of the bezier curve,
# cp0 and cp1 are the control points
# all points are tuples of their coordinates: p0 = (10, 15)
Ax = ( (1 - t) * p0[0] ) + (t * cp0[0])
Ay = ( (1 - t) * p0[1] ) + (t * cp0[1])
Bx = ( (1 - t) * cp0[0] ) + (t * cp1[0])
By = ( (1 - t) * cp0[1] ) + (t * cp1[1])
Cx = ( (1 - t) * cp1[0] ) + (t * p1[0])
Cy = ( (1 - t) * cp1[1] ) + (t * p1[1])
Dx = ( (1 - t) * Ax ) + (t * Bx)
Dy = ( (1 - t) * Ay ) + (t * By)
Ex = ( (1 - t) * Bx ) + (t * Cx)
Ey = ( (1 - t) * By ) + (t * Cy)
Px = ( (1 - t) * Dx ) + (t * Ex)
Py = ( (1 - t) * Dy ) + (t * Ey)
print Px, Py
for T in range(0, 11, 1):
t = T*0.1
divideCurve(p0, cp0, cp1, p1, t)
但这会使曲线上的点分布不均匀。在
我认为here是一个可能的解决方案,但我完全不了解反弧长函数的代码,也不知道如何将其转换为python。 我发现了另一种方法here,我认为它采用了一种不同的方法,但我仍然没有足够的理解来用python实现。在
如果有人愿意把它解释成简单的python,那就太好了。在
首先,这是一个没有符号解的问题,也就是说,你不能用bezier曲线的“length-for-t”函数(attvalue…,曲线的长度是X),然后将它反转,得到“t-for-length”(如果我的长度是总长度X的…%,即t值为i)。因此,您将发现的所有实现都是主题的变体
对于一些直线的查找,bezier的实现将把直线变成直线。一些实现将在已知参考值之间进行线性插值(有效地模拟平坦曲线),其他实现将使用圆弧插值,将两个已知值之间的每个线段近似为(圆弧)圆弧的一部分。对于所有这些实现,底线是您的里程数将根据所做的选择而变化,但所有这些都接近“实际”结果,您使连续t值之间的距离越小。在
最简单,也通常是最快的,就是在连续的t值之间构造一个“足够小”的步长的LUT,然后甚至不需要插值,而是选择最接近实际长度的t点。只要步长达到1px或更小的段长度,出于显示目的,您不需要任何更好的东西,因为更高的分辨率实际上不会产生“更好”的点,即使您使距离参考点更精确,它们也将位于同一像素上。在
我有一个关于这一点的描述,在http://pomax.github.io/bezierinfo/#tracing上,它在处理中,而不是python中,但是处理是一种非常简单的语言,并且给出了算法描述,根据你已经拥有的代码,用python编写应该是相对直接的。在
相关问题 更多 >
编程相关推荐