相交线与二次贝塞尔曲线三角形

时间:2014-03-25 19:35:30

标签: c++ math raytracing bezier

我试图为我的OpenCL实时光线跟踪器找到线段和二次贝塞尔曲线三角形之间的交点。

这个问题Detect&find intersection ray vs. cubic bezier triangle讨论了找到光线和立方贝塞尔三角形之间的碰撞点,主要的推荐是尝试细分或张量积bezier补丁。

我在几个地方读到,当测试一个线段对着二次贝塞尔三角形时,你最终必须求解二次方程,但我还没有找到任何关于那个的信息方程式实际上是,并开始怀疑它是否真实。到目前为止,我找到它的尝试也很短暂:P

除了使用细分或张量积bezier补丁之外,有没有人知道这是真的还是如何解决它?

这里是二次贝塞尔三角形的等式:

AS ^ 2 + 2 * D S T + 2 * E S U + B * T ^ 2 + 2 * F T U + C * U ^ 2

其中S,T,U是三角形的参数。您可以用(1-S-T)替换U,因为它们是重心坐标。

A,B,C是三角形的角,D,E,F是沿边缘的控制点。

超级难倒在这一个!

1 个答案:

答案 0 :(得分:0)

线段具有参数方程P = P0+(P1-P0)*v=P0+d*v,其中v是参数[0..1] 要找到蛮力的交集,你必须解决三个二次方程的系统,如

x0+dx*v=AxS^2 + 2*Dx*S*T + 2*Ex*S*U + Bx*T^2 + 2*Fx*T*U + Cx*U^2

该系统有8种可能的解决方案,只有当v,s,t同时位于0..1范围内时才存在交集。解决这个系统并不容易(可能的方法 - Gröbner basis,数值方法和求解过程可能在数值上不稳定)。这就是有时推荐细分方法的原因。