计算机图形学中点画圆实验

计算机图形学中点画圆实验
计算机图形学中点画圆实验

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

2016年春季学期

实验:中点画圆

实验时间:2016年12月8日

实验地点:信息学院2204

实验目的:中点画圆

程序代码:#include

void init (void)

{

glClearColor (1.0, 1.0, 1.0, 0.0);

glMatrixMode (GL_PROJECTION);

gluOrtho2D (0.0, 200.0, 0.0, 150.0);

}

class screenPt

{

private:

GLint x, y;

public:

screenPt ( ) {

x = y = 0;

}

void setCoords (GLint xCoordValue, GLint yCoordValue) { x = xCoordValue;

y = yCoordValue;

}

GLint getx ( ) const {

return x;

}

GLint gety ( ) const {

return y;

}

void incrementx ( ) {

x++;

}

void decrementy ( ) {

y--;

}

};

void setPixel (GLint xCoord, GLint yCoord) {

glBegin (GL_POINTS);

glVertex2i (xCoord, yCoord);

glEnd ( );

}

void circleMidpoint (GLint xc, GLint yc, GLint radius) {

screenPt circPt;

GLint p = 1 - radius;

circPt.setCoords (0, radius);

void circlePlotPoints (GLint, GLint, screenPt);

circlePlotPoints (xc, yc, circPt);

while (circPt.getx ( ) < circPt.gety ( )) {

circPt.incrementx ( );

if (p < 0)

p += 2 * circPt.getx ( ) + 1;

else {

circPt.decrementy ( );

p += 2 * (circPt.getx ( ) - circPt.gety ( )) + 1;

}

circlePlotPoints (xc, yc, circPt);

}

}

void circlePlotPoints (GLint xc, GLint yc, screenPt circPt) {

setPixel (xc + circPt.getx ( ), yc + circPt.gety ( ));

setPixel (xc - circPt.getx ( ), yc + circPt.gety ( ));

setPixel (xc + circPt.getx ( ), yc - circPt.gety ( ));

setPixel (xc - circPt.getx ( ), yc - circPt.gety ( ));

setPixel (xc + circPt.gety ( ), yc + circPt.getx ( ));

setPixel (xc - circPt.gety ( ), yc + circPt.getx ( ));

setPixel (xc + circPt.gety ( ), yc - circPt.getx ( ));

setPixel (xc - circPt.gety ( ), yc - circPt.getx ( ));

}

void displaymiddlepoint(void)

{

glClear(GL_COLOR_BUFFER_BIT);

glColor3f(1.0,0.0,0.0);

//glBegin(GL_LINES);

circleMidpoint(0,0,100);

glEnd();

glFlush();}

void main(int argc,char** argv)

{glutInit(&argc,argv);

glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); glutInitWindowPosition(50,100);

glutInitWindowSize(400,300);

glutCreateWindow("An example opengl program");

init();

glutDisplayFunc(displaymiddlepoint);

glutMainLoop();}

实验结果:

计算机图形学实验一

实验一二维基本图元的生成与填充 实验目的 1.了解并掌握二维基本图元的生成算法与填充算法。 2.实现直线生成的DDA算法、中点算法和Bresenham算法。 3.实现圆和椭圆生成的DDA和中点算法, 对几种算法的优缺点有感性认识。 二.实验内容和要求 1.选择自己熟悉的任何编程语言, 建议使用VC++。 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对话框中,接受默认选项,单击“下一个”按钮。

计算机图形学实验报告 (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)掌握VC++绘图的一般步骤; (2)掌握OpenGL软件包的安装方法; (3)掌握OpenGL绘图的一般步骤; (4)掌握OpenGL的主要功能与基本语法。 二、实验内容 1、VC++绘图实验 (1)实验内容:以下是绘制金刚石图案。已给出VC++参考程序,但里面有部分错误,请改正,实现以下图案。 N=3 N=4

N=5 N=10 N=30

