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

C++ 相交线与二次贝塞尔三角形,c++,math,raytracing,bezier,C++,Math,Raytracing,Bezier,我试图为我的OpenCL实时光线跟踪器找到线段和二次bezier三角形之间的交点 这个问题讨论如何找到光线和三次贝塞尔三角形之间的碰撞点,主要建议尝试细分,或张量积贝塞尔面片 我在一些地方读到过,当用二次贝塞尔三角形测试线段时,你只需要解一个二次方程,但我没有找到关于这个方程的任何信息,我开始怀疑它是否正确。到目前为止,我试图找到它的努力也没有成功:P 除了使用细分或张量积bezier面片之外,有人知道这是不是真的,或者如何解决它吗 以下是二次贝塞尔三角形的方程式: AS^2+2*DST+2*E

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

这个问题讨论如何找到光线和三次贝塞尔三角形之间的碰撞点,主要建议尝试细分,或张量积贝塞尔面片

我在一些地方读到过,当用二次贝塞尔三角形测试线段时,你只需要解一个二次方程,但我没有找到关于这个方程的任何信息,我开始怀疑它是否正确。到目前为止,我试图找到它的努力也没有成功:P

除了使用细分或张量积bezier面片之外,有人知道这是不是真的,或者如何解决它吗

以下是二次贝塞尔三角形的方程式:

AS^2+2*DST+2*ESU+B*T^2+2*FTU+C*U^2

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

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


这件事太难办了

线段具有参数方程
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时,交点才存在。求解这个系统并不容易(可能的方法、数值方法和求解过程可能在数值上不稳定)。这就是为什么有时推荐细分方法。

因为这涉及寻找公式,而不是相同的C++算法,可能更好地被问到?哦,那是不幸的。我的印象是,因为它是二次的,所以它会更简单。我将进一步研究你提到的方法。非常感谢您提供的信息。