B-Splines 在 C++ 中
B-Splines in C++
我正在尝试编写一个程序以在 C++ 中生成曲线以绘制 B-Spline 曲线。这就是我的代码的样子。
void drawBSplineCurve(vector<point> poly)
{
int n, d;
cout << "Enter degree of curve: ";
cin >> d;
n = poly.size();
vector<double> uVec;
int i;
for(i=0;i<n+d;i++)
{
uVec.push_back(((double)i)/(n+d-1));
}
double x, y, basis, u;
for(u=0;u<=1;u+=0.0001)
{
x = 0;
y = 0;
for(i=0;i<poly.size();i++)
{
basis = blend(uVec, u, i, d);
x += basis*poly[i].x;
y += basis*poly[i].y;
}
putpixel(roundOff(x), roundOff(y), YELLOW);
}
}
double blend(vector<double> &uVec, double u, int k, int d)
{
if(d==1)
{
if(uVec[k]<=u && u<uVec[k+1])
return 1;
return 0;
}
double b;
b = ((u-uVec[k])/(uVec[k+d-1]-uVec[k])*blend(uVec, u, k, d-1)) + ((uVec[k+d]-u)/(uVec[k+d]-uVec[k+1])*blend(uVec, u, k+1, d-1));
return b;
}
但是,正如您从我的输出中看到的那样,出于某种原因,曲线倾向于在原点开始和结束(y-axis 是反转的)。对此原因的任何帮助将不胜感激。谢谢 :D
因此,在投入了比我应有的更多时间之后,我终于在教科书的一行中找到了我错过的答案。显然,曲线仅针对 uVec[d-1]
和 uVec[n]
之间的 u
值定义。
所以在投入了比我应该有的更多的时间之后,我终于在我错过的课本中的一行中找到了答案。显然,曲线仅针对 uVec[d-1] 和 uVec[n] 之间的 u 值定义。
这意味着错误在函数“混合”中
条件 (uVec[k]<=u && u
我正在尝试编写一个程序以在 C++ 中生成曲线以绘制 B-Spline 曲线。这就是我的代码的样子。
void drawBSplineCurve(vector<point> poly)
{
int n, d;
cout << "Enter degree of curve: ";
cin >> d;
n = poly.size();
vector<double> uVec;
int i;
for(i=0;i<n+d;i++)
{
uVec.push_back(((double)i)/(n+d-1));
}
double x, y, basis, u;
for(u=0;u<=1;u+=0.0001)
{
x = 0;
y = 0;
for(i=0;i<poly.size();i++)
{
basis = blend(uVec, u, i, d);
x += basis*poly[i].x;
y += basis*poly[i].y;
}
putpixel(roundOff(x), roundOff(y), YELLOW);
}
}
double blend(vector<double> &uVec, double u, int k, int d)
{
if(d==1)
{
if(uVec[k]<=u && u<uVec[k+1])
return 1;
return 0;
}
double b;
b = ((u-uVec[k])/(uVec[k+d-1]-uVec[k])*blend(uVec, u, k, d-1)) + ((uVec[k+d]-u)/(uVec[k+d]-uVec[k+1])*blend(uVec, u, k+1, d-1));
return b;
}
但是,正如您从我的输出中看到的那样,出于某种原因,曲线倾向于在原点开始和结束(y-axis 是反转的)。对此原因的任何帮助将不胜感激。谢谢 :D
因此,在投入了比我应有的更多时间之后,我终于在教科书的一行中找到了我错过的答案。显然,曲线仅针对 uVec[d-1]
和 uVec[n]
之间的 u
值定义。
所以在投入了比我应该有的更多的时间之后,我终于在我错过的课本中的一行中找到了答案。显然,曲线仅针对 uVec[d-1] 和 uVec[n] 之间的 u 值定义。
这意味着错误在函数“混合”中
条件 (uVec[k]<=u && u