gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 05:45:28 24 4
gpt4 key购买 nike

我已经阅读了我能在这里找到的有关该主题的所有内容,但我无法将部分代码翻译成我能理解的简单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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com