N=50 (2)参考程序 //自定义的一个类 //此代码可以放在视图类的实现文件(.cpp) 里class CP2 { public: CP2(); virtual ~CP2(); CP2(double,double); double x; double y; }; CP2::CP2() { this->x=0.0; this->y=0.0; } CP2::~CP2() { } CP2::CP2(double x0,double y0) { this->x=x0; this->y=y0; }

//视图类的一个成员函数,这个成员函数可以放在OnDraw函数里调用。 //在视图类的头文件(.h)里定义此函数 void Diamond(); //在视图类的实现文件(.cpp)里实现此函数 void CTestView::Diamond() { CP2 *P; int N; double R; R=300; N=10; P=new CP2[N]; CClientDC dc(this); CRect Rect; GetClientRect(&Rect); double theta; theta=2*PI/N; for(int i=0;i #include #include #include //定义输出窗口的大小 #define WINDOW_HEIGHT 300

计算机图形学正负法画圆

计算机图形学试验报告(六) 试验名称:利用正负法画圆 专业:地理信息系统班级:2011级1班学号:********姓名:日期:2013年 一、试验内容 1、利用中点法思想编写函数; 2、利用算法生成圆; 3、完成属性设置和增加交互功能; 二、试验目的 通过上机操作,编写中点法生成圆,理解重点算法的生成原理,并实现简单的交互功能。 三、试验原理 中点法生成圆,是利用函数曲线的交点与两个像素的中点的位置关系,来确定下一像素点的选取,决策变量d的初始值为d=d=5.0/4-r; 当点(x,y)在圆内时,d<0;当点在圆外时,d>0;当点在圆上时,d=0。根据判别变量F的正负,可设定x,y的移动方向,然后利用映射变换生成整个圆。 四、程序设计流程

五、试验程序 (1) #include “graphics.h” #include “conio.h” void MidpointCircle(x0,y0,r,color) { int x,y; float d; x=0; y=r; d=5.0/4-r; //设置初始变量d while(x<=y) { //结束判断 putdot(x0,y0,x,y,color); if(d<0) d+=x*2.0+3; //更新判别变量 else { d+=2.0*(x-y)+5; y--; //点在圆外,向下走一个单位} x++; } } putdot(x0,y0,x,y,color) { putpixel(x0+x,y0+y,color); putpixel(x0+x,y0-y,color); putpixel(x0-x,y0+y,color); putpixel(x0-x,y0-y,color); putpixel(x0+y,y0+x,color);

计算机图形学实验报告,DOC

欢迎共阅

目录

实验一直线的DDA算法 一、【实验目的】 1.掌握DDA算法的基本原理。 2.掌握 3. 1.利用 2.加强对 四 { glClearColor(1.0f,1.0f,1.0f,1.0f); glMatrixMode(GL_PROJECTION); gluOrtho2D(0.0,200.0,0.0,150.0); } voidDDALine(intx0,inty0,intx1,inty1) { glColor3f(1.0,0.0,0.0); intdx,dy,epsl,k; floatx,y,xIncre,yIncre; dx=x1-x0;dy=y1-y0;

x=x0;y=y0; if(abs(dx)>abs(dy))epsl=abs(dx); elseepsl=abs(dy); xIncre=(float)dx/(float)epsl; yIncre=(float)dy/(float)epsl; for(k=0;k<=epsl;k++) { glPointSize(3); glBegin(GL_POINTS); glEnd(); } } { } { } { glutInitWindowSize(400,300); glutInitWindowPosition(100,120); glutCreateWindow("line"); Initial(); glutDisplayFunc(Display); glutReshapeFunc(winReshapeFcn); glutMainLoop(); return0; }

计算机图形学实验指导书1

佛山科学技术学院计算机图形学实验指导书 李晓东编 电信学院计算机系 2011年11月

