当前位置:文档之家› 实验1 OpenGL图形编程入门

实验1 OpenGL图形编程入门

实验1 OpenGL图形编程入门
实验1 OpenGL图形编程入门

实验一 OpenGL图形编程入门

一、实验目的

1、了解和掌握OpenGL的安装;

2、掌握一个简单的基于OpenGL的C++程序结构;

3.掌握win32程序框架;

4、掌握OpenGL中若干基本图形的绘制。

二、实验环境

硬件要求:

PC机,主流配置,最好为独立显卡,显存512M以上。

软件环境:

操作系统:Windows 7/Windows8

语言开发工具:Microsoft Visual studio 2010,Visual C++。

程序框架:

win32应用程序

三、实验内容与要求

●要求:实验所有步骤所生成的效果截图拷贝到实验报告文档里备查,并附上相应的代

码。 WORD文档命名方式:学号姓名-实验序号-实验名称。

●内容:

1、准备好OpenGL库文件

●Glut32.dll 路径 %system root%\ SysWOW64

●Glut32.lib in PATH\lib

●Glut.h in PATH\Include

●system root为windows7或windows8安装路径

●path为 Visual studio 2010的安装路径

2、建立一个工程文件,并运行样本程序my_first_program.cpp,观看结果。

(1)启动Microsoft Visual studio 2010,在菜单栏中点击“文件”选项,选择“新建”“项目”。如图1-1.

图1-1 新建项目

(2)在新建项目的窗口中选择“Visual C++的Win32项目”,然后输入项目名称(例如lab1_basis),选择项目的保存位置(或者使用默认保存路径),单击“确定”。如图1-2所示。

图1-2 Win32项目

(3) 将工程文件中Sources Files中的C++源文件(lab1_basis.cpp)替换成以下样本程序:

图1-3 替换成样本程序

//样本程序My_first_program.cpp

#include"stdafx.h"

#include

void display(void)

{

glClearColor(0.0f, 0.0f, 0.0f, 1.0f); //设置清屏颜色

glClear(GL_COLOR_BUFFER_BIT); //刷新颜色缓冲区;

glFlush(); //用于刷新命令队列和缓冲区,使所有尚未被执行的OpenGL命令得到执行;

}

int APIENTRY _tWinMain(HINSTANCE hInstance,

HINSTANCE hPrevInstance,

LPTSTR lpCmdLine,

int nCmdShow)

{

UNREFERENCED_PARAMETER(hPrevInstance);

UNREFERENCED_PARAMETER(lpCmdLine);

char *argv[] = {"hello ", " "};

int argc = 2; // must/should match the number of strings in argv

glutInit(&argc, argv); //初始化GLUT库;

glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); //设置显示模式;(缓冲,颜色类型)

glutInitWindowSize(500, 500); //绘图窗口大小

glutInitWindowPosition(1024 / 2 - 250, 768 / 2 - 250); //窗口左上角在屏幕的位置

glutCreateWindow("hello"); //创建窗口,标题为“hello”;

glutDisplayFunc(display); //用于绘制当前窗口;

glutMainLoop(); //表示开始运行程序,用于程序的结尾;

return 0;

}

运行结果:

创建一个名称是“hello”的窗口。如图1-4所示。

图1-4 Hello窗口

2、认真阅读以上样本程序,理解每个函数的作用,并修改窗口标题,显示为“我的第一个

OpenGL程序”。运行结果:如图1-5所示。

图1-5 我的第一个OpenGL程序

3、窗口的设置。

在默认情况下,窗口的位置出现在屏幕的左上角,默认大小为300*300。

要求:

(1)修改窗口位置,使之处于屏幕正中央;

(2)将窗口大小改为整个屏幕大小;

(3)修改窗口大小为其他尺寸。

参考函数:

glutInitWindowPosition(int x, int y);

//为窗口指定初始位置,窗口左上角在屏幕上的位置为(x,y)

//如果不写该函数,或者glutInitWindowPosition(0,0);均表示窗口的位置出现在屏幕的左上角

glutInitWindowSize(int width, int height); //设置窗口大小

//如果不写该函数,表示窗口的大小为默认大小300*300

4、背景色的设置。

在默认情况下背景色是黑色。

要求:

(1)将窗口背景设置为白色,如图1-6所示。

(2)将窗口背景设置为其他颜色,如图1-7所示。

参考函数:

glClearColor(r,g,b,alpha);//设置背景颜色,此函数放在display()中,

并且放在glClear(GL_COLOR_BUFFER_BIT);

语句的前面。

其中r,g,b取值范围是[0,1],可以是浮点数,alpha取值范围为0~1,在这里其值不起作用,以后再讨论该参数。

例如glClearColor (0,0,0,0)为黑色背景,glClearColor3f(1,1,1,0)为白色背景,其他颜色应该如何设置?

图1-6 白背景图1-7 红背景

5、基本图形绘制。

绘制函数一般放置在清屏语句

glClear(GL_COLOR_BUFFER_BIT); //刷新颜色缓冲区;

和刷新语句之间

glFlush(); //用于刷新命令队列和缓冲区,使所有尚未被执行的OpenGL命令得到执行;

例如矩形绘制

(1)在display绘图函数的glClear(GL_COLOR_BUFFER_BIT);语句后面增加glRectf(0,0,1,1);运行程序查看效果,如图1-8所示。

图1-8 矩形绘制图1-9 矩形坐标改变

(2)修改矩形的对角坐标,看看什么变化和问题。如图1-9所示。

(3)根据给出的函数,试画出直线和三角形等基本图形。

例如,绘制直线

glBegin(GL_LINES);

glVertex2f(0,0);

glVertex2f(0.8,0.8);

glEnd();

//画三角,x1,y1,x2,y2和x3,y3为三角形顶点坐标

glBegin(GL_TRIANGLES);

glVertex2f(0,0);

