Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Boehm';s算法_C#_Algorithm_Spline - Fatal编程技术网

C# 使用Boehm';s算法

C# 使用Boehm';s算法,c#,algorithm,spline,C#,Algorithm,Spline,我有一个B样条曲线,我正在尝试实现Boehm的算法,在不改变其形状的情况下将节点插入样条曲线。对于每两个现有节点,我必须添加三个新节点并删除现有节点 然而,我很难理解关于这个算法的论文,需要一些帮助来理解我做错了什么 这就是我想要实现的目标: 此链接中的B样条曲线正在评估中,当前两个结之间不断生成新结(橙色结),这两个结在评估时变为灰色 我读了很多文章,但其中的信息都归结为: 还有: 基本上,为了找到新结在两个现有结之间的位置,我必须首先计算基于t的比率(即评估百分比): 我首先不清楚的是u参

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

然而,我很难理解关于这个算法的论文,需要一些帮助来理解我做错了什么

这就是我想要实现的目标:

此链接中的B样条曲线正在评估中,当前两个结之间不断生成新结(橙色结),这两个结在评估时变为灰色

我读了很多文章,但其中的信息都归结为: 还有:

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

我首先不清楚的是u参数。据我所知,这是当前现有结的索引。然而,我不明白为什么将t-ui除以ui+p-ui添加ui然后减去ui的想法是什么?我确信我肯定错过了一些东西

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

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

我写了一个方法(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;
    }
public Vector3[]插入节点(浮动百分比)
{
//百分比[0-1]
float t t=1+percent*(points.Length-1);//乘以percent以映射点计数
int ti=Mathf.FloorToInt(t);//这是结腿的开始索引
int degree=points.Length-2;//样条曲线的阶数
//创建三个新结
向量3[]节=新向量3[3];
对于(int i=0;i<3;i++)
{
intui=ti+i;
浮动比率=(t-ui)/((ui+度)-ui);//查找ai
结[i]=(1f-比率)*点[ui-1]+比率*点[ui];//查找新结的位置
}
返回结;
}
其中,points是Vector3[]数组(一个包含浮点x、y和z属性的类)

不幸的是,此方法的结果如下所示:

另一件我不明白的主要事情是,为了找到树上的橙色点,我必须做些什么。我是否必须运行for循环(就像我现在做的那样)


我找不到这个算法的任何代码示例,所以我现在几乎不知所措。

我一点都不懂,但是
u(I+p)-ui
ui+p-ui
@Corak-更准确地说,应该是u(I+p)-u(I)有根本的不同。这个问题可能更适合于解释algorithm@PaulF-对。其中一个例子(mtu.edu链接):如果
i=5
p=3
你应该有
u(5+3)-u(5)
,也就是
u(8)-u(5)
@PaulF啊是的,你是对的!(i+p)形成了指数——这解释了很多。这意味着我们正在查看节点跨度值。但问题是什么是结跨度值。你是对的,我应该把这个问题贴在数学上。我一点都不懂,但是
u(I+p)-ui
ui+p-ui
@Corak-更准确地说,应该是u(I+p)-u(I)有根本的不同。这个问题可能更适合于解释algorithm@PaulF-对。其中一个例子(mtu.edu链接):如果
i=5
p=3
你应该有
u(5+3)-u(5)
,也就是
u(8)-u(5)
@PaulF啊是的,你是对的!(i+p)形成了指数——这解释了很多。这意味着我们正在查看节点跨度值。但问题是什么是结跨度值。你是对的,我应该把这个问题贴在数学上。