实验1 直线段的扫描转换 实验类型:设计性 实验类别:专业实验 实验目的 1.通过实验,进一步理解直线段扫描转换的DDA算法、中点bresenham算法及 bresenham算法的基本原理; 2.掌握以上算法生成直线段的基本过程; 3.通过编程,会在C/C++环境下完成用DDA算法、中点bresenham算法及 bresenham算法对任意直线段的扫描转换。 实验设备及实验环境 计算机(每人一台) VC++6.0或其他C/C++语言程序设计环境 实验学时:2学时 实验内容 用DDA算法中点bresenham算法及bresenham算法实现任意给定两点的直线段的绘制(直线宽度和线型可自定)。 实验步骤: 1、复习有关算法的基本原理,明确实验目的和要求; 2、依据算法思想,绘制程序流程图; 3、设计程序界面,要求操作方便; 4、用C/C++语言编写源程序并调试、执行; 5、分析实验结果 6、对程序设计过程中出现的问题进行分析与总结; 7、打印源程序或把源程序以文件的形式提交; 8、按格式要求完成实验报告。 实验报告要求: 1、各种算法的基本原理; 2、各算法的流程图 3、实验结果及分析(比较三种算法的特点,界面插图并注明实验条件) 4、实验总结(含问题分析及解决方法)

实验2 圆的扫描转换 实验类型:设计性 实验类别:专业实验 实验目的 1、通过实验,进一步理解和掌握中点bresenham画圆算法的基本原理; 2、掌握以上算法生成圆和圆弧的基本过程; 3、掌握在C/C++环境下完成用中点bresenham算法圆或圆弧的绘制方法。实验设备及实验环境 计算机(每人一台) VC++6.0或其他C/C++语言程序设计环境 实验学时:2学时 实验内容 用中点(Besenham)算法实现圆或圆弧的绘制。 实验步骤 1.复习有关圆的生成算法,明确实验目的和要求; 2.依据算法思想,绘制程序流程图(注意圆弧生成时的输入条件); 3.设计程序界面,要求操作方便; 4.用C/C++语言编写源程序并调试、执行; 5.分析实验结果 6.对程序设计过程中出现的问题进行分析与总结; 7.打印源程序或把源程序以文件的形式提交; 8.按格式要求完成实验报告。 实验报告要求: 1.分析算法的工作原理; 2.画出算法的流程图 3.实验结果及分析(比较圆与圆弧生成算法的不同) 4.实验总结(含问题分析及解决方法)

圆的认识与画圆练习

圆的认识与画圆练习 教学内容:青岛版数学六年级上册56~59页,信息窗1第2课时。 教学目标: 1.进一步体会圆的特征;熟练掌握圆的各部分名称,能灵活、正确地按要求画圆,用圆的知识来解释生活中的简单现象;认识扇形,知道扇形的大小与圆心角的关系。 2.在画圆练习中,发展学生的空间观念。 3.经历对圆的认识知识的整理梳理,培养学生归纳、概括能力。 4.培养学生独立思考及综合运用知识解决问题的能力。 教学重点和难点: 教学重点:进一步体会圆的特征,熟练的按要求画圆。 教学难点:归纳圆的特征,发展空间观念,应用所学知识解决生活中的实际问题。 教具、学具: 教师准备:多媒体课件、圆规、三角板。 学生准备:圆规、三角板。 教学过程: 一、问题回顾,再现新知。 1.谈话导入:同学们,还记得上节课我们学习交通中的圆吗?说一说你对圆都有哪些了解?(引导学生回顾有关圆的知识。) 预设: (1)圆的画法; (2)圆的各部分名称; (3)圆的特征; (4)圆是轴对称图形。…… 2.自主整理圆的知识。 请同学们用自己喜欢的方法整理有关圆的知识。 教师出示复习指导:

