gpt4 book ai didi

python - 如何在给定切线方向的二次贝塞尔曲线上找到一个点(如果有的话)?

转载 作者:行者123 更新时间:2023-11-28 21:56:50 24 4
gpt4 key购买 nike

我目前正在开发一个 python 库,用于从 TrueType 字体中提取笔划- 在这里,我将笔划定义为测试点与其反射点之间的中线。我使用术语反射点来指代“墨水”区域另一侧的最近点,在正常情况下(除了在衬线词干处)在与测试点相反的方向上也有切线.

我在 python 中使用 fontTools 和我从 http://pomax.github.io/bezierinfo/#extremities 中描述的处理代码中滚动的 bezier 库.

我现在卡住的地方是如何在具有给定切线的二次贝塞尔曲线上找到点,我的数学技能在头脑清醒的好日子里非常初级 [这不是仪式现在] 所以我希望有更敏锐的头脑的人可以指出如何实现这一目标的鸟瞰图。

目前我唯一能想到的就是用类似于 Newton-Raphson 求根算法的方法在数值上接近它,但根据目标方向值评估一阶导数。然而,我希望有一个符号解决方案,因为这需要在字形轮廓中的每条曲线的每条其他曲线上运行。

最佳答案

使用 http://pomax.github.io/bezierinfo/#extremities 中给出的符号,二次贝塞尔曲线由下式给出:

B(t) = P1*(1-t)**2 + 2*P2*(1-t)*t + P3*t**2

因此,(通过取 Bderivative 相对于 t )曲线的切线由下式给出

B'(t) = -2*P1*(1-t) + 2*P2*(1-2*t) + 2*P3*t
= 2*(P1 - 2*P2 + P3)*t + 2*(-P1 + P2)

给定一些切线方向 V , 解决

B'(t) = V

t .如果有解决办法,t = ts , 那么贝塞尔曲线上切线方向的点 VB(ts) 给出.


我们本质上想知道两个向量(B'(t)V)是平行的还是反平行的。有一个技巧可以做到这一点。

两个向量,XY , 如果它们是垂直的 dot product为零。如果X = (a,b)Y = (c,d)然后是 X 的点积和 Y

a*c + b*d

所以,XY如果 X 是平行的和 Y_perp是垂直的,其中 Y_perp是垂直于 Y 的向量.

在二维中,如果在坐标中 Y = (a,b)然后 Y_perp = (-b, a) . (可能有两个垂直向量,但这个可以。)请注意——使用上面的公式——Y 的点积。和 Y_perp

a*(-b) + b*(a) = 0

确实,这与垂直向量的点积等于 0 的说法相吻合。

现在,解决我们的问题:让

B'(t) = (a*t+b, c*t+d)
V = (e, f)

然后B'(t)V 平行(或反平行)如果或何时 B'(t)垂直于V_perp , 发生在

dot product((a*t+b, c*t+d), (-f, e)) = 0
-(a*t+b)*f + (c*t+d)*e = 0

我们知道a , b , c , d , ef .求解 t .如果t介于 0 和 1 之间,然后是 B(t)P1 之间贝塞尔曲线段的一部分和 P3 .

关于python - 如何在给定切线方向的二次贝塞尔曲线上找到一个点(如果有的话)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20825173/

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