python - 按弦高划分曲线

标签 python geometry bezier grasshopper rhino3d

我想将曲线分割为弦高相等的线段。我知道我可以使用分割距离工具分割成相等的弦长,但我找不到高度选项。 我写了一些非常肮脏的代码来做到这一点 here . (不要评判我,它既不优雅又低效,但它确实起作用了。)

Curve divided by chord height

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

最佳答案

我的回答是关于寻找贝塞尔曲线弦高(sagitta?),而不是分割过程。

我考虑使用控制点 P0、P1、P2、P3 的三次方贝塞尔曲线。 Sagitta 是距弦段 C=P0P3 的最大距离。当曲线的方向矢量(测速仪,一阶导数)与弦矢量平行时,达到最大距离。三次贝塞尔曲线的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)

这是一个二次方程,t 在 [0..1] 范围内可能有 0、1 或 2 个解(对于 S 形曲线,情况 2 是可能的)。然后我们可以在从方程中找到的参数 t 处评估贝塞尔曲线,并计算到弦的距离。

关于python - 按弦高划分曲线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15941728/

相关文章:

javascript - 试图计算圆上两点之间的 Angular ?

c++ - 不同物体碰撞

android - 当三次贝塞尔曲线的端点变化时找到新的控制点

math - 返回贝塞尔曲线上等弧长点列表的函数

编译时调用的 Python 装饰器函数

Python matplotlib 颜色条 : all on last axis

c# - 形状文件到 SQL Server

python - 如何在 python 中组合 .tif 堆栈?

python - 如何在框架内绘制直方图?

algorithm - 创建三次和/或二次贝塞尔曲线以适应路径