(1)我们是用什么工具画圆的?说一说是怎样画的? (2)什么是圆心、半径、直径?用哪个字母表示? (3)同一个圆里半径和直径有什么关系? (4)圆是轴对称图形吗?有多少条对称轴? (5)什么是扇形,扇形的大小与什么有关? 3.汇报交流,构建知识网络。 学生汇报,其他生认真倾听及时补充,教师根据学生的回答将知识点适当板书,形成知识网。 (1)用图钉、细线和铅笔画圆。 圆的画法:(2)用圆形的盖子。①圆规两脚分开定好两脚尖距离; (3)用圆规画圆②把有针尖的一脚固定在一点上; ③把有铅笔的一脚旋转一周。 圆圆心:圆规针尖固定一点叫圆心,用O表示。 的圆的各半径:连接圆心和圆上任意一点的线段叫半径用r表示。 部分名称直径:通过圆心并且两端都在圆上的线段叫直径d表示。 认 识(1)同一个圆里有无数条半径和直径; 圆的特征:所有的直径都相等,所有的半径都相等; 直径是半径的2倍d=2r,半径是直径的r=d/2 (2)圆是轴对称图形,直径所在的直线都是圆的对称轴。 4.小结评价:看来大家掌握的不错,今天我们就来利用圆的知识解决一些实际问题。(板书课题:圆的认识与画圆练习) 二、分层练习,巩固提高。 (一)基本练习,巩固新知。 1.判断:(补充练习) (1)圆有无数条对称轴。() (2)圆的直径就是圆的对称轴。()

计算机图形学实验三报告

计算机科学与通信工程学院 实验报告 课程计算机图形学 实验题目二维图形变换 学生姓名 学号 专业班级 指导教师 日期

成绩评定表

二维图形变换 1. 实验内容 完成对北极星图案的缩放、平移、旋转、对称等二维变换。 提示:首先要建好图示的北极星图案的数据模型(顶点表、边表)。另外,可重复调用“清屏”和“暂停”等函数,使整个变换过程具有动态效果。 2. 实验环境 软硬件运行环境:Windows XP 开发工具:visual studio 2008 3. 问题分析

4. 算法设计 程序框架: //DiamondView.h class CDiamondView : public CView { …… public: //参数输入和提示对话框 void Polaris();//北极星 …… }; //DiamondView.cpp void CDiamondView::OnMenuDiamond() { IsCutting = FALSE; if(dlgDiamond.DoModal()==IDOK) DrawDiamond(dlgDiamond.m_nVertex,dlgDiamond.

m_nRadius,100);//调用绘制金刚石的函数 } //北极星 void CDiamondView::Polaris() {......} 5. 源代码 //北极星 void hzbjx(CDC* pDC,long x[18],long y[18]) { CPen newPen1,*oldPen; newPen1.CreatePen(PS_SOLID,2,RGB(255,0,0)); oldPen = pDC->SelectObject(&newPen1); POINT vertex1[11]={{x[1],y[1]},{x[2],y[2]},{x[3],y[3]},{x[4],y[4]},{x[5],y[5]},{x[3],y[3]},{x[1],y[1]}, {x[6],y[6]},{x[3],y[3]},{x[7],y[7]},{x[5],y[5]}}; pDC->Polyline(vertex1, 11); newPen1.DeleteObject(); newPen1.CreatePen(PS_SOLID, 2, RGB(0,255,0)); oldPen = pDC->SelectObject(&newPen1); POINT vertex2[5]={{x[6],y[6]},{x[8],y[8]},{x[9],y[9]},{x[3],y[3]},{x[8],y[8]}}; pDC->Polyline(vertex2, 5); POINT vertex3[5]={{x[4],y[4]},{x[10],y[10]},{x[11],y[11]},{x[3],y[3]},{x[10],y[10]}}; pDC->Polyline(vertex3, 5);

计算机图形学画圆实验报告

洛阳理工学院实验报告用纸

(2)画理想圆流程图如图-1: 图-1:画理想圆流程图 (3)中点画圆法 图-2 中点画圆法当前象素与下一象素的候选者

