机械版CG 实验5 Bezier曲线

CG实验指导九 Bezier曲线

1.实验目的:

了解曲线的生成原理,掌握几种常见的曲线生成算法,利用VC+OpenGL实现Bezier曲线生成算法。

2.实验内容:

(1) 结合示范代码了解曲线生成原理与算法实现,尤其是Bezier曲线;

(2) 调试、编译、修改示范程序。

(3) 尝试实现B样条曲线算法。

3.实验原理:

Bezier曲线是通过一组多边形折线的顶点来定义的。如果折线的顶点固定不变,则由其定义的Bezier曲线是唯一的。在折线的各顶点中,只有第一点和最后一点在曲线上且作为曲线的起始处和终止处,其他的点用于控制曲线的形状及阶次。曲线的形状趋向于多边形折线的形状,要修改曲线,只要修改折线的各顶点就可以了。因此,多边形折线又称Bezier曲线的控制多边形,其顶点称为控制点。

三次多项式,有四个控制点,其数学表示如下:

4.实验代码:

#include <GL/glut.h>

#include <stdio.h>

#include <stdlib.h>

#include <vector>

using namespace std;

struct Point {

int x, y;

};

Point pt[4], bz[11];

vector<Point> vpt;

bool bDraw;

int nInput;

void CalcBZPoints()

{

float a0,a1,a2,a3,b0,b1,b2,b3;

a0=pt[0].x;

a1=-3*pt[0].x+3*pt[1].x;

a2=3*pt[0].x-6*pt[1].x+3*pt[2].x;

a3=-pt[0].x+3*pt[1].x-3*pt[2].x+pt[3].x;

b0=pt[0].y;

b1=-3*pt[0].y+3*pt[1].y;

b2=3*pt[0].y-6*pt[1].y+3*pt[2].y;

b3=-pt[0].y+3*pt[1].y-3*pt[2].y+pt[3].y;

float t = 0;

float dt = 0.01;

for(int i = 0; t<1.1; t+=0.1, i++)

       {

bz[i].x = a0+a1*t+a2*t*t+a3*t*t*t;

bz[i].y = b0+b1*t+b2*t*t+b3*t*t*t;           

       }

}

void ControlPoint(vector<Point> vpt)

{

glPointSize(2);

for(int i=0; i<vpt.size(); i++)

       {

glBegin (GL_POINTS);

glColor3f (1.0f, 0.0f, 0.0f);   glVertex2i (vpt[i].x,vpt[i].y);

glEnd ();

       }

}

void PolylineGL(Point *pt, int num)

{

glBegin (GL_LINE_STRIP);

for(int i=0;i<num;i++)

       {           

glColor3f (1.0f, 1.0f, 1.0f);  

glVertex2i (pt[i].x,pt[i].y);           

       }

glEnd ();

}

void myDisplay()

{

glClear(GL_COLOR_BUFFER_BIT);

glColor3f (1.0f, 1.0f, 1.0f);

if (vpt.size() > 0) {

ControlPoint(vpt);

       }

if(bDraw)

       {

PolylineGL(pt, 4);

CalcBZPoints();

PolylineGL(bz, 11);

       }

glFlush();

}

void Init()

{

glClearColor(0.0, 0.0, 0.0, 0.0);

glShadeModel(GL_SMOOTH);

printf("Please Click left button of mouse to input control point of Bezier Curve!"n");

}

void Reshape(int w, int h)

{

glViewport(0, 0, (GLsizei) w, (GLsizei) h);

glMatrixMode(GL_PROJECTION);

glLoadIdentity();

gluOrtho2D(0.0, (GLdouble) w, 0.0, (GLdouble) h);

}

void mouse(int button, int state, int x, int y)

{

switch (button)

       {

case GLUT_LEFT_BUTTON:

if (state == GLUT_DOWN)

              {

if (nInput == 0)

                     {

pt[0].x = x;

pt[0].y = 480 - y;

nInput = 1;

vpt.clear();

vpt.push_back(pt[0]);

bDraw = false;

glutPostRedisplay();//

                     }

else if (nInput == 1)

                     {

pt[1].x = x;

pt[1].y = 480 - y;

vpt.push_back(pt[1]);

nInput = 2;

glutPostRedisplay();//

                     }    

else if (nInput == 2)

                     {

pt[2].x = x;

pt[2].y = 480 - y;

vpt.push_back(pt[2]);

nInput = 3;

glutPostRedisplay();//

                     }

else if (nInput == 3)

                     {

pt[3].x = x;

pt[3].y = 480 - y;

bDraw = true;

vpt.push_back(pt[3]);

nInput = 0;

glutPostRedisplay();//

                     }

              }

break;

default:

break;

       }

}

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

{

glutInit(&argc, argv);

glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);

glutInitWindowPosition(100, 100);

glutInitWindowSize(640, 480);

glutCreateWindow("Hello World!");

Init();

glutDisplayFunc(myDisplay);

glutReshapeFunc(Reshape);

glutMouseFunc(mouse);

glutMainLoop();

return 0;

}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏AI深度学习求索

CAM实践:基于pytorch的使用方法

注意:如果为了快一点,不使用网络的图片以及文件的话,记得更改图片地址和已下载文件地址哦

51750
来自专栏专知

【前沿】TensorFlow Pytorch Keras代码实现深度学习大神Hinton NIPS2017 Capsule论文

【导读】10月26日,深度学习元老Hinton的NIPS2017 Capsule论文《Dynamic Routing Between Capsules》终于在a...

43460
来自专栏Felix的技术分享

jpeg编码学习笔记

33760
来自专栏IT派

如何用200行Python代码换张脸

在这篇文章中我将介绍如何写一个简短(200行)的 Python 脚本,来自动地将一幅图片的脸替换为另一幅图片的脸。

13820
来自专栏人工智能LeadAI

解析Tensorflow官方PTB模型的demo

01 seq2seq代码案例解读 RNN 模型作为一个可以学习时间序列的模型被认为是深度学习中比较重要的一类模型。在Tensorflow的官方教程中,有两个与...

52280
来自专栏机器之心

教程 | 如何在Tensorflow.js中处理MNIST图像数据

对任何一个机器学习问题而言,数据处理都是很重要的一步。本文将采用 Tensorflow.js(0.11.1)的 MNIST 样例(https://github....

14930
来自专栏点滴积累

geotrellis使用(十六)使用缓冲区分析的方式解决投影变换中边缘数据值计算的问题

Geotrellis系列文章链接地址http://www.cnblogs.com/shoufengwei/p/5619419.html 目录 前言 问题探索 ...

35840
来自专栏专知

【专知国庆特刊-PyTorch手把手深度学习教程系列01】一文带你入门优雅的PyTorch

【导读】主题链路知识是我们专知的核心功能之一,为用户提供AI领域系统性的知识学习服务,一站式学习人工智能的知识,包含人工智能( 机器学习、自然语言处理、计算机视...

1.2K80
来自专栏WOLFRAM

版本 11.1 的新功能概要

11730
来自专栏人工智能LeadAI

宠物狗图片分类之迁移学习代码笔记

本文主要是总结之前零零散散抽出时间做的百度西交大狗狗图片分类竞赛题目 竞赛.目前本人已经彻底排到了50名后面,,,也没有想到什么办法去调优,并且平时也忙没时间再...

11110

扫码关注云+社区

领取腾讯云代金券