glVertex2f(0.5,0.5);

glVertex2f(0.0,0.8);

glEnd();

图形分别如图1-10和图1-11所示。

图1-10 直线绘制图1-11 三角形绘制

6、绘图色的设置。

(1)将绘制的图形修改成红色。如图1-12所示。

(2)将绘制的不同基本图元设为不同的颜色。如图1-13所示。

参考函数:

glColor3f(r,g,b); //设置绘图色r,g,b,取值范围:[0,1],可以为浮点数。

例如

glColor3f(1,0,0);//为绘图红色

glColor3f(0,1,0);//为绘图绿色

glColor3f(0,0,1);//为绘图蓝色

其它绘图颜色应如何设置?

图1-12 红色矩形图1-13 三角形绘制

7、绘制几何图形

1)更改标题栏,加上学号姓名

2)绘制基本2个以上几何形状:矩形、三角形。。。

3)要求三种颜色

四、问答与思考题

1、默认的窗口位置在屏幕的什么位置?如果要改变窗口在屏幕的位置应该如何处理?如何改变窗口的大小?

2.在本次实验中默认的绘图坐标原点在窗口中的什么位置?

3.如何修改背景颜色和绘图颜色?绘制颜色的顺序与位置有什么要求?

4、#include 在此句中,头文件glut.h放在哪个文件夹下了?

5、图形函数的顺序与位置有什么要求?试改变程序中一些图形函数的顺序看运行结果是否有变化。

五、函数参考

1。 glutInitWindowPosition(int x, int y); //为即将创建的窗口指定初始位置,窗口左上角在屏幕上的位置为(x,y)

2. glutInitWindowSize(int width, int height); //设置窗口大小

3。 glClearColor(r,g,b,alpha); //设置清屏颜色

4。. glColor3f(r,g,b); //设置绘图色

r,g,b,alpha取值范围:0~1之间,可以为浮点数

基本图元绘制函数参考

5。 glRectf(x1,y1,x2,y2), 画矩形,x1,y1和x2,y2分别为矩形对角线顶点坐标

6。glBegin(GL_LINES); //画线命令,x1,y1和x2,y2分别为直线段端点坐标

glVertex2f(x1,y1);

glVertex2f(x2,y2);

glEnd();

7。glBegin(GL_TRIANGLES); //画三角形命令,x1,y1,x2,y2和x3,y3分别为三角形顶点坐标

glVertex2f(x1,y1);

glVertex2f(x2,y2);

glVertex2f(x3,y3);

glEnd();

六、实验演示录像

1)win32程序演示 :lab1-win32 project.exe

实验七 图形与多媒体处理

实验七图形与多媒体处理 【开发语言及实现平台或实验环境】 Windows2000 或XP,JDK1.6与MyEclispe6.5 【实验目的】 1.熟悉图形、图像的使用方法, 2.理解计算机动画的原理和Java 的多线程处理机制,能够编写Applet 中使用的动画。 【实验要求】 1.掌握使用图形类Graphics 画出不同图形的方法。 2.掌握在容器中输入图像、播放音乐的方法。 3.理解计算机动画原理,掌握图形双缓冲技术,能够设计计算机动画。 4.理解多线程机制,掌握线程的使用方法。 【实验内容】 一.使用图形类Graphics 在Java 中基本图形包括点、线、圆、矩形等,是构成复杂图形的基础。绘制基本图形要使用AWT包中的Graphics 类,它提供了各种基本图形的绘制方法,可以直接引用这些方法画点、线、圆、矩形等。1.创建在Applet 上画出不同的图形的程序 (1)程序功能:在Applet 上使用不同的颜色画出直线、圆、方块、圆弧等图形。 (2)编写LX7_1.java 程序文件,源代码如下。 import java.applet.Applet; import java.awt.Graphics; import java.awt.Color;

