我想将曲线细分为弦高相等的段。我知道我可以使用“分割距离”工具将弦长分成相等的长度,但我找不到高度选项。我在这里写了一些非常脏的代码。(不要评判我,它不优雅且效率低下,但它确实有效。)
我真正想听到的是,继续进行二进制搜索之类的东西是没有意义的,因为 Grasshopper 中已经有一个功能可以做到这一点,但是如果失败了,有没有人对如何在更有效的方法?
我的答案涉及寻找贝塞尔曲线弦高(矢状面?),而不是细分过程。
我考虑具有控制点 P0、P1、P2、P3 的三次贝塞尔曲线。Sagitta 是与弦段 C=P0P3 的最大距离。当曲线的方向向量(全线图,一阶导数)平行于弦向量时,达到最大距离。三次贝塞尔曲线的全线图是具有控制点的二次贝塞尔曲线(Sederberg book CAGD,第 2.7 节):
D0=3(P1-P0), D1=3(P2-P1), D2=3(P3-P2)
当叉积为零时向量是平行的,所以我们有方程
Cx*Dy-CyDx=0 or
(P3x-P0x)*((P1y-P0y)*(1-t)^2+2*(P2y-P1y)*t*(1-t)+(P3y-P2y)*t^2) =
(P3y-P0y)*((P1x-P0x)*(1-t)^2+2*(P2x-P1x)*t*(1-t)+(P3x-P2x)*t^2)
这是二次方程,对于范围 [0..1] 内的 t,它可能有 0、1 或 2 个解(情况 2 可能适用于 S 形曲线)。然后我们可以在从方程中找到的 t 参数处评估贝塞尔曲线,并计算到弦的距离。