数,将乘法运算改成加法运算,即仅用整数实现中点画圆法。 (4)Bresenham画圆法 Bresenham画线法与中点画线法相似,,它通过每列象素中确定与理想直线最近的象素来进行直线的扫描的转换的。通过各行,各列的象素中心构造一组虚拟网格线的交点,然后确定该列象素中与此交点最近的的象素。该算法的巧妙之处在于可以采用增量计算,使得对于每一列,只要检查一个误差项的符号,就可以确定该列的所求对象。 假设x列的象素已确定,其行下标为y。那么下一个象素的列坐标必为x+1。而行坐标要么不变,要么递增1。是否递增1取决于如图所示的误差项d的值。因为直线的起始点在象素中心,所以误差项d的初始值为0。X下标每增加1,d的值相应递增直线的斜率值,即d=d+k(k=y/x为直线斜率)。一旦d>=1时,就把它减去,这样保证d始终在0、1之间。当d>0.5时,直线与x+1垂直网络线交点最接近于当前象素(x,y)的右上方象素(x+1,y+1);而当d<0.5时,更接近于象素(x+1,y),当d=0。5时,与上述二象素一样接近,约定取(x+1,y+1)。令e=d-0。5。则当e>=0时,下一象素的y下标增加1,而当e〈0时,下一象素的y下标不增。E的初始值为-0.5. (二)实验设计 画填充点流程图,如图-3: 图-3:圆的像素填充过程NS图 画理想圆,记录圆心坐标,计算半径大小,并记录 是否开始填充 否 是 初始化计数器、标志变量,设置最大计数值 调用Bresenha m画圆算法 否 是 填充标记是否为真 (While)计数变量小于最大计数值 循环变量temp + 1 填充计算出来的temp个坐 标点 计算需要填充坐标数组的 前temp个坐标

计算机图形学实验二

实验报告 课程名称:计算机图形学 实验项目:区域填充算法 实验仪器:计算机 系别:计算机学院 专业:计算机科学与技术 班级姓名:计科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 直线的绘制 实验目的 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 ;

计算机图形学-画椭圆和圆

计算机图形学实验 圆、椭圆的中点算法 学院:计算机科学与技术学院专业:软件工程 班级:软工152 学号:08 学生姓名:刘强坤

