0

我需要通过出切线围绕一个点对三次贝塞尔样条曲线进行排序。我的第一次尝试是确定出切角并按此排序。对于具有四个点 的样条曲线p0, p1, p2, p3,出切角为:

p0 != p1 ? angle(p0, p1) : p0 != p2 ? angle(p0, p2) : angle(p0, p3)

这处理退化的三次方,实际上是二次方甚至一条线。但是,该点可能有两条切线角度相同的输出样条曲线,但稍后在样条曲线上的控制点或终点位置不同,这会影响排序顺序。

是否有一个很好的封闭式算法,用于按出射角度对两个任意贝塞尔样条进行排序,以处理退化情况,并在切线相等时使用样条的其余部分来消除情况的歧义?我可以通过尝试t值来做到这一点,直到我消除歧义,但似乎可能有一个封闭形式的算法。

4

1 回答 1

0

据我所知,对于这个特定问题没有封闭形式的解决方案。考虑您希望通过点处的出切线对一组曲线进行排序;但如果此时切线相等,则曲线已经排序!我知道您真正想要的是找出当您沿着曲线远离起点时切线是否发散。

所以让我们这样做;比较从 t = 0 开始的小增量处的切线(t 是任何参数曲线的曲线时间参数)。

这是 javascript 中的一个小演示

compareTan 函数以小增量 (t = 1e-5) 比较切线的角度。它所依赖的只是一种在给定 t 参数处返回切线的方法。实现二次案例并不难——对于线,您可以直接比较它们。

于 2014-06-21T10:33:04.993 回答