我正在用Python编写一个游戏(使用pygame),它要求我为每一个新游戏生成随机但看起来不错的“sea”。经过长时间的搜索,我找到了一种算法,它包含了padlib.py中定义的贝塞尔曲线。我现在需要弄清楚padlib生成的曲线何时与线段相交。
蛮力方法就是使用padlib生成的一组近似线段来寻找答案。然而,我怀疑可以通过分析找到更好的答案。我只有几十个样条线段-搜索它们应该比搜索数千个线段快。
我沿着这条路走了一小段路:贝塞尔曲线->;Kochanek-Bartels Spline->;Cubic Hermite spline
在最后一页,我发现了这个函数:
p(t) = h00(t)p0 + h10(t)m0 + h01(t)p1 + h11(t)m1
其中,p(t)实际上是一个点(二维向量),hij(t)函数是三次多项式,p0,psub>1,m0和msub>1是我可以从padlib代码中得到的点。
现在,我可以看到我的问题的解决方案是p(t)=u+v*t1,其中u和v是线段的结束。
然而,我无法计算出解析解。这里有人知道现有的解决方案吗?或者帮我解方程?
我终于找到了一个工作代码来演示Mark Thornton建议的方法。下面是intersection例程的Python代码,以及可视化测试它的pygame代码。三次根解可以基于this问题编写。
作为粗略轮廓,旋转并平移系统,使线段位于X轴上。现在y坐标是参数t的三次函数,求“零”(解析公式可以在好的数学课本或维基百科上找到)。现在计算与这些零点相对应的x坐标,并根据线段进行测试。
相关问题 更多 >
编程相关推荐