使用Boehm算法插入B-Spline Knot

时间:2017-06-06 14:40:49

标签: c# algorithm spline

我有一个B样条,我试图实现Boehm算法,在不改变形状的情况下将节点插入样条曲线。对于每两个现有结,我必须添加三个新结并删除现有结。

但是我很难理解有关此算法的论文,需要一些帮助才能理解我做错了什么。

这就是我想要实现的目标:http://www.inf.ed.ac.uk/teaching/courses/cg/d3/knotInsert.html

正在评估来自此链接的B样条,并且在当前两个节点之间不断产生新的节点(橙色节点),在它们之间的评估时变为灰色。

我已阅读了很多文章,但其中的信息都归结为:http://web.mit.edu/hyperbook/Patrikalakis-Maekawa-Cho/node18.html 还有:https://www.cs.mtu.edu/~shene/COURSES/cs3621/NOTES/spline/B-spline/single-insertion.html

基本上,为了找到两个现有结之间的新结位置,我必须首先根据t(即评估百分比)计算比率: enter image description here

我不清楚的第一件事是u参数。据我所知,这是当前现有结的指数。但是我不明白为什么 t-ui 除以 ui + p-ui 添加ui然后减去它的想法是什么?我确信我在这里肯定遗漏了一些东西。

然后使用这个比率(ai)找到新结的位置:

enter image description here

我的问题不在于数学 - 这是非常简单的数学,而是与执行本身相关。我读到的关于这个主题的所有论文都非常不清楚(至少对我而言)关于如何获得方程中的值以及它们如何变化以便找到每个新创建的结。

我写了一个方法(C#),我试图从第一个链接的交互式图形中找到这三个新的橙色结,这就是我得到的:

        public Vector3[] InsertKnots(float percent)
    {
        //Percent [0-1]
        float t = 1 + percent * (points.Length - 1); //multiply percent to map the point count
        int ti = Mathf.FloorToInt(t); //this is the beginning index of the knot leg
        int degree = points.Length - 2; //Degree of the spline

        //Create the three new knots
        Vector3[] knots = new Vector3[3];
        for (int i = 0; i < 3; i++)
        {
            int ui = ti + i;
            float ratio = (t - ui) / ((ui+degree)-ui); //finding ai
            knots[i] = (1f - ratio) * points[ui - 1] + ratio * points[ui]; //Finding the new knot's position 
        }
        return knots;
    }

其中points是Vector3 []数组(包含float x,y和z属性的类)。

不幸的是,这种方法的结果如下:

enter image description here

我不明白的另一件重要事情就是我必须要做的才能找到树橙点。我是否必须运行for-loop(就像我现在正在做的那样)?

我无法找到此算法的任何代码示例,所以此时此刻我已经丢失了。

0 个答案:

没有答案