用弦高划分曲线

时间:2013-04-11 06:02:45

标签: python geometry bezier grasshopper rhino3d

我想将曲线细分为具有相等和弦高度的段。我知道我可以用Divide Distance工具分成相等的弦长,但我找不到高度选项。 我写了一些非常脏的代码here。 (不要评判我,它不够优雅,效率低下,但它确实起作用。)

Curve divided by chord height

我真正想听到的是,继续做二进制搜索这样的事情是没有意义的,因为Grasshopper中已有一个功能可以做到这一点,但如果不这样做,有没有人对如何做有任何建议它以更有效的方式?

1 个答案:

答案 0 :(得分:3)

我的回答是关于找到bezier曲线弦高(sagitta?),而不是细分过程。

我认为具有控制点P0,P1,P2,P3的三次贝塞尔曲线。 Sagitta是与弦段C = P0P3的最大距离。当曲线的方向矢量(hodograph,1st derivative)平行于和弦矢量时,达到最大距离。三次贝塞尔曲线的Hodograph是具有控制点的二次贝塞尔曲线(Sederberg book CAGD, section 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个解(对于S形曲线,情况2可能是这样)。然后我们可以在从方程式找到的t参数中评估贝塞尔曲线,并计算到和弦的距离。