得益于De Casteljau的算法,在某个参数t处将贝塞尔曲线分为两部分很容易。如何分割NURBS曲线?

评论

我不知道它是否也会这样做,但是De Boor的算法与De Casteljeau等效。有趣的是,我知道您可以使用De Boor算法将NURBS或b样条曲线拆分为分段的Bezier曲线。

#1 楼

NURBS曲线通常在任意点处分割的方式是通过结插入。您可以在分割点处插入结,直到其具有最大多重度为止,此时您可以读取两条分割曲线。

但是,您可能不想在任意点进行分割。如果最终目标是绘制曲线或类似的东西,那么值得在现有的结点处分割曲线(即,执行结插入,直到所有结达到最大多重性),而不是插入新的结。
此过程将NURBS分成统一的有理B样条。一旦有了,就可以使用de Boor算法进一步拆分。

结向量中的结数为:

numKnots = degreeOfCurve + numControlPoints + 1


或者,如果您愿意:

numKnots = orderOfCurve + numControlPoints


插入一个结会增加控制点的数量。

沿着NURBS曲线行驶时,每个结表示一个控制点“退出”而另一个控制点“进入”的位置。如果重复打结,则表示在此位置替换了多个控制点。

对于大于1的度数的曲线,由于一个简单的原因,多次重复了最后一个结:您需要引入多个点才能开始,并且需要弹出多个点来结束。

让我们暂时考虑三次曲线,只是为了使事情保持简单。

结向量为[0,0,1,1]的曲线是均匀的B样条曲线。

结向量为[0,0,1,1,2,2]的曲线是不均匀的,但可以认为是两条均匀的B样条曲线,它们在t = 1时连接,一个对应于[0,0,1,1],另一个对应于[1,1,2,2]。之所以可以这样做,是因为结的多重性足以“开始”和“结束”三次曲线。

如果您遇到带有[0,0,1,2,2]之类的结矢量的曲线,则可以在不更改曲线形状的情况下以1插入一个结(这是结插入过程)。这会使控制点的数量增加一;结插入过程会调整新结周围的点以适应新结。但是一旦完成,就会有两条均匀的B样条曲线。

除非在同一位置插入太多的结,否则结点插入不会创建重叠的控制点,并且“ “,我的意思是曲线的程度。因此,对于不均匀的三次曲线,您将插入多个结,以便每个结都具有多重性2。这将为您提供许多邻接的一致的三次曲线,然后可以使用de Boor算法进行进一步分割。

评论


$ \ begingroup $
对不起,我对NURBS还是很陌生:“最大多重性”是什么意思?我的意思是,当我以前一种方式进行操作时,是否最终会出现多个重叠的控制点?
$ \ endgroup $
– Ecir Hana
15年8月26日在22:03



$ \ begingroup $
让我尝试在答案中进行解释。
$ \ endgroup $
–别名
15年8月27日在1:20

$ \ begingroup $
err假名不是一个很好的证明这一点的载体。我知道他们可能需要扩大其他职位。尽管@EcirHana,最好问一下多重性是什么。
$ \ endgroup $
– joojaa
15年8月27日在9:03

$ \ begingroup $
你可能对@joojaa是正确的。
$ \ endgroup $
–别名
15年8月27日在13:03