public class LX7_1 extends Applet { public void paint(Graphics g) { g.drawLine(10,10,50,10);//画线(确定两点) g.setColor(Color.red);//设置红颜色 g.drawOval(35,35,100,60);//画椭圆(圆心、宽和高) g.fillOval(200,15,60,100);//画具有填充色的圆 g.setColor(Color.blue);//设置蓝颜色 g.drawRect(20,130,80,80);//画矩形 g.fillRect(120,130,80,80);//画具有填充色的矩形 g.drawRoundRect(220,130,80,80,20,20);//画圆角矩形 g.fillRoundRect(320,130,80,80,20,20);//画具有填充色的圆角矩形 g.setColor(new Color(255,255,0)); //设置黄颜色 g.drawArc (250,20,100,100,0,90); g.fillArc (380,20,100,100,90,90); g.fillArc (300,25,100,100,180,90); g.drawArc (330,25,100,100,0,-90); } } (3)编译程序LX7_1.java。 (4)编写显示LX7_1.class 的页面文件,在浏览器中显示结果如图7.1 所示

计算机图形学实验一

实验一二维基本图元的生成与填充 实验目的 1.了解并掌握二维基本图元的生成算法与填充算法。 2.实现直线生成的DDA算法、中点算法和Bresenham算法。 3.实现圆和椭圆生成的DDA和中点算法, 对几种算法的优缺点有感性认识。 二.实验内容和要求 1.选择自己熟悉的任何编程语言, 建议使用VC++6.0。 2.创建良好的用户界面,包括菜单,参数输入区域和图形显示区域。 3.实现生成直线的DDA算法、中点算法和Bresenham算法。 4.实现圆弧生成的中点算法。 5.实现多边形生成的常用算法, 如扫描线算法,边缘填充算法。 6.实现一般连通区域的基于扫描线的种子填充算法。 7.将生成算法以菜单或按钮形式集成到用户界面上。 8.直线与圆的坐标参数可以用鼠标或键盘输入。 6. 可以实现任何情形的直线和圆的生成。 实验报告 1.用户界面的设计思想和框图。 2.各种实现算法的算法思想。 3.算法验证例子。 4.上交源程序。 直线生成程序设计的步骤如下: 为编程实现上述算法,本程序利用最基本的绘制元素(如点、直线等),绘制图形。如图1-1所示,为程序运行主界面,通过选择菜单及下拉菜单的各功能项分别完成各种对应算法的图形绘制。 图1-1 基本图形生成的程序运行界面 2.创建工程名称为“基本图形的生成”单文档应用程序框架

(1)启动VC,选择“文件”|“新建”菜单命令,并在弹出的新建对话框中单击“工程”标签。 (2)选择MFC AppWizard(exe),在“工程名称”编辑框中输入“基本图形的生成”作为工程名称,单击“确定”按钮,出现Step 1对话框。 (3)选择“单个文档”选项,单击“下一个”按钮,出现Step 2对话框。 (4)接受默认选项,单击“下一个”按钮,在出现的Step 3~Step 5对话框中,接受默认选项,单击“下一个”按钮。 (5)在Step 6对话框中单击“完成”按钮,即完成“基本图形的生成”应用程序的所有选项,随后出现工程信息对话框(记录以上步骤各选项选择情况),如图1-2所示,单击“确定”按钮,完成应用程序框架的创建。 图1-2 信息程序基本 3.编辑菜单资源 设计如图1-1所示的菜单项。在工作区的ResourceView标签中,单击Menu项左边“+”,然后双击其子项IDR_MAINFRAME,并根据表1-1中的定义编辑菜单资源。此时VC已自动建好程序框架,如图1-2所示。 表1-1菜单资源表 菜单标题菜单项标题标示符ID 直线DDA算法生成直线ID_DDALINE Bresenham算法生成直线ID_BRESENHAMLINE 中点算法生成直线ID_MIDPOINTLINE 4.添加消息处理函数 利用ClassWizard(建立类向导)为应用程序添加与菜单项相关的消息处理函数,ClassName栏中选择CMyView,根据表1-2建立如下的消息映射函数,ClassWizard会自动完成有关的函数声明。 表1-2菜单项的消息处理函数 菜单项ID消息消息处理函数ID_DDALINE CONMMAN OnDdaline

matlab图像处理实验报告

图像处理实验报告 姓名:陈琼暖 班级:07计科一班 学号:20070810104

目录: 实验一:灰度图像处理 (3) 实验二:灰度图像增强 (5) 实验三:二值图像处理 (8) 实验四:图像变换 (13) 大实验:车牌检测 (15)

实验一:灰度图像处理题目:直方图与灰度均衡 基本要求: (1) BMP灰度图像读取、显示、保存; (2)编程实现得出灰度图像的直方图; (3)实现灰度均衡算法. 实验过程: 1、BMP灰度图像读取、显示、保存; ?图像的读写与显示操作:用imread( )读取图像。 ?图像显示于屏幕:imshow( ) 。 ?

2、编程实现得出灰度图像的直方图; 3、实现灰度均衡算法; ?直方图均衡化可用histeq( )函数实现。 ?imhist(I) 显示直方图。直方图中bin的数目有图像的类型决定。如果I是个灰度图像,imhist将 使用默认值256个bins。如果I是一个二值图像,imhist使用两bins。 实验总结: Matlab 语言是一种简洁,可读性较强的高效率编程软件,通过运用图像处理工具箱中的有关函数,就可以对原图像进行简单的处理。 通过比较灰度原图和经均衡化后的图形可见图像变得清晰,均衡化后的直方图形状比原直方图的形状更理想。

实验二:灰度图像增强 题目:图像平滑与锐化 基本要求: (1)使用邻域平均法实现平滑运算; (2)使用中值滤波实现平滑运算; (3)使用拉普拉斯算子实现锐化运算. 实验过程: 1、 使用邻域平均法实现平滑运算; 步骤:对图像添加噪声,对带噪声的图像数据进行平滑处理; ? 对图像添加噪声 J = imnoise(I,type,parameters)

(完整版)Matlab实验7图形绘制

实验7:图形绘制 一、实验目的 1、 掌握绘制二维图形的常用函数。 2、 掌握绘制三维图形的常用函数。 3、 掌握绘制图形的辅助操作。 二、实验内容 1、 已知2*13),2cos(2,12 y y y x y x y ===,完成下列操作: (1) 在同一坐标系下用不同的颜色和线型绘制三条曲线。 %homework_7_1_1.m x=0:pi/100:2*pi; y1=x.*x; y2=cos(2*x); y3=y1.*y2; plot(x,y1,'r--',x,y2,'k:',x,y3,'b-.'); (2) 以子图形式绘制三条曲线。 %homework_7_1_2.m x=0:pi/100:2*pi; y1=x.*x; y2=cos(2*x); y3=y1.*y2; subplot(2, 2, 1); plot(x,y1,'r--'); subplot(2, 2, 2); plot(x,y2,'k:'); subplot(2, 2, 3); plot(x,y3,'b-.'); (3) 分别用条形图、阶梯图、杆图和填充图绘制三条曲线。 %homework_7_1_3.m %ì?D?í??¢?×ìYí??¢??í?oíì?3?í? x=0:pi/100:2*pi; y1=x.*x; y2=cos(2*x); y3=y1.*y2; %μúò?DD subplot(4, 3, 1); bar(x,y1,'r'); subplot(4, 3, 2); bar(x,y2,'k'); subplot(4, 3, 3); bar(x,y3,'b'); %μú?tDD

stairs(x,y1,'r'); subplot(4, 3, 5); stairs(x,y2,'k'); subplot(4, 3, 6); stairs(x,y3,'b'); %μúèyDD subplot(4, 3, 7); stem(x,y1,'r'); subplot(4, 3, 8); stem(x,y2,'k'); subplot(4, 3, 9); stem(x,y3,'b'); %μú??DD subplot(4, 3, 10); fill(x,y1,'r'); subplot(4, 3, 11); fill(x,y2,'k'); subplot(4, 3, 12); fill(x,y3,'b'); 2、 绘制极坐标曲线)sin(θρn b a +=,并分析参数a ,b ,n 对曲线形状的影响。 %homework_7_2.m function homework_7_2(a,b,n) theta=0:0.01:2*pi; rho=a.*sin(b+n.*theta); polar(theta,rho,'k'); %homework_7_2_tiao.m % a μ?ó°?ì subplot(3, 4, 1); homework_7_2(1,1,1) subplot(3, 4, 2); homework_7_2(2,1,1) subplot(3, 4, 3); homework_7_2(3,1,1) subplot(3, 4, 4); homework_7_2(4,1,1) % b μ?ó°?ì subplot(3, 4, 1); homework_7_2(1,1,1) subplot(3, 4, 2); homework_7_2(1,2,1) subplot(3, 4, 3); homework_7_2(1,3,1)

信息技术四年级下册绘制图形很便捷教案

教案 课题:在Word中《绘制图形很便捷》 教材分析:本课主要是让学生学会使用绘图工具栏上的工具绘制简的图形。 教学目标: 学会运用绘图工具栏绘制简单的图形。 学会对图形进行移动、缩放、填色操作。 学会对图形进行组合和按正确的次序叠放。 教学重点:学会运用绘图工具栏绘制简单的图形。 教学难点:对图形进行移动、缩放、填色操作。 对图形进行组合和按正确的次序叠放。 教学方法:讲解法、指导法、练习法 教学手段:多媒体教室上机 一、导入 (教师展示Word绘制的图片)同学们,你们看老师的这个Word文档,上面的图片漂不漂亮?这是我自己绘制的,那么也就是说Word也能够绘制图片,这节课就让我们来共同学习如何用Word绘制简单的图形。 二、讲授新课 (一)认识绘图工具栏 师:要想在Word中绘制图形,我们首先需要就是绘图工具,在Word中,绘制图形所需要的工具,可以在绘图工具栏里找到,我们利用绘图工具栏上的

绘图工具按钮,可以很容易的画出直线、矩形、正方形、椭圆、圆等图形,把这些图形巧妙地组合起来,再配上适当的颜色,也能画出很漂亮的图画。 绘图工具栏平时不显示,我们怎么做绘画工具栏才会出现呢?(边说边做)方法: (1)单击菜单栏上的视图,打开“视图(V)”菜单,将鼠标指针反映向“视图”菜单中的工具栏(T)命令,弹出工具栏子菜单,其中列出了Word2000提供的所有工具栏。要显示某个工具栏,只需单击它的栏目名,使其栏名前出现√;反之,单击栏名前的√,使√消失,则可隐藏这个工具栏。 (2)单击常用工具栏上的“绘图”按钮,绘图工具栏就出现在窗中了。 (二)活动:绘制图形 1、范例 我们就从最简单的如何画一条直线讲起。希望同学们通过画一条直线,归纳出如何在Word2000中绘制图形。 如果要画一条直线,同学们考虑一下我们应该从绘图工具栏上选哪个绘图工具按钮(直线) 选择绘图工具按钮以后,我们考虑的就应该是在哪里绘制图形?把鼠标指针移到编辑区,观察鼠标指针形状的变化。当鼠标指针变成“+”形状。在编辑区中准备画线段的起始处按下左键拖动鼠标,拖到线段的终点处松开左键,一条线段就画出来了。

计算机图形学实验

实验1 直线的绘制 实验目的 1、通过实验,进一步理解和掌握DDA和Bresenham算法; 2、掌握以上算法生成直线段的基本过程; 3、通过编程,会在TC环境下完成用DDA或中点算法实现直线段的绘制。实验环境 计算机、Turbo C或其他C语言程序设计环境 实验学时 2学时,必做实验。 实验内容 用DDA算法或Besenham算法实现斜率k在0和1之间的直线段的绘制。 实验步骤 1、算法、原理清晰,有详细的设计步骤; 2、依据算法、步骤或程序流程图,用C语言编写源程序; 3、编辑源程序并进行调试; 4、进行运行测试,并结合情况进行调整; 5、对运行结果进行保存与分析; 6、把源程序以文件的形式提交; 7、按格式书写实验报告。 实验代码:DDA: # include # include

void DDALine(int x0,int y0,int x1,int y1,int color) { int dx,dy,epsl,k; float x,y,xIncre,yIncre; dx=x1-x0; dy=y1-y0; x=x0; y=y0; if(abs(dx)>abs(dy)) epsl=abs(dx); else epsl=abs(dy); xIncre=(float)dx/(float)epsl; yIncre=(float)dy/(float)epsl; for(k=0;k<=epsl;k++) { putpixel((int)(x+0.5),(int)(y+0.5),4); x+=xIncre; y+=yIncre; } } main(){ int gdriver ,gmode ;

东南大学数字图像处理实验报告

数字图像处理 实验报告 学号:04211734 姓名:付永钦 日期:2014/6/7 1.图像直方图统计 ①原理:灰度直方图是将数字图像的所有像素,按照灰度值的大小,统计其所出现的频度。 通常,灰度直方图的横坐标表示灰度值,纵坐标为半个像素个数,也可以采用某一灰度值的像素数占全图像素数的百分比作为纵坐标。 ②算法: clear all PS=imread('girl-grey1.jpg'); %读入JPG彩色图像文件figure(1);subplot(1,2,1);imshow(PS);title('原图像灰度图'); [m,n]=size(PS); %测量图像尺寸参数 GP=zeros(1,256); %预创建存放灰度出现概率的向量 for k=0:255 GP(k+1)=length(find(PS==k))/(m*n); %计算每级灰度出现的概率end figure(1);subplot(1,2,2);bar(0:255,GP,'g') %绘制直方图 axis([0 255 min(GP) max(GP)]); title('原图像直方图') xlabel('灰度值') ylabel('出现概率') ③处理结果:

原图像灰度图 100 200 0.005 0.010.0150.020.025 0.030.035 0.04原图像直方图 灰度值 出现概率 ④结果分析:由图可以看出,原图像的灰度直方图比较集中。 2. 图像的线性变换 ①原理:直方图均衡方法的基本原理是:对在图像中像素个数多的灰度值(即对画面起主 要作用的灰度值)进行展宽,而对像素个数少的灰度值(即对画面不起主要作用的灰度值)进行归并。从而达到清晰图像的目的。 ②算法: clear all %一,图像的预处理,读入彩色图像将其灰度化 PS=imread('girl-grey1.jpg'); figure(1);subplot(2,2,1);imshow(PS);title('原图像灰度图'); %二,绘制直方图 [m,n]=size(PS); %测量图像尺寸参数 GP=zeros(1,256); %预创建存放灰度出现概率的向量 for k=0:255

计算机图形学实验报告

《计算机图形学》实验报告姓名:郭子玉 学号:2012211632 班级:计算机12-2班 实验地点:逸夫楼507 实验时间:15.04.10 15.04.17

实验一 1 实验目的和要求 理解直线生成的原理;掌握典型直线生成算法;掌握步处理、分析实验数据的能力; 编程实现DDA 算法、Bresenham 中点算法;对于给定起点和终点的直线,分别调用DDA 算法和Bresenham 中点算法进行批量绘制,并记录两种算法的绘制时间;利用excel 等数据分析软件,将试验结果编制成表格,并绘制折线图比较两种算法的性能。 2 实验环境和工具 开发环境:Visual C++ 6.0 实验平台:Experiment_Frame_One (自制平台) 3 实验结果 3.1 程序流程图 (1)DDA 算法 是 否 否 是 是 开始 计算k ,b K<=1 x=x+1;y=y+k; 绘点 x<=X1 y<=Y1 绘点 y=y+1;x=x+1/k; 结束

(2)Mid_Bresenham 算法 是 否 否 是 是 是 否 是 否 开始 计算dx,dy dx>dy D=dx-2*dy 绘点 D<0 y=y+1;D = D + 2*dx - 2*dy; x=x+1; D = D - 2*dy; x=x+1; x

3.2程序代码 //-------------------------算法实现------------------------------// //绘制像素的函数DrawPixel(x, y); (1)DDA算法 void CExperiment_Frame_OneView::DDA(int X0, int Y0, int X1, int Y1) { //----------请实现DDA算法------------// float k, b; float d; k = float(Y1 - Y0)/float(X1 - X0); b = float(X1*Y0 - X0*Y1)/float(X1 - X0); if(fabs(k)<= 1) { if(X0 > X1) { int temp = X0; X0 = X1; X1 = temp; }

计算机图形学实验报告 (2)

中南大学信息科学与工程学院 实验报告实验名称 实验地点科技楼四楼 实验日期2014年6月 指导教师 学生班级 学生姓名 学生学号 提交日期2014年6月

实验一Window图形编程基础 一、实验类型:验证型实验 二、实验目的 1、熟练使用实验主要开发平台VC6.0; 2、掌握如何在编译平台下编辑、编译、连接和运行一个简单的Windows图形应用程序; 3、掌握Window图形编程的基本方法; 4、学会使用基本绘图函数和Window GDI对象; 三、实验内容 创建基于MFC的Single Document应用程序(Win32应用程序也可,同学们可根据自己的喜好决定),程序可以实现以下要求: 1、用户可以通过菜单选择绘图颜色; 2、用户点击菜单选择绘图形状时,能在视图中绘制指定形状的图形; 四、实验要求与指导 1、建立名为“颜色”的菜单,该菜单下有四个菜单项:红、绿、蓝、黄。用户通过点击不同的菜单项,可以选择不同的颜色进行绘图。 2、建立名为“绘图”的菜单,该菜单下有三个菜单项:直线、曲线、矩形 其中“曲线”项有级联菜单,包括:圆、椭圆。 3、用户通过点击“绘图”中不同的菜单项,弹出对话框,让用户输入绘图位置,在指定位置进行绘图。

五、实验结果: 六、实验主要代码 1、画直线:CClientDC *m_pDC;再在OnDraw函数里给变量初始化m_pDC=new CClientDC(this); 在OnDraw函数中添加: m_pDC=new CClientDC(this); m_pDC->MoveTo(10,10); m_pDC->LineTo(100,100); m_pDC->SetPixel(100,200,RGB(0,0,0)); m_pDC->TextOut(100,100); 2、画圆: void CMyCG::LineDDA2(int xa, int ya, int xb, int yb, CDC *pDC) { int dx = xb - xa; int dy = yb - ya; int Steps, k; float xIncrement,yIncrement; float x = xa,y= ya; if(abs(dx)>abs(dy))

《计算机图形学实验报告》

一、实验目的 1、掌握中点Bresenham直线扫描转换算法的思想。 2掌握边标志算法或有效边表算法进行多边形填充的基本设计思想。 3掌握透视投影变换的数学原理和三维坐标系中几何图形到二维图形的观察流程。 4掌握三维形体在计算机中的构造及表示方法 二、实验环境 Windows系统, VC6.0。 三、实验步骤 1、给定两个点的坐标P0(x0,y0),P1(x1,y1),使用中点Bresenham直线扫描转换算法画出连接两点的直线。 实验基本步骤 首先、使用MFC AppWizard(exe)向导生成一个单文档视图程序框架。 其次、使用中点Bresenham直线扫描转换算法实现自己的画线函数,函数原型可表示如下: void DrawLine(CDC *pDC, int p0x, int p0y, int p1x, int p1y); 在函数中,可通过调用CDC成员函数SetPixel来画出扫描转换过程中的每个点。 COLORREF SetPixel(int x, int y, COLORREF crColor ); 再次、找到文档视图程序框架视图类的OnDraw成员函数,调用DrawLine 函数画出不同斜率情况的直线,如下图:

最后、调试程序直至正确画出直线。 2、给定多边形的顶点的坐标P0(x0,y0),P1(x1,y1),P2(x2,y2),P3(x3,y3),P4(x4,y4)…使用边标志算法或有效边表算法进行多边形填充。 实验基本步骤 首先、使用MFC AppWizard(exe)向导生成一个单文档视图程序框架。 其次、实现边标志算法或有效边表算法函数,如下: void FillPolygon(CDC *pDC, int px[], int py[], int ptnumb); px:该数组用来表示每个顶点的x坐标 py :该数组用来表示每个顶点的y坐标 ptnumb:表示顶点个数 注意实现函数FillPolygon可以直接通过窗口的DC(设备描述符)来进行多边形填充,不需要使用帧缓冲存储。(边标志算法)首先用画线函数勾画出多边形,再针对每条扫描线,从左至右依次判断当前像素的颜色是否勾画的边界色,是就开始填充后面的像素直至再碰到边界像素。注意对顶点要做特殊处理。 通过调用GDI画点函数SetPixel来画出填充过程中的每个点。需要画线可以使用CDC的画线函数MoveTo和LineTo进行绘制,也可以使用实验一实现的画直线函数。 CPoint MoveTo(int x, int y ); BOOL LineTo(int x, int y ); 实现边标志算法算法需要获取某个点的当前颜色值,可以使用CDC的成员函数 COLORREF GetPixel(int x, int y ); 再次、找到文档视图程序框架视图类的OnDraw成员函数,调用FillPolygon 函数画出填充的多边形,如下: void CTestView::OnDraw(CDC* pDC) { CTestcoodtransDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc);

图像处理实验报告模板

桂林电子科技大学 实验报告 一、实验目的 1、掌握基本的图像处理方法,包括读取、写入、显示、剪切、运算以及快操作 等等。 2、掌握常用的图像变换方法,分析变换结果。 二、实验内容 编写程序,在Matlab下调试运行,并注意观察分析结果。 1、使用imread函数分别读入图象cameraman.tif 、canoe.tif,并使用subplot 和imshow函数进行显示。再使用imcrop对第一幅图片进行剪切,并保存成文件。 2、申明向量X和矩阵A,使用二维傅立叶变换和fftshift函数进行处理,观察向量和矩阵结果。 3、创建一个1000*1000的全0图像,其中选择某矩形区域设置其象素为1(350:649,475:524),对该二值图逆时针旋转45°角,比较旋转前后的图像和傅里叶变换频谱。 三、实验设备、环境 计算机 四、实验原理 1、图像平滑算法 (1) 简单平均法:

设某像素的灰度值为,迭加噪声后,一幅含噪声的图像可表示为 现取以为中心的邻域S ——NN 方形窗口,在S 域内进行局部平均,得 式中,N 的平方为窗口内像素总数。令 ,则 式中,加权函数 (2)中值滤波: 中值滤波是一种非线性的信号处理方法。中值滤波器在1971 年由J.w.Jukey 首先提出并应用在一维信号处理技术(时间序列分析)中,后来被二维图象信号处理技术所引用。中值滤波在一定的条件下可以克服线性滤波器如最小均方滤波、均直滤波等带来的图象细节模糊,而且对滤除脉冲干扰及图象扫描噪声最为有效。由于在实际运算过程中不需要图象的统计特征,因此这也带来不少方便。但是对于一些细节多,特别是点、线、尖顶细节多的图象不宜采用中值滤波。中值滤波一般采用一个含有奇数个点的滑动窗口,将窗口中各点灰度值的中值来替代值定点(一般是窗口的中心点)的灰度值。对于奇数个元素,中值是指按大小排序后,中间的数值;对于偶数个元素,中值是指排序后中间两个元素灰度值的平均值。 一般选用3*3或5*5窗口,形状可分为方形或十字形,如下图所示。 (a) 方形 (b) 十字形 图2-1 二维中值滤波窗口形状 二维中值滤波可表示为

实验七 图形、文本和位图

实验七图形、文本和位图 一实验内容 练习第7章的例Ex_Draw,Ex_Icon,Ex_Cursor 二实验步骤 例Ex_Draw课程的成绩分布直方图 1.创建工作文件夹Ex_Draw 2.在View类中添加一个成员函数DrawScore,用于根据成绩来绘制直方图,该函数代码 如下: void CEx_DrawView::DrawScore(CDC *pDC, float *fScore, int nNum) { int nScoreNum[]={0,0,0,0,0}; for(int i=0;iSelectObject(&brush1); CPen *oldPen=pDC->SelectObject(&pen); CRect rcSeg(rc); rcSeg.right=rcSeg.left+nSegWidth; CString strSeg[]={"<60","60-70","70-80","80-90",">=90"); CRect rcStr; for(i=0;i

12简单的图形绘制

沁县郭村中学校信息技术学科教师课时教案 年度 姓名张晓晨年级八时间月日教学环节教师活动学生活动设计意图 导入对比 图片 确认 目标 任务: 启动Flash cs 5.5,打开“素材\乡间小屋.fla”,与课文图1-2-1 对比,观察不同之处,讨论交流这些对象需要用哪些工具来完成。 1.启动Flash cs 5.5 2.列出不同之处 思考所用工具 发现任务 自主 完善 作品 任务:阅读课文按照操作提示完成实践。 提示:选择工具后,选项区域中“对象绘制”按下时图标为表 示绘制的是对象,弹起时,图标为表示绘制的是图形,这里 必须为后者,否则,在步骤6中,绘制蓝天白云时,就会出现遮 挡,看不到前面步骤绘制的内容。 自主完善发现困难 激发学习 的动力 演示讲述工具的使用方法刷 子 工 具 1.刷子工具,在舞台或对象上绘制填充颜色。单击中的颜色 方块,可以改变填充的颜色,单击弹出框右上角的可以打开系 统颜色对话框,改变颜色的色相饱和度;笔触颜色的改变方法相 同。在绘制对象钮按下,刷子模式选择标准绘图时,绘制的是对 象,框选时周围有蓝色线框。如果选择第二到第五种模式中的任 一种,绘制的是图形。后四种模式应在对象绘制钮弹起的情况下 使用。颜料绘画:只在有颜色的地方填充。后面绘画:在有颜色 的地方不填充,好像在后面绘画。颜料选择:用选择工具选择有 颜色的地方时,该模式在有颜色的地方涂上新的颜色。内不绘画: 如果从有颜色的部分的内部开始画,有颜色的地方涂上新的颜色, 如果从其外部开始画,反而在没有颜色的地方涂上颜色,有颜色 的地方涂不上颜色。 观看、练习讲授、观 察、练习相 结合 喷 涂 刷 工 具 2.喷涂刷工具:该工具在工具箱中没有属性设置,需打开属性面板 设置。在属性中选择喷涂的颜色,用于改变喷涂出的色点 的大小,当勾选“随机缩放”时,喷涂出的对象大小就不一样。 画笔:、,决定一次喷涂出的面积的大 小。喷涂刷还可以把原件作为对象进行喷涂。 观看、练习 课题 1.2简单的图形绘制课型共几课时 教学目标 知 识 与 技 能 1、掌握绘图基础知识; 2、掌握选择工具的使用,会选择单个或框选多个对象。 3、掌握线条工具、椭圆工具、矩形工具和刷子工具等绘图的使用; 4、能在选择工具后,在工具选项区或属性面板中设置工具的属性; 掌握图形修饰工具和查看工具的使用; 5、能利用颜色面板或属性面板设置工具的颜色属性。 6、能利用选择工具和功能键复制图形; 7、掌握任意变形工具的使用方法。 过程与方法在完善作品的过程中学习绘图工具属性、选项设置或颜色面板、属性面板的使用方法和图形的绘制。 情感态度 与价值观 通过实际操作体会Flash cs 5.5功能的强大和使用技巧,激发学生利用 艺术的方法呈现信息和表达思想感情,提高审美能力。 学习者特征分析农村中学初一年级学生,大部分从初一才开始学习信息技术,基础差,操作基础一般,在初一年级已经学习过Photoshop cs3,上节课又学了Flash CS5.5操作界面、熟悉了部分工具的使用方法。学生的学习兴趣很浓厚。 教学策略 选择与设计 讲授演示法,任务驱动学习法和协作学习法教学重点绘图工具的使用和图形修饰工具的使用 教学难点颜色面板中渐变色的设置

计算机图形学实验二

实验报告 课程名称:计算机图形学 实验项目:区域填充算法 实验仪器:计算机 系别:计算机学院 专业:计算机科学与技术 班级姓名:计科1602/ 学号:2016011 日期:2018-12-8 成绩: 指导教师:

一.实验目的(Objects) 1.实现多边形的扫描线填充算法。 二.实验内容 (Contents) 实现多边形的扫描线填充算法,通过鼠标,交互的画出一个多边形,然后利用种子填充算法,填充指定的区域。不能使用任何自带的填充区域函数,只能使用画点、画线函数或是直接对图像的某个像素进行赋值操作;

三.实验内容 (Your steps or codes, Results) //widget.cpp //2016CYY Cprogramming #include"widget.h" #include #include #include using namespace std; #define H 1080 #define W 1920 int click = 0; //端点数量 QPoint temp; QPoint first; int result = 1; //判断有没有结束 int sign = 1; //2为画线 int length = 5; struct edge { int ymax; float x; float dx; edge *next; }; edge edge_; QVector edges[H]; QVector points;//填充用 bool fin = false; QPoint *Queue = (QPoint *)malloc(length * sizeof(QPoint)); //存放端点的数组 Widget::Widget(QWidget *parent) : QWidget(parent) { } Widget::~Widget() { } void Widget::mouseMoveEvent(QMouseEvent *event) { setMouseTracking(true); if (click > 0 && result != 0) { startPt = temp; endPt =event->pos(); sign = 2; update(); } } void Widget::mouseReleaseEvent(QMouseEvent *event) { if (event->button() == Qt::LeftButton) { } else if (event->button() == Qt::RightButton) { sign = 2;

图像处理实验报告

实验报告 实验课程名称:数字图像处理 班级:学号:姓名: 注:1、每个实验中各项成绩按照10分制评定,每个实验成绩为两项总和20分。 2、平均成绩取三个实验平均成绩。 2016年 4 月18日

实验一 图像的二维离散傅立叶变换 一、实验目的 掌握图像的二维离散傅立叶变换以及性质 二、实验要求 1) 建立输入图像,在64?64的黑色图像矩阵的中心建立16?16的白色矩形图像点阵, 形成图像文件。对输入图像进行二维傅立叶变换,将原始图像及变换图像(三维、中心化)都显示于屏幕上。 2) 调整输入图像中白色矩形的位置,再进行变换,将原始图像及变换图像(三维、中 心化)都显示于屏幕上,比较变换结果。 3) 调整输入图像中白色矩形的尺寸(40?40,4?4),再进行变换,将原始图像及变 换图像(三维、中心化)都显示于屏幕上,比较变换结果。 三、实验仪器设备及软件 HP D538、MATLAB 四、实验原理 傅里叶变换作为分析数字图像的有利工具,因其可分离性、平移性、周期性和共轭对称性可以定量地方分析数字化系统,并且变换后的图像使得时间域和频域间的联系能够方便直观地解决许多问题。实验通过MATLAB 实验该项技能。 设),(y x f 是在空间域上等间隔采样得到的M ×N 的二维离散信号,x 和y 是离散实变量,u 和v 为离散频率变量,则二维离散傅里叶变换对一般地定义为 ∑∑ -=-=+-= 101 )],( 2ex p[),(1 ),(M x N y N yu M xu j y x f MN v u F π,1,0=u …,M-1;y=0,1,…N-1 ∑∑-=-=+=101 )],( 2ex p[),(),(M x N y N uy M ux j v u F y x f π ,1,0=x …,M-1;y=0,1,…N-1 在图像处理中,有事为了讨论上的方便,取M=N ,这样二维离散傅里叶变换对就定义为 ,]) (2ex p[),(1 ),(101 ∑∑ -=-=+- = N x N y N yu xu j y x f N v u F π 1,0,=v u …,N-1 ,]) (2ex p[ ),(1 ),(101 ∑∑-=-=+= N u N v N vy ux j v u F N y x f π 1,0,=y x ,…,N-1 其中,]/)(2exp[N yv xu j +-π是正变换核,]/)(2exp[N vy ux j +π是反变换核。将二维离散傅里叶变换的频谱的平方定义为),(y x f 的功率谱,记为 ),(),(|),(|),(222v u I v u R v u F v u P +== 功率谱反映了二维离散信号的能量在空间频率域上的分布情况。 五、实验步骤、程序及结果: 1、实验步骤: (1)、编写程序建立输入图像; (2)、对上述图像进行二维傅立叶变换,观察其频谱 (3)、改变输入图像中白框的位置,在进行二维傅里叶变换,观察频谱;

实验三 MATLAB绘图(含实验报告)

实验三 MATLAB 绘图 一、实验目的 1.掌握二维图形的绘制。 2.掌握图形的标注 3.了解三维曲线和曲面图形的绘制。 二、实验的设备及条件 计算机一台(带有MATLAB7.0以上的软件环境)。 设计提示 1.Matlab 允许在一个图形中画多条曲线:plot(x1,y1,x2,y2,……)指令绘制y 1 = f 1(x 1), y 2 = f 2 (x 2 )等多条曲线。Matlab 自动给这些曲线以不同颜色。标注可用text 函数。 2.绘图时可以考虑极坐标和直角坐标的转换。 3.三维曲线绘图函数为plot3,注意参考帮助中的示例。 三、实验内容 1.生成1×10 维的随机数向量a ,分别用红、黄、蓝、绿色绘出其连线图、杆图、阶梯图和条形图,并分别标出标题“连线图”、“杆图”、“阶梯图”、“条形图”。 2、绘制函数曲线,要求写出程序代码。 (1) 在区间[0:2π]均匀的取50个点,构成向量t (2) 在同一窗口绘制曲线y1=sin(2*t-0.3); y2=3cos(t+0.5);要求y1曲线为红色点划线,标记点为圆圈;y2为蓝色虚线,标记点为星号。 (3) 分别在靠近相应的曲线处标注其函数表达式。 3.将图形窗口分成两个绘图区域,分别绘制出函数: ???+-=+=1 35 22 21x x y x y 在[0,3]区间上的曲线,并利用axis 调整轴刻度纵坐标刻度,使1y 在[0,12]区间上,2y 在[-2,1.5]区间上。 4.用mesh 或surf 函数,绘制下面方程所表示的三维空间曲面,x 和y 的

取值范围设为[-3,3]。 10102 2y x z + -= 思考题: 1. 编写一个mcircle(r)函数,调用该函数时,根据给定的半径r ,以原点 为圆心,画一个如图所示的红色空心圆。(图例半径r=5);左图参考 polar 函数的用法,右图绘制圆形的参数方程为x=sin (t ),y=cos (t )。其中,t 的区间为0~2*pi ,步长为0.1。 2.(1)绘一个圆柱螺旋线(形似弹簧)图。圆柱截面直径为10,高度为5,每圈上升高度为1。如左图所示。 (2)利用(1)的结果,对程序做少许修改,得到如右图所示图形。

计算机图形学实验C++代码

一、bresenham算法画直线 #include #include #include void draw_pixel(int ix,int iy) { glBegin(GL_POINTS); glVertex2i(ix,iy); glEnd(); } void Bresenham(int x1,int y1,int xEnd,int yEnd) { int dx=abs(xEnd-x1),dy=abs(yEnd-y1); int p=2*dy-dx; int twoDy=2*dy,twoDyMinusDx=2*dy-2*dx; int x,y; if (x1>xEnd) { x=xEnd;y=yEnd; xEnd=x1; } else { x=x1; y=y1; } draw_pixel(x,y); while(x

} void myinit() { glClearColor(0.8,1.0,1.0,1.0); glColor3f(0.0,0.0,1.0); glPointSize(1.0); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0.0,500.0,0.0,500.0); } void main(int argc,char **argv ) { glutInit(&argc,argv); glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); glutInitWindowSize(500,500); glutInitWindowPosition(200.0,200.0); glutCreateWindow("CG_test_Bresenham_Line example"); glutDisplayFunc(display); myinit(); glutMainLoop(); } 二、中点法绘制椭圆 #include #include #include inline int round(const float a){return int (a+0.5);} void setPixel(GLint xCoord,GLint yCoord) { glBegin(GL_POINTS); glVertex2i(xCoord,yCoord); glEnd(); } void ellipseMidpoint(int xCenter,int yCenter,int Rx,int Ry) { int Rx2=Rx*Rx; int Ry2=Ry*Ry; int twoRx2=2*Rx2; int twoRy2=2*Ry2; int p; int x=0; int y=Ry; int px=0; int py=twoRx2*y; void ellipsePlotPoints(int,int,int,int);

相关主题
文本预览
相关文档 最新文档