姓名刘强坤学号408 实验组实验时间10-24 指导教师成绩实验项目名称圆,椭圆中点算法 实 验要求优化后的算法:二次差分法可任意指定圆心坐标 实 验 目 的 实 验 环 境 VS 2015 实验内容圆: void Bresenham_Circle( int xc, int yc, int r) ( int x, y, d; x = 0; y = r; d = 3 - 2 * r; glVertex2i(x + xc, y + yc); while (x < y) ( if (d < 0) ( d = d + 4 * x + 6; ) else ( d = d + 4 * (x - y) + 10; 学院:计算机科学与技术专业:软件工程班级:软工152

y--; ) x++; glVertex2i(x + xc, y + yc); glVertex2i(y + xc, x + yc); glVertex2i(y + xc, -x + yc); glVertex2i(x + xc, -y + yc); glVertex2i(-x + xc, -y + yc); glVertex2i(-y + xc, -x + yc); glVertex2i(-x + xc, y + yc); glVertex2i(-y + xc, x + yc); ) ) 椭圆: void Ellipsepot( int x0, int y0, int x, int y) ( //1 setPixel(( x0 + x), ( y0 + y)); // 2 setPixel(( x0 + x), ( y0 - y)); // 3 setPixel(( x0 - x), ( y0 - y)); // 4 setPixel(( x0 - x), ( y0 + y)); ) //中点画椭圆算法 void MidPoint_Ellipse( int x0, int y0, int a, int b) ( double sqa = a*a; double sqb = b*b; double d = sqb + sqa*(0.25 - b); int x = 0; int y = b; Ellipsepot( x0, y0, x, y); // 1 while (sqb*(x + 1) < sqa*(y - 0.5)) ( if (d < 0) ( d += sqb*(2 * x + 3);

计算机图形学上机实验指导

计算机图形学上机实验指导 指导教师:张加万老师 助教:张怡 2009-10-10

目录 1.计算机图形学实验(一) – OPENGL基础 ..................................... - 1 - 1.1综述 (1) 1.2在VC中新建项目 (1) 1.3一个O PEN GL的例子及说明 (1) 2.计算机图形学实验(二) – OPENGL变换 ..................................... - 5 - 2.1变换 (5) 3.计算机图形学实验(三) - 画线、画圆算法的实现....................... - 9 - 3.1MFC简介 (9) 3.2VC6的界面 (10) 3.3示例的说明 (11) 4.计算机图形学实验(四)- 高级OPENGL实验...................... - 14 - 4.1光照效果 (14) 4.2雾化处理 (16) 5.计算机图形学实验(五)- 高级OPENGL实验........................ - 20 - 5.1纹理映射 (20) 5.2反走样 (24) 6.计算机图形学实验(六) – OPENGL IN MS-WINDOWS .......... - 27 - 6.1 实验目标: (27) 6.2分形 (28)

1.计算机图形学实验(一) – OpenGL基础 1.1综述 这次试验的目的主要是使大家初步熟悉OpenGL这一图形系统的用法,编程平台是Visual C++,它对OpenGL提供了完备的支持。 OpenGL提供了一系列的辅助函数,用于简化Windows操作系统的窗口操作,使我们能把注意力集中到图形编程上,这次试验的程序就采用这些辅助函数。 本次实验不涉及面向对象编程,不涉及MFC。 1.2在VC中新建项目 1.2.1新建一个项目 选择菜单File中的New选项,弹出一个分页的对话框,选中页Projects中的Win32 Console Application项,然后填入你自己的Project name,如Test,回车即可。VC为你创建一个工作区(WorkSpace),你的项目Test就放在这个工作区里。 1.2.2为项目添加文件 为了使用OpenGL,我们需要在项目中加入三个相关的Lib文件:glu32.lib、glaux.lib、opengl32.lib,这三个文件位于c:\program files\microsoft visual studio\vc98\lib目录中。 选中菜单Project->Add To Project->Files项(或用鼠标右键),把这三个文件加入项目,在FileView中会有显示。这三个文件请务必加入,否则编译时会出错。或者将这三个文件名添加到Project->Setting->Link->Object/library Modules 即可。 点击工具条中New Text File按钮,新建一个文本文件,存盘为Test.c作为你的源程序文件,再把它加入到项目中,然后就可以开始编程了。 1.3一个OpenGL的例子及说明 1.3.1源程序 请将下面的程序写入源文件Test.c,这个程序很简单,只是在屏幕上画两根线。 #include

圆的画法

圆的画法 教学目标: 1. 培养学生自主画圆的能力,让学生经历用自己的方法画圆,按要求用圆规画圆的过程。 2. 让学生掌握用圆规按要求画圆的方法,认识圆的大小和半径的关系。 3. 让学生积极参加动手画圆活动,获得成功的学习体验,发展初步的空间观念。 教学重点: 掌握用圆规按要求画圆的方法。 教学难点: 掌握用圆规按要求画圆的方法。 课前准备: 多媒体课件、圆规、直尺一把、剪刀一把、白纸一张。 教学过程: 一、谈话导入 (一)师:在上一节课,我们已经认识圆, 同学们会不会画圆?这节课我们就一起去学习 怎么样画圆。(板书课题:画圆) 二、自主画圆 (一)讨论:可以怎样画?再利用自己准备好的物品画圆。 (二)交流:交流自己画出的圆,并说一说是怎样画的。

三、用圆规画圆 (一)师说:前面我们借助实物来描摹画圆,画出圆的大小是固定的,不能随意变化。为了既准确又方便地画出一个圆,我们可以用画圆的专用工具——圆规来画。 1.下面同学们先用圆规试画一个圆,然后与同桌的同学说说你是怎样画的? 2.找两名学生说说如何画圆。 3.归纳画圆的步骤。(画圆的步骤归纳起来,有三步。) (1)把圆规的两脚分开,定好两脚间的距离作为半径。(板书:定半径) (2)把有针尖的一只脚固定在一点上作为圆心。(板书:定圆心)(3)让装有铅笔尖的一只脚旋转一周。(板书:旋转一周) 4.请同学按要求画圆。(下面请同学们按照这三个步骤画出要求的圆。) (1)用圆规画一个半径是2cm 的圆,并用字母O、r、d 表示出它的圆心、半径和直径。从上节课学习的知识过渡到这节课学习的新知识,揭示课题。让学生自主画圆,培养学生动手能力和自主探究能力。巩固学生掌握用圆规按要求画圆的方法。 (2)用圆规画一个半径是4cm 的圆。 5.在画圆时要注意什么?(有针尖的一只脚不能动,两脚间的距离不能变。) 6.刚才我们画出两个位置和大小都不同的圆,想一想:圆的位置

计算机图形学实验报告

《计算机图形学》实验报告姓名:郭子玉 学号: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; }

