c++ - 闭合贝塞尔曲线

标签 c++ opengl glut freeglut

我实现了这样的贝塞尔曲线绘制函数:

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是控制点的数量。问题是,如何使其成为闭合贝塞尔曲线,如下所示:

Closed Bezier

最佳答案

只需使用一个附加段将最后一个端点连接到第一个端点(例如:复制第一个控制点)。

单个贝塞尔样条线段,无论是三次、二次还是四次,都无法表示那种闭合形状。但多个 segmentation 市场可以。

因此,您通常不想修改多段曲线绘制函数本身,而是修改输入到其中的控制点。尽管您可以修改绘图函数以接受用于绘制结束线段的标志,但将其视为与您作为输入提供的控制点/曲线段相关的问题可能更容易。

关于c++ - 闭合贝塞尔曲线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33714839/

相关文章:

c++ - 如何构造队列 vector ?

c++ - 这种类型的双关语定义明确吗?

c++ - 接收第一次读取前发送到串口的数据

opengl - 在桌面上为 OpenGL ES 开发

c++ - 将鼠标坐标转换为 OpenGL 错误偏移

c++ - 使用 C++ 进行测试驱动开发

opengl - glm 结合旋转和平移

c++ - 立方体上的纹理贴图出现错误

c++ - 如何在不终止应用程序的情况下关闭 GLUT 窗口?

c++ - 在 C++ 中获取广泛的类型错误