画圆与凸多边形填充算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
华北水利水电大学 计算机图形学 实验报告 2017--2018学年 第一学期 2014级 计算机科学与技术 专业
指导老师 曹源昊 班级 2014157 学号 201415717 姓名 李卫朋
实验四、画圆与凸多边形填充算法
1. 实验目的
练习对Bezier 曲线的绘制和Bezier 曲线的de Casteljau 算法。
2. 实验内容和要求
按要求完成以下一个作业。提交纸质实验报告,同时提交实验报告和源代码的电子版。
实现Bezier 曲线的de Casteljau 递推算法,能够对任意介于0和1之间的参数t 计算Bezier 曲线上的点,然后把Bezier 曲线绘制成首尾相连的直线段。
要求:
(1). 对[0,1]参数区间进行100等分。
(2). 控制点的数目至少为5个,即Bezier 曲线的次数不低于4次。
(3). 同时绘制控制多边形。
(4). 至少绘制两条Bezier 曲线,具有不同的次数,颜色和曲线宽度。 形如:
3. 算法描述
使用vs2012编译环境,使用OpenGL 进行绘图操作。
4. 源程序代码 // 实验4.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include
#include
#include
GLfloat ctrlPoints[5][2] =
{
{ -0.8f, 0.1f }, {-0.4f, 0.6f }, { 0.0f, 0.8f }, { 0.5f, 0.2f },{0.9f,0.7f}
}; 1P 2P 3P 4
P 5P
void myDisplay(void){
glClear(GL_COLOR_BUFFER_BIT);
glPointSize(3);
glColor3f(1.0, 0.0, 0.0);
int i = 0;
for ( i = 0; i < 5; i++){
glBegin(GL_POINTS);
glVertex2fv(&ctrlPoints[i][0]);
glEnd();
}
glColor3f(0.0, 0.0, 1.0);
glBegin(GL_LINE_STRIP);
for ( i = 0; i < 5; i++){
glVertex2fv(&ctrlPoints[i][0]);
}
glEnd();
float xarray[11];
float yarray[11];
int n = 5;//number
GLfloat ps[11][2];
int u = 0;
for(double t = 0.0;t<=1;t+=0.1)
{
for ( i = 1; i < n; ++i)
{
for (int j = 0; j < n - i; ++j)
{
if (i == 1) // i==1时,第一次迭代,由已知控制点计算
{
xarray[j] = ctrlPoints[j][0] * (1 - t) + ctrlPoints[j+1][0] * t;
yarray[j] = ctrlPoints[j][1] * (1 - t) + ctrlPoints[j + 1][1] * t;
continue;
}
// i != 1时,通过上一次迭代的结果计算
xarray[j] = xarray[j] * (1 - t) + xarray[j + 1] * t;
yarray[j] = yarray[j] * (1 - t) + yarray[j + 1] * t;
}
}
ps[u][0] = xarray[0];
ps[u][1] = yarray[0];
u++;
}
glColor3f(0.0, 1.0, 0.0);
glBegin(GL_LINE_STRIP);
for ( i = 0; i < 11; i++)
{
glVertex2fv(ps[i]);
}
glEnd();
glFlush();
}
int main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
glutInitWindowPosition(100, 100);
glutInitWindowSize(400, 400);
glutCreateWindow("Bezier曲线");
glClearColor(1.0, 1.0, 1.0, 1.0);
glutDisplayFunc(&myDisplay);
glutMainLoop();
return 0;
}
5. 实验结果