计算机图形学实验报告

计算机图形学 实验报告 姓名:谢云飞 学号:20112497 班级:计算机科学与技术11-2班实验地点:逸夫楼507 实验时间:2014.03

实验1直线的生成 1实验目的和要求 理解直线生成的原理;掌握典型直线生成算法;掌握步处理、分析 实验数据的能力; 编程实现DDA算法、Bresenham中点算法;对于给定起点和终点的 直线,分别调用DDA算法和Bresenham中点算法进行批量绘制,并记 录两种算法的绘制时间;利用excel等数据分析软件,将试验结果编 制成表格,并绘制折线图比较两种算法的性能。 2实验环境和工具 开发环境:Visual C++ 6.0 实验平台:Experiment_Frame_One(自制平台)。 本实验提供名为 Experiment_Frame_One的平台,该平台提供基本 绘制、设置、输入功能,学生在此基础上实现DDA算法和Mid_Bresenham 算法,并进行分析。 ?平台界面:如错误!未找到引用源。所示 ?设置:通过view->setting菜单进入,如错误!未找到引 用源。所示 ?输入:通过view->input…菜单进入.如错误!未找到引用 源。所示 ?实现算法: ◆DDA算法:void CExperiment_Frame_OneView::DDA(int X0, int Y0, int X1, int Y1) Mid_Bresenham法:void CExperiment_Frame_OneView::Mid_Bresenham(int X0, int Y0, int X1, int Y1)

3实验结果 3.1程序流程图 1)DDA算法流程图:开始 定义两点坐标差dx,dy,以及epsl,计数k=0,描绘点坐标x,y,x增 量xIncre,y增量yIncre ↓ 输入两点坐标x1,y1,x0,y0 ↓ dx=x1-x0,dy=y1-y0; _________↓_________ ↓↓ 若|dx|>|dy| 反之 epsl=|dx| epsl=|dy| ↓________...________↓ ↓ xIncre=dx/epsl; yIncre=dy/epsl ↓ 填充(强制整形)(x+0.5,y+0.5); ↓←←←← 横坐标x+xIncre; 纵坐标y+yIncre; ↓↑ 若k<=epsl →→→k++ ↓ 结束 2)Mid_Bresenham算法流程图开始 ↓ 定义整形dx,dy,判断值d,以及UpIncre,DownIncre,填充点x,y ↓ 输入x0,y0,x1,y1 ______↓______ ↓↓ 若x0>x1 反之 x=x1;x1=x0;x0=x; x=x0;

画圆的方法

一、画圆的方法: 1、用手指画圆。以大拇指为圆心,以食指与大拇指之间的距离为半径,旋转一周所形成的图形就是圆形。 2、用线绳、图钉和笔画圆。用图钉固定线绳的一端做圆心,将笔系在线绳的另一端,拉直绳子作半径,旋转线绳一周所形成的图形就是圆。 3、用圆规画圆。将圆规的一个针脚固定在本上做圆心,用圆规两个针脚间的距离作半径,旋转圆规一周所形成的图形就是圆。 4、用物体的圆形面画圆。按住物体的圆形面,用笔在物体的圆形面的圆周上画一圈所形成的图形就是一个圆。 二、为什么车轮都是圆形的? 答:因为在同一个圆中所有的半径都相等。车轴在圆心的位置,圆形车轮在滚动时,圆心在一条直线上运动,这样车才更平稳。而其他的图形不具备这样的特点,所以车轮都是圆形的。 三、井盖为什么是圆形的? 答:因为在圆形中,直径是圆中最长的线段,在同一个圆内有无数条直径,所有的直径都相等,无论怎样翻转井盖,井盖都不会掉下去,这样更安全。 四、围观时大家为什么自觉的就站成圆形? 答:因为圆中同一个圆中所有的半径都相等。围成圆形时,每一个围观的人与被围观的事物之间的距离都是相等的,所有站成圆形能让每个人看清楚围观的事物。 五、寻找圆直径的方法。 1、圆形的纸片等一切可以对折的圆形,用对折的方法找到圆的直径。 2、可以用两个三角板和一个直尺来找圆的的直径。(如图1-1所示) 1-1 1-2 1-3 AB之间的线段的长度就是圆的直径。 3、画出圆的外接正方形,正方形的边长就是圆的直径。(如图1-2所示) 4、量出圆的周长,用圆的周长除以3.14也可以得到圆的直径的长度。 5、画出圆中的一条弦,找到弦的中点,过中点画这条弦的垂线,圆周上这两点间的线段就是圆的直径。(如图1-3所示) 六、圆周长的测量方法。 1、滚动法。画出圆的一条直径,在直尺上滚动圆一周,从直径的一个端点和直尺的零刻度线重合开始向前滚动直到再次滚动到起始的端点为止。此时的读数就是这个圆的周长。 2、绳测法。用绳绕圆片一周,剪去多余的绳子,量出绳子的长度就是这个圆片的周长。

