javascript - 计算二次贝塞尔曲线的交点

标签 javascript html canvas trigonometry

这绝对是在挑战我的三 Angular 学知识的极限。

是否有计算二次贝塞尔曲线与直线交点的公式?

示例:

在下图中,我有 P1、P2、C(这是控制点)和 X1、X2(对于我的特定计算,它只是 X 轴上的一条直线。)

我想知道的是 T 的 X、Y 位置以及 T 处切线的 Angular 。在红色曲线和黑色线之间的交点处。

curve example

经过一些研究发现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 让你:
    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
  • 将生成的 t 插入贝塞尔函数 x(t) 的 x 方程中以获得 x 坐标,您就完成了。

你可能需要注意一些特殊情况,比如当不存在解决方案时,因为平方根的参数可能会变为负数或者分母 (a) 可能变为零,或者其他什么就像那样。

如果您需要更多帮助或与任意线的交集,请发表评论。

(*) 我用 wolfram alpha 来解方程因为我很懒:Wolfram alpha solution .

关于javascript - 计算二次贝塞尔曲线的交点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27664298/

相关文章:

javascript - 缩小效果问题

javascript - 重新加载 Disqus 的评论数

javascript - 单击后退按钮时重定向到不同页面 "not working"

javascript - 缩放后确定鼠标在 HTML5 Canvas 上的位置

javascript - HTML5 canvas webgl,无法绘制立方体

javascript - 通过请求 header 发送数据与通过请求正文发送数据

javascript - 无法使用新数据对象更新 Knockout UI

html - 在父 div 中居中图像元素

javascript - jQuery 多重显示隐藏在一种形式中

c# - 始终在玩家面前显示对象