我的问题是如何获得位于定义为给定轴向坐标的NURBS曲线的曲线上的点的第二个坐标(2D)。我有结矢量,控制点,它们的权重和基础函数。给定一个轴向坐标的NURBS曲线的点评估
我翻看类似的问题(How to find out Y coordinate of specific point in bezier curve in canvas?),但到目前为止没有找到一个好的答案。 谢谢, M
我的问题是如何获得位于定义为给定轴向坐标的NURBS曲线的曲线上的点的第二个坐标(2D)。我有结矢量,控制点,它们的权重和基础函数。给定一个轴向坐标的NURBS曲线的点评估
我翻看类似的问题(How to find out Y coordinate of specific point in bezier curve in canvas?),但到目前为止没有找到一个好的答案。 谢谢, M
如果您需要从头开始实施一切,这不是一件容易的事情。尽管如此,该代码将是这样的:
for each non-null knot interval in the knot vector of the NURBS { extract Bezier curve B(t) from the NURBS for this knot interval [a, b]; compute the minimum and maximum X values of the Bezier curve's control points. if (X0 is within [Xmin, Xmax]) { t0 = a; t1 = b; epsilon = 1.0e-06; // a small value;while ((t1-t0) > epsilon) { Subdivide B(t) at t=0.5 to generate two Bezier curves: B1(t) and B2(t); compute the [Xmin1, Xmax1] for B1(t) and [Xmin2, Xmax2] for B2(t); if (X0 is within [Xmin1, Xmax1]) { B(t) = B1(t); t0 = a; t1 = (a+b)/2; } else { B(t) = B2(t); t0 = (a+b)/2; t1 = b; } } // end while loop return ((t0+t1)/2); // This is the parameter value you are looking for } // end if()
} //结束for循环
的(T0 + T1)/ 2就是你正在寻找的参数值。请注意,您可能会发现给定相同X0值的多个解决方案。
感谢您的回答。我有几个后续问题。通过提取给定结间隔的贝塞尔曲线,你的意思是什么?另外,Xmin2和Xmax2没有在您的示例代码中使用。他们不需要吗? –
NURBS曲线由在每个非空结点间隔内定义的多个曲线段组成。这些曲线段中的每一个实际上都是贝塞尔曲线(如果NURBS曲线确实是有理的,则为有理贝塞尔曲线)。因此,提取结区间的贝塞尔曲线就意味着要为结区间[a,b]创建一个贝塞尔曲线表示。要做到这一点的算法应该可以在线或在任何几何建模教科书中使用。 – fang
Xmin2和Xmax2并未真正使用。如果X0在[Xmin,Xmax]之内但不在[Xmin1,Xmax1]之内,则X0必须在[Xmin2,Xmax2]之内。你可以用它来检查计算是否正确。 – fang
澄清我正在寻找一种方法来确定NURBS参数的基础上位于NURBS曲线上的点的x位置,以便我可以然后评估该参数的曲线,并找到相应的y值点 –