我正在尝试为OpenCL实时raytracer找到线段和二次贝塞尔曲线三角形之间的交点。
这个问题Detect&find intersection ray vs. cubic bezier triangle谈论寻找射线与立方贝塞尔曲线三角形之间的碰撞点,主要建议是尝试细分或张量积贝塞尔曲线补丁。
我在一些地方读到,当针对二次贝塞尔曲线三角形测试线段时,您最终不得不求解二次方程,但是我没有找到关于该方程实际上是什么的任何信息,并且开始不知道这是真的。到目前为止,我尝试找到它的尝试也很短:P
除了使用细分或张量积贝塞尔曲线补丁之外,没人知道这是真的还是解决方法吗?
这是一个二次贝塞尔三角形的方程式:
AS ^ 2 + 2 * DST + 2 * ESU + B * T ^ 2 + 2 * FTU + C * U ^ 2
其中S,T,U是三角形的参数。您可以将U替换为(1-S-T),因为它们是重心坐标。
A,B,C是三角形的角,D,E,F是沿边缘的控制点。
super 迷上了这个!
最佳答案
线段具有参数方程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,数值方法和求解过程在数值上可能不稳定)。这就是为什么有时建议使用细分方法的原因。
关于c++ - 相交线与二次贝塞尔曲线三角形,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22644594/