• 领导讲话
  • 自我介绍
  • 党会党课
  • 文秘知识
  • 转正申请
  • 问题清单
  • 动员大会
  • 年终总结
  • 工作总结
  • 思想汇报
  • 实践报告
  • 工作汇报
  • 心得体会
  • 研讨交流
  • 述职报告
  • 工作方案
  • 政府报告
  • 调研报告
  • 自查报告
  • 实验报告
  • 计划规划
  • 申报材料
  • 当前位置: 勤学考试网 > 公文文档 > 计划规划 > 正文

    实验报告四bezier曲线

    时间:2020-11-18 16:46:19 来源:勤学考试网 本文已影响 勤学考试网手机站

    第 PAGE 1 页 共 NUMPAGES 4 页

    实验四 Bezier曲线的绘制

    1. 实验目的

    练习Bezier曲线的绘制和de Casteljau算法。

    2. 实验内容和要求

    按要求完成如下一个作业,提交纸质实验报告,同时提交实验报告和代码的电子版。

    实现Bezier曲线的de Casteljau递推算法,能够对任意介于0和1之间的参数t计算Bezier曲线上的点,然后依次连接这些点生成Bezier曲线。要求:

    对[0,1]参数区间进行100等分。

    控制点的数目至少为5个,即Bezier曲线的次数不低于4次。

    de Casteljau算法用一个函数单独实现。

    绘制Bezier曲线的同时还要绘制其控制多边形。

    至少绘制两条Bezier曲线,具有不同的次数,颜色和曲线宽度。

    算法描述

    Bezier Curve(贝塞尔曲线)是应用于二维图形应用程序的 数学曲线。

    曲线定义:起始点、终止点、控制点。

    通过调整控制点,贝塞尔曲线的形状会发生变化。

     1962年,法国数学家Pierre Bezier第一个研究了这种 矢量绘制曲线的方法,并给出了详细的计算公式,因此按照这样的公式绘制出来的曲线就用他的姓氏来命名,称为贝塞尔曲线。

    以下公式中:B(t)为t时间下 点的坐标;P0为起点,Pn为终点,Pi为控制点。

    一阶贝塞尔曲线如下,意义由 P0 至 P1 的连续点, 描述的是一条线段:

    二阶贝塞尔曲线(抛物线:P1-P0为曲线在P0处的切线):

    原理:由 P0 至 P1 的连续点 Q0,描述一条线段。?

    由 P1 至 P2 的连续点 Q1,描述一条线段。?

    由 Q0 至 Q1 的连续点 B(t),描述一条二次贝塞尔曲线。

    4. 源程序代码

    #include<C:\Include\GL\glut.h>

    #include<stdlib.h>

    #include<math.h>

    GLsizei winWidth = 600, winHeight = 600;

    GLfloat xwcMin = -150.0, xwcMax = 150.0;

    GLfloat ywcMin = -300.0, ywcMax = 300.0;

    class wcPt3D{

    public:

    GLfloat x, y, z; };

    void init(){

    glClearColor(1.0, 1.0, 1.0, 1.0); }

    void plotPoint(wcPt3D bezCurevePt){

    glBegin(GL_POINTS);

    glVertex2f(bezCurevePt.x, bezCurevePt.y);

    glEnd(); }

    void binomiaCoeffs(GLint n, GLint * C){

    GLint k, j;

    for (k = 0; k <= n; k++)

    C[k] = 1;

    for (j = n; j >= k + 1; j--)

    C[k] *= j;

    for (j = n - k; j >= 2; j--)

    C[k] /= j; }

    void computeBezPt(GLfloat u, wcPt3D * bezPt, GLint nCtrlPts, wcPt3D *CtrlPts, GLint *C){

    GLint k, n = nCtrlPts - 1;

    GLfloat bezBlendFcn;

    bezPt->x = bezPt->y = bezPt->z = 0.0;

    for (k = 0; k<nCtrlPts; k++){

    bezBlendFcn = C[k] * pow(u, k) * pow(1 - u, n - k);

    bezPt->x += CtrlPts[k].x * bezBlendFcn;

    bezPt->y += CtrlPts[k].y * bezBlendFcn;

    bezPt->z += CtrlPts[k].z * bezBlendFcn; } }

    void bezier(wcPt3D * ctrlPts, GLint nCtrlPts, GLint nBezCurvePts){

    wcPt3D bezCurvePt;

    GLfloat u;

    GLint *C, k;

    C = new GLint[nCtrlPts];

    binomiaCoeffs(nCtrlPts - 1, C);

    for (k = 0; k <= nBezCurvePts; k++){

    u = GLfloat(k) / GLfloat(nBezCurvePts);

    computeBezPt(u, &bezCurvePt, nCtrlPts, ctrlPts, C);

    plotPoint(bezCurvePt); }

    delete[]C; }

    void displayFcn(void){

    GLint nCtrlPts = 5, nCtrlPts2 = 6, nBezCurvePts = 1000;

    wcPt3D ctrlPts[5] = { { -135.0, -59.0, 0.0 }, { -59.0, 95.0, 0.0 }, { 0.0, -40.0, 0.0 }, { 70.0, 120.0, 0.0 }, { 78, -125.0, 0.0 } };

    wcPt3D ctrlPts2[6] = { { -118.0, 20.0, 0.0 }, { -85.0, 45.0, 0.0 }, { -26.0, -126.0, 0.0 }, { 38.0, 88.0, 0.0 }, { 58.0, 188.0, 0.0 }, { 108.0, 98.0, 0.0 } }; glClear(GL_COLOR_BUFFER_BIT);

    glPointSize(6);

    glColor3f(0.0, 1.0, 1.0);

    bezier(ctrlPts, nCtrlPts, nBezCurvePts);

    glPointSize(5);

    glColor3f(1.0, 0.0, 1.0);

    bezier(ctrlPts2, nCtrlPts2, nBezCurvePts);

    glColor3f(0.0, 0.0, 1.0);

    glBegin(GL_LINES);

    glVertex2f(-135.0, -59.0);

    glVertex2f(-59.0, 95.0);

    glVertex2f(-59.0, 95.0);

    glVertex2f(0.0, -40.0);

    glVertex2f(0.0, -40.0);

    glVertex2f(70.0, 120.0);

    glVertex2f(70.0, 120.0);

    glVertex2f(78.0, -125.0);

    glVertex2f(-118.0, 20.0);

    glVertex2f(-85.0, 45.0);

    glVertex2f(-85.0, 45.0);

    glVertex2f(-26.0, -126.0);

    glVertex2f(-26.0, -126.0);

    glVertex2f(38.0, 88.0);

    glVertex2f(38.0, 88.0);

    glVertex2f(58.0, 188.0);

    glVertex2f(58.0, 188.0);

    glVertex2f(108.0, 98.0);

    glEnd();

    glFlush(); }

    void winReshapeFcn(GLint newWidth, GLint newHeight){

    glViewport(0, 0, newWidth, newHeight);

    glMatrixMode(GL_PROJECTION);

    glLoadIdentity();

    gluOrtho2D(xwcMin, xwcMax, ywcMin, ywcMax);

    glClear(GL_COLOR_BUFFER_BIT); }

    void main(int argc, char *argv[]){

    glutInit(&argc, argv);

    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);

    glutInitWindowPosition(50, 50);

    glutInitWindowSize(winWidth, winHeight);

    glutCreateWindow("yxl 实验四 Bezier曲线");

    init();

    glutDisplayFunc(displayFcn);

    glutReshapeFunc(winReshapeFcn);

    glutMainLoop(); }

    5. 实验结果

    实验体会

    最后一次实验报告了,老师要求我们做Bezier曲线,需要我们对函数去理解的一次实验,对于数学比较差的我来说还是很有困难的,理解起来比较吃力。

    说真的,这学期因为考研,上的一些课程都没有认真自己课下多做做,还是挺愧疚与遗憾的,毕竟像计算机图形学这些课程,还有虚拟现实技术等,都很实用的,信息技术领域很是热门,之后有时间了一定要好好再学习这些课,感谢老师的讲解。

    • 下载文档
    • 收藏
    • 0

    • 考试时间
    • 范文大全
    • 作文大全
    • 课程
    • 试题
    • 招聘
    • 文档大全

    推荐访问