我正在尝试为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/

10-11 12:22