我需要通过它们的出切线对一个点周围的三次贝塞尔曲线进行排序。我的第一次尝试是确定输出切线角度并按此排序。对于具有四个点p0, p1, p2, p3
的样条曲线,输出切线角度为:
p0 != p1 ? angle(p0, p1) : p0 != p2 ? angle(p0, p2) : angle(p0, p3)
这会处理退化的立方体,实际上是二次方甚至是一条直线。但是,该点可能有两个具有相同切线角度的输出样条线,但稍后在样条线下方的不同控制点或终点位置会影响排序顺序。
是否有一个很好的封闭形式算法,用于处理退化角度的两个任意贝塞尔样条曲线,处理退化情况,并且当切线相等时,还使用样条的其余部分消除歧义情况?我可以通过尝试t
值来实现它,直到我消除歧义,但似乎可能存在封闭形式的算法。
答案 0 :(得分:0)
据我所知,这个特定问题没有封闭式解决方案。 考虑您希望通过一点处的输出切线对一组曲线进行排序;但如果切线在该点相等,则曲线已经排序!我明白你真正想要的是找出当你沿着曲线远离起点移动时切线是否发散。
所以,让我们这样做;比较从t = 0开始的小增量的切线(t是任何参数曲线的曲线时间参数)。
这是javascript中的small demo。
compareTan函数以小增量(t = 1e-5)比较切线的角度。它所依赖的是一种在给定的t参数处返回切线的方法。实现二次大小写的行并不是很难,你可以直接比较它们。