Python - 在贝塞尔曲线上均匀分布对象

标签 python math bezier

我已经阅读了我能在这里找到的有关该主题的所有内容,但我无法将部分代码翻译成我能理解的简单Python。

我得到了这个,基于 this very good explanation de Casteljau 算法:

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 来阐明这一点,那就太好了。

最佳答案

首先:这是一个没有符号解决方案的问题,即您不能采用“length-for-t”函数(在 t 值...,曲线的长度为X) 为贝塞尔曲线并将其反转,以便得到“t-for-length”(如果我处于总长度 X 的长度 ...%,我处于哪个 t 值) 。因此,您将找到的所有实现都是主题的变体

  1. 确定完整曲线长度,
  2. 确定曲线上各种t值的引用长度,并且
  3. 对于与引用值不完全匹配的值,找到其附近的两个t值,然后进行插值。

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

最简单且通常也是最快的方法是构建一个在连续 t 值之间具有“足够小”步长的 LUT,然后甚至不用插值,而是选择 t 点最接近您的实际长度。只要步长导致 1px 或以下的段长度,出于显示目的,您不需要比这更好的东西,因为更高的分辨率实际上不会导致“更好”的点,它们甚至会在同一像素上如果您使距离引用点更加精确。

我对此有一个描述,并带有代码,位于 http://pomax.github.io/bezierinfo/#tracing ,它是用 Javascript 编写的,而不是 python,但考虑到算法描述,根据您已有的代码编写 Python 应该相对简单。

关于Python - 在贝塞尔曲线上均匀分布对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16263226/

相关文章:

python - astype 是否编辑原始数据框?

java - 在Java中绘制贝塞尔曲线

Python:声明为整数和字符

python - Thrift 服务器对于简单操作来说确实很慢

Python 列表迭代到一行

loops - 在 O(n) 时间内将数组中的所有元素相互相加

c++ - 可分离核的卷积

c++ - DirectX 移动我的 GUI

algorithm - 如何求贝塞尔曲线的平均速度和加速度?

java - 从几个点绘制曲线