作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
这绝对是在挑战我的三 Angular 学知识的极限。
是否有计算二次贝塞尔曲线与直线交点的公式?
示例:
在下图中,我有 P1、P2、C(这是控制点)和 X1、X2(对于我的特定计算,它只是 X 轴上的一条直线。)
我想知道的是 T 的 X、Y 位置以及 T 处切线的 Angular 。在红色曲线和黑色线之间的交点处。
经过一些研究发现this问题,我知道我可以使用:
t = 0.5; // given example value
x = (1 - t) * (1 - t) * p[0].x + 2 * (1 - t) * t * p[1].x + t * t * p[2].x;
y = (1 - t) * (1 - t) * p[0].y + 2 * (1 - t) * t * p[1].y + t * t * p[2].y;
计算我在曲线上任意给定点的 X、Y 位置。所以使用它我可以沿着曲线循环遍历一堆点,检查是否有任何点在我的相交 X 轴上。然后从那里尝试计算我的切线 Angular 。但这似乎真的不是最好的方法。任何数学大师都知道最好的方法是什么?
我在想,也许它比我想要的要复杂一些。
最佳答案
如果您只需要在 x 方向上与直线相交,则您已经知道交点的 y 坐标。要获得 x 坐标,请执行以下操作:
y = b
y(t)
的 y 方程可以得到:b = (1 - t) * (1 - t) * p[0].y + 2 * (1 - t) * t * p[1].y + t * t * p[2]。 y
t = (p[0].y - p[1].y - sqrt(b*a + p[1].y*p[1].y - p[0].y*p[2 ].y))/a
a = p[0].y - 2*p[1].y + p[2].y
x(t)
的 x 方程中以获得 x 坐标,您就完成了。你可能需要注意一些特殊情况,比如当不存在解决方案时,因为平方根的参数可能会变为负数或者分母 (a
) 可能变为零,或者其他什么就像那样。
如果您需要更多帮助或与任意线的交集,请发表评论。
(*) 我用 wolfram alpha 来解方程因为我很懒:Wolfram alpha solution .
关于javascript - 计算二次贝塞尔曲线的交点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27664298/
我是一名优秀的程序员,十分优秀!