Python将对象均匀分布在bezier-cu上

2024-10-02 18:26:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经阅读了所有关于这个主题的文章,但是我没有把一部分代码翻译成我能理解的简单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,那就太好了。在


Tags: andofthe代码byaxarepoints
1条回答
网友
1楼 · 发布于 2024-10-02 18:26:46

首先,这是一个没有符号解的问题,也就是说,你不能用bezier曲线的“length-for-t”函数(attvalue…,曲线的长度是X),然后将它反转,得到“t-for-length”(如果我的长度是总长度X的…%,即t值为i)。因此,您将发现的所有实现都是主题的变体

  1. 确定全曲线长度
  2. 确定曲线上各种t值的参考长度,以及
  3. 对于与参考值不完全匹配的值,找到其附近的两个t值,然后插值。在

对于一些直线的查找,bezier的实现将把直线变成直线。一些实现将在已知参考值之间进行线性插值(有效地模拟平坦曲线),其他实现将使用圆弧插值,将两个已知值之间的每个线段近似为(圆弧)圆弧的一部分。对于所有这些实现,底线是您的里程数将根据所做的选择而变化,但所有这些都接近“实际”结果,您使连续t值之间的距离越小。在

最简单,也通常是最快的,就是在连续的t值之间构造一个“足够小”的步长的LUT,然后甚至不需要插值,而是选择最接近实际长度的t点。只要步长达到1px或更小的段长度,出于显示目的,您不需要任何更好的东西,因为更高的分辨率实际上不会产生“更好”的点,即使您使距离参考点更精确,它们也将位于同一像素上。在

我有一个关于这一点的描述,在http://pomax.github.io/bezierinfo/#tracing上,它在处理中,而不是python中,但是处理是一种非常简单的语言,并且给出了算法描述,根据你已经拥有的代码,用python编写应该是相对直接的。在

相关问题 更多 >