【问题标题】:Checking if two Bezier curves collide检查两条贝塞尔曲线是否碰撞
【发布时间】:2021-09-29 11:23:14
【问题描述】:

检查两条贝塞尔曲线是否相交有很多问题,最突出的是this one。但是,这回答了检查是否

B1(t1)=B2(t2)

其中B1B2 是贝塞尔曲线。因此,我们可能认为t1 不是t2。但我想检查碰撞,即

B1(t)=B2(t)

所以它们必须同时相交t。有没有一种算法可以快速检测到这一点,而不必一直重复t,即是否可以仅从控制点中找出它?

【问题讨论】:

  • 您的情况实际上更简单,因为您对单个方程只有一个变量。而所提到的主题必须为单个方程找到两个变量。一张纸或 WolframAlpha 可能是您的下一站。
  • 我不确定我是否理解你认为这会让你做什么:碰撞和交叉在几何编程中是一回事。两条曲线在同一t 值处相交是一种特殊情况,但它仍然是一个相交,它不是突然变成别的东西。

标签: collision-detection intersection bezier


【解决方案1】:

您的限制意味着您可以只解决单个维度的t,然后验证所有其他维度。 IE。解决Bx₁(t) = Bx₂(t),因为只有一个变量,如果在区间 [0,1] 中产生 (a)t 值,则将找到的值插入By(t),而无需解决任何问题,看看你是否得到另一个平等。如果是这样,请将其插入Bz(t) 以验证您的贝塞尔曲线定义的多少维度等等。

需要注意的是,解决t 意味着您正在执行求根,这意味着任何五阶或更高阶的表达式都无法以符号方式解决(请参阅Abel-Ruffini theorem 了解为什么会这样)并且您会必须使用数值分析来“解决”t

虽然我不确定这样做会给你带来什么:这不是一个特别有用的约束,并且会在几乎所有可能的情况下得出“没有碰撞”的结论,在这种情况下,人类会得出结论认为有很多 碰撞。如果两条任意曲线以完全相同的t 值重合,您需要获得超凡脱俗的幸运。或者您必须使用专门设计的曲线以相同的t 值相交(在这种情况下,无需计算,您已经知道它们在哪里计算;)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-10
    相关资源
    最近更新 更多