闭合贝塞尔曲线
Closed Bezier curve
我实现了这样的贝塞尔曲线绘制功能:
Vector Bezier(float t)
{
Vector rt(0,0);
int n = length-1;
for(int i=0;i<length;i++)
{
float Bi = 1;
for(int j = 1;j<=i;j++)
{
Bi *= (float) (n-j+1)/j;
}
Bi *= pow(t,i) * pow(1-t, n-i);
rt = rt + (Cpoints[i] * Bi);
}
return rt;
}
void drawBezier()
{
int segments = 100;
glBegin( GL_LINE_STRIP );
for(int i=0;i<segments;i++)
{
float t = (float) i / segments;
Vector p = Bezier(t);
glVertex2f(p.x, p.y);
}
glEnd( );
}
CPoints是包含控制点坐标的数组,length是控制点的数量。问题是,如何使它成为闭合的贝塞尔曲线,如下所示:
只需使用将最后一个端点连接到第一个端点的附加线段(例如:复制第一个控制点)。
单个贝塞尔样条线段,无论是三次的还是二次的还是四次的,都不能表示那种封闭的形状。然而,多个细分市场可以。
因此,您通常不想修改多段曲线绘制函数本身,而是修改输入其中的控制点。尽管您可以修改绘图函数以接受用于绘制结束段的标志,但将其视为与您作为输入提供的控件 points/curve 段相关的问题可能更容易。
我实现了这样的贝塞尔曲线绘制功能:
Vector Bezier(float t)
{
Vector rt(0,0);
int n = length-1;
for(int i=0;i<length;i++)
{
float Bi = 1;
for(int j = 1;j<=i;j++)
{
Bi *= (float) (n-j+1)/j;
}
Bi *= pow(t,i) * pow(1-t, n-i);
rt = rt + (Cpoints[i] * Bi);
}
return rt;
}
void drawBezier()
{
int segments = 100;
glBegin( GL_LINE_STRIP );
for(int i=0;i<segments;i++)
{
float t = (float) i / segments;
Vector p = Bezier(t);
glVertex2f(p.x, p.y);
}
glEnd( );
}
CPoints是包含控制点坐标的数组,length是控制点的数量。问题是,如何使它成为闭合的贝塞尔曲线,如下所示:
只需使用将最后一个端点连接到第一个端点的附加线段(例如:复制第一个控制点)。
单个贝塞尔样条线段,无论是三次的还是二次的还是四次的,都不能表示那种封闭的形状。然而,多个细分市场可以。
因此,您通常不想修改多段曲线绘制函数本身,而是修改输入其中的控制点。尽管您可以修改绘图函数以接受用于绘制结束段的标志,但将其视为与您作为输入提供的控件 points/curve 段相关的问题可能更容易。