计算机图形学实验一_画直线

大学实验报告 学院:计算机科学与技术专业:计算机科学与技术班级:计科131

如果 d<0,则M在理想直线下方,选右上方P1点; 如果 d=0,则M在理想直线上,选P1/ P2点。 由于d是xi和yi的线性函数,可采用增量计算提高运算效率。 1.如由pi点确定在是正右方P2点(d>0).,则新的中点M仅在x方向加1,新的d值为: d new=F(xi+2,yi+0.5)=a(xi+2)+b(yi+0.5)+c 而 d old=F(xi+1,yi+0.5)=a(xi+1)+b(yi+0.5)+c d new=d old+a= d old-dy 2.如由pi点确定是右上方P1点(d<0),则新的中点M在x和y方向都增加1,新的d值为 d new=F(xi+2,yi+1.5)=a(xi+2)+b(yi+1.5)+c 而 d old=F(xi+1,yi+0.5)=a(xi+1)+b(yi+0.5)+c d new=d old+a+b= d old-dy+dx 在每一步中,根据前一次第二迭中计算出的d值的符号,在正右方和右上方的两个点中进行选择。d的初始值: d0=F(x0+1,y0+0.5)=F(x0,y0)+a+b/2=a+b/2=-dy+dx/2 F(x0,y0)=0,(x0,y0)在直线上。 为了消除d的分数,重新定义 F(x,y)=2(ax+by+c) 则每一步需要计算的d new 是简单的整数加法 dy=y1-y0,dx=x1-x0 d0=-2dy+dx d new=d old-2*dy,当 d old>=0 d new=d old-2(dy-dx),当d old<0 Bresenham画线算法 算法原理: 与DDA算法 相似,Bresenham 画线算法也要在 每列象素中找到 与理想直线最逼 近的象素点。 根据直线的 斜率来确定变量 在x或y方向递 增一个单位。另 一个方向y或x

计算机图形学-设计算法绘制直线与圆

信息与计算科学专业基础课 Computer Report Of course 计算机图形学课程实验 报告 实验题目设计算法绘制直线与圆 班级 姓名 学号 指导教师 日期

实验说明 试验目的: 掌握直线和圆的基本生成算法思想,并上机编程实现相应的算法。 试验地点: 教九楼401 数学系机房 实验要求(Direction): 1. 每个学生单独完成;2.开发语言为TurboC 或C++,也可使用其它语言;3.请在自己的实验报告上写明姓名、学号、班级;4.每次交的实验报告内容包括:题目、试验目的和意义、程序制作步骤、主程序、运行结果图以及参考文件;5. 自己保留一份可执行程序,考试前统一检查和上交。 实验内容 实验题一 实验题目 1).用DDA 法在屏幕上画一条具有三个像素宽的直线段L1。要求:(1)直线段L1的两个端点坐标和画线颜色都要求可以随机输入;(2)要求输出直线段L1上的各点坐标;(3)画出直线的同时要求标明两端点坐标。 2).将课堂所讲的斜率01、-1

相关文档
最新文档