计算机图形学--圆的的生成算法的实现

计算机图形学--圆的的生成算法的实现
计算机图形学--圆的的生成算法的实现

计算机图形学--圆的的生成算法的实现

实验三:圆的的生成算法的实现

班级08信计2班学号20080502063 姓名李宁分数

一、实验目的与要求:

1、了解WIN-TC1.72等编程环境中常用控件命令与绘图函数,初步掌

握在实验设

计集成环境下进行图形处理程序的设计方法。

2、熟练掌握圆的两种换算法:基于正负算法画圆和基于中点算法画圆。

、二、实验内容:

1、在WIN-TC1.72环境中设计程序,利用消息处理函数,搭建能运行

图形算法程

序的平台。

2、根据教材中给定的算法,实现圆的两种生成算法:基于中点算法画圆和基于

正负算法

三、实验结果分析:

1、实验程序

(1)基于中点算法画圆程序实现的完整源程序

#include

#include

// 中点画圆法

void Circle_Midpoint(int x, int y, int r, int color)

{

int tx = 0, ty = r, d = 1 - r;

while(tx <= ty)

{

// 利用圆的八分对称性画点

putpixel(x + tx, y + ty, color);

putpixel(x + tx, y - ty, color);

putpixel(x - tx, y + ty, color);

putpixel(x - tx, y - ty, color);

putpixel(x + ty, y + tx, color);

putpixel(x + ty, y - tx, color);

putpixel(x - ty, y + tx, color);

putpixel(x - ty, y - tx, color);

if(d < 0)

d += 2 * tx + 3;

else

d += 2 * (tx - ty) + 5, ty--;

tx++;

}

}

// 主函数

void main()

{

initgraph(640, 480);

// 测试画圆

Circle_Midpoint(320, 240, 200, RED);

Circle_Midpoint(320, 240, 101, RED);

// 按任意键退出

getch();

closegraph();

}

(2)基于正负算法程序实现的完整源程序

#include

#include

// 正负画圆法

void Circle_PN(int x, int y, int r, int color) {

int tx = 0, ty = r, f = 0;

while(tx <= ty)

{

// 利用圆的八分对称性画点

putpixel(x + tx, y + ty, color);

putpixel(x + tx, y - ty, color);

putpixel(x - tx, y + ty, color);

putpixel(x - tx, y - ty, color);

putpixel(x + ty, y + tx, color);

putpixel(x + ty, y - tx, color);

putpixel(x - ty, y + tx, color);

putpixel(x - ty, y - tx, color);

if(f <= 0)

f = f + 2 * tx + 1, tx++;

else

f = f - 2 * ty + 1, ty--;

}

}

// 主函数

void main()

{

initgraph(640, 480);

// 测试画圆

Circle_PN(320, 240, 200, RED); Circle_PN(320, 240, 101, RED);

// 按任意键退出

getch();

closegraph();

}

2、实验结果

中点算法运行结果:

基于正负算法结果

四、实验结果分析

该实验基于中点算法和正负算法画圆的基本函数,设计出直线的图像的程序。

按照画园的方法可以分为以下几种方法,分别是生成圆的Bresenham 算法和正负算法和中点算法。在任何调用这些图形模式的功能函数的程序中,都应该在程序的说明部分。通过对程序的编

辑,运行,就可以得到非常形象生动的动画。

通过对程序的分析与学习,使我学到了如何熟悉圆的生成算法,掌握圆的绘制。通过应用基本函数,编写程序,然后才能使用一些基本的图形函数,进行调用,编写程序,经过许多个步骤,编完之后应用TC软件进行调试,修改,最终才能得到想要的结果。

计算机图形学裁剪算法详解

裁剪算法详解 在使用计算机处理图形信息时,计算机部存储的图形往往比较大,而屏幕显示的只是图的一部分。因此需要确定图形中哪些部分落在显示区之,哪些落在显示区之外,以便只显示落在显示区的那部分图形。这个选择过程称为裁剪。最简单的裁剪方法是把各种图形扫描转换为点之后,再判断各点是否在窗。但那样太费时,一般不可取。这是因为有些图形组成部分全部在窗口外,可以完全排除,不必进行扫描转换。所以一般采用先裁剪再扫描转换的方法。 (a)裁剪前 (b) 裁剪后 图1.1 多边形裁剪 1直线段裁剪 直线段裁剪算法比较简单,但非常重要,是复杂图元裁剪的基础。因为复杂的曲线可以通过折线段来近似,从而裁剪问题也可以化为直线段的裁剪问题。常

用的线段裁剪方法有三种:Cohen-Sutherland,中点分割算法和梁友栋-barskey 算法。 1.1 Cohen-Sutherland裁剪 该算法的思想是:对于每条线段P1P2分为三种情况处理。(1)若P1P2完全在窗口,则显示该线段P1P2简称“取”之。(2)若P1P2明显在窗口外,则丢弃该线段,简称“弃”之。(3)若线段既不满足“取”的条件,也不满足“弃”的条件,则在交点处把线段分为两段。其中一段完全在窗口外,可弃之。然后对另一段重复上述处理。 为使计算机能够快速判断一条直线段与窗口属何种关系,采用如下编码方法。延长窗口的边,将二维平面分成九个区域。每个区域赋予4位编码CtCbCrCl.其中各位编码的定义如下:

图1.2 多边形裁剪区域编码图5.3线段裁剪 裁剪一条线段时,先求出P1P2所在的区号code1,code2。若code1=0,且code2=0,则线段P1P2在窗口,应取之。若按位与运算code1&code2≠0,则说明两个端点同在窗口的上方、下方、左方或右方。可判断线段完全在窗口外,可弃之。否则,按第三种情况处理。求出线段与窗口某边的交点,在交点处把线段一分为二,其中必有一段在窗口外,可弃之。在对另一段重复上述处理。在实现本算法时,不必把线段与每条窗口边界依次求交,只要按顺序检测到端点的编码不为0,才把线段与对应的窗口边界求交。 Cohen-Sutherland裁减算法 #define LEFT 1 #define RIGHT 2 #define BOTTOM 4

计算机图形学实验--橡皮筋技术(完整代码,准确无误)

计算机图形学上机实验报告 橡皮筋技术 计算机科学与技术学院 姓名: xxx 完成日期: 2010-12-7

实验:橡皮筋技术 一、实验目的与要求 实验目的:1.学会使用OpenGL,进一步掌握基本图形的绘制方法, 2.理解glut程序框架 3.理解窗口到视区的变换 4.理解OpenGL实现动画的原理 5.学会基于鼠标和键盘实现交互的实现方法 二、实验内容: 利用OpenGL实现折线和矩形的皮筋绘制技术,并采用右键菜单实现功能的选择 实现方法:1.橡皮筋技术的实现采用双缓存技术,绘制图形时分别绘制到两个缓存,交替显示。 2.右键菜单控制选择绘制折线还是绘制矩形,实现方法:通过菜单注册函数创建一个弹出式菜单,然后使用函数加入菜单项,最后使用函数讲菜单与鼠标右键关联起来,GLUT通过为菜单提供一个整数标识符实现对菜单的管理,在main主函数通过标识符用函数指定对应的菜单为当前的菜单。 2. 折线的橡皮筋绘制技术实现:鼠标所在位置确定一个点,移动鼠标时,每次移动时将点的信息保存在数组中,连接当前鼠标所在点和前一个点的直线段。 3.矩形的橡皮筋绘制技术:每个矩形由两个点唯一确定,鼠标当前点为第一个点,移动鼠标确定第二个点的位置,由这两点的坐标绘制出举行的四条边(直线段),矩形即绘制完毕。 三、实验结果

图鼠标右键菜单 图绘制矩形 四、体会 1> 经过这次实验,逐步对opengl软件有了一定的了解,而且对于理论知识有了很好的巩固,并非仅仅会C语言就能编写画图程序,gult程序有自己特殊的框架与实现过程.在这次试验中,虽然没有完全理解其原理,但在一定程度上已经为我们今后的学习应用打下了基础. 2>初步了解了如何在OpenGL实现基本的绘图功能,以及鼠标和键 盘灯交互设备的实现,还有如何由初始生成元绘制分形物体。在这个过 程中遇到了很多问题,程序的调试也是困难重重,通过自己看书思考和 老师、同学的帮助最终完成了程序的调试,在这一过程中加深了对理论 知识的理解,以及理清了理论到实践转换的一点点思路,再一次体会到 理论与实践的结合的重要性,今后要多多提高提高动手能力。

计算机图形学正负法画圆

计算机图形学试验报告(六) 试验名称:利用正负法画圆 专业:地理信息系统班级: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);

计算机图形学图形的几何变换的实现算法

实验二图形的几何变换的实现算法 班级 08 信计 学号 59 姓名 _____ 分数 _____ 一、 实验目的和要求: 1、 掌握而为图形的基本几何变换,如平移,旋转,缩放,对称,错切变换;< 2、 掌握OpenG 冲模型变换函数,实现简单的动画技术。 3、 学习使用OpenGL 生成基本图形。 4、 巩固所学理论知识,加深对二维变换的理解,加深理解利用变换矩阵可 由简单图形得到复杂图形。加深对变换矩阵算法的理解。 编制利用旋转变换绘制齿轮的程序。编程实现变换矩阵算法,绘制给出形体 的三视图。调试程序及分析运行结果。要求每位学生独立完成该实验,并上传实 验报告。 二、 实验原理和内容: .原理: 图像的几何变换包括:图像的空间平移、比例缩放、旋转、仿射变换和图像插值。 图像几何变换的实质:改变像素的空间位置,估算新空间位置上的像素值。 图像几何变换的一般表达式:[u,v ]=[X (x, y ),Y (x, y )],其中,[u,v ]为变换后图像 像素的笛卡尔坐标, [x, y ]为原始图像中像素的笛卡尔坐标。这样就得到了原始图像与变 换后图像的像素的对应关系。 平移变换:若图像像素点(x, y )平移到(x x 。,y ■ y 。),则变换函数为 u = X (x, y ) =x 沟, v 二丫(x, y ) = y ■ y 。,写成矩阵表达式为: 比例缩放:若图像坐标 (x,y )缩放到(S x ,s y )倍,则变换函数为: S x ,S y 分别为x 和y 坐标的缩放因子,其大于1表示放大, 小于1表示缩小。 旋转变换:将输入图像绕笛卡尔坐标系的原点逆时针旋转 v 角度,则变换后图像坐标为: u COST 内容: :u l :Sx k ;0 其中,x 0和y 0分别为x 和y 的坐标平移量。 其中,

圆的认识与画圆练习

圆的认识与画圆练习 教学内容:青岛版数学六年级上册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)圆的直径就是圆的对称轴。()

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

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

(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个坐标

计算机图形学 直线的生成算法的实现

实验二 直线的生成算法的实现 班级 08信计2班 学号 59 姓名 分数 一、实验目的和要求 1.理解直线生成的基本原理。 2.掌握几种常用的直线生成算法。 3.利用Visual C++实现直线生成的DDA 算法。 二、实验内容 1.了解直线的生成原理,尤其是Bresenham 画线法原理。 2.掌握几种基本的直线生成算法:DDA 画线法、Bresenham 画线法、中点画线法。 3.利用Visual C++实现直线生成的DDA 算法,在屏幕上任意生成一条直线。 三、实验步骤 1.直线的生成原理: (1)DDA 画线法也称数值微分法,是一种增量算法。是一种基于直线的微分方程来生成直线的方法。 (2)中点画线法原理 以下均假定所画直线的斜率[0,1]k ∈,如果在x 方向上的增量为1,则y 方向上的增量只能在01 之间。中点画线法的基本原理是:假设在x 坐标为p x 的各像素点中,与直线最近者已经确定为(,)p p P x y ,用小实心圆表示。那么,下一个与直线最近的像素只能是正右方的1(1,)p p P x y +,或右上方的2(1,1)p p P x y ++,用小空心圆表示。以M 为1P 和2P 的中点,则M 的坐标为(1,0.5)p p x y ++。又假设Q 是理想直线与垂直线1p x x =+的交点。显然,若M 在Q 的下方,则2P 离直线近,应取2P 为下一像素点;若M 在Q 的上方,则1P 离直线近,应取1P 为下一像素点。 (3)B resenham 画线法原理 直线的中点Bresenham 算法的原理:每次在主位移方向上走一步,另一个方向上走不走步取决于中点偏差判别式的值。 给定理想直线的起点坐标为P0(x0,y0),终点坐标为P1(x1,y1),则直线的隐函数方程为: 0b kx y y)F(x,=--= (3-1) 构造中点偏差判别式d 。 b x k y y x F y x F d i i i i M M -+-+=++==)1(5.0)5.0,1(),(

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

计算机图形学实验 圆、椭圆的中点算法 学院:计算机科学与技术学院专业:软件工程 班级:软工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);

圆的画法

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

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

画圆的方法

一、画圆的方法: 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、绳测法。用绳绕圆片一周,剪去多余的绳子,量出绳子的长度就是这个圆片的周长。

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

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

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

数学教学用画圆器制作方法

本技术新型涉及教学领域,尤其涉及一种数学教学用画圆器。本技术新型要解决的技术问题是提供一种不会对黑板造成损坏、画圆时不会偏移位置的数学教学用画圆器。为了解决上述技术问题,本技术新型提供了这样一种数学教学用画圆器,包括有第一支杆等;第一支杆左侧后部连接有第一轴承座,第一轴承座上连接有第一转杆,第一转杆与第一支杆连接,第一轴承座左侧连接有橡胶柱,橡胶柱左侧连接有吸盘,第一支杆左侧前部连接有夹紧装置。本技术新型通过让吸盘吸在黑板上作图,这样能够达到教师在黑板上画图时,不损坏黑板的目的,并且设置有夹紧装置和移动装置的缘由。 技术要求 1.一种数学教学用画圆器,其特征在于,包括有第一支杆(1)、第一轴承座(2)、第一转杆(3)、橡胶柱(4)、吸盘(5)和夹紧装置(6),第一支杆(1)左侧后部连接有第一轴承座(2),第一轴承座(2)上连接有第一转杆(3),第一转杆(3)与第一支杆(1)连接,第一轴承座(2)左侧连接有橡胶柱(4),橡胶柱(4)左侧连接有吸盘(5),第一支杆(1)左侧前部连接有夹紧装置(6)。 2.根据权利要求1所述的一种数学教学用画圆器,其特征在于,夹紧装置(6)包括有第二支杆(601)、螺杆(602)、固 定夹板(603)、移动夹板(604)、螺帽(606)、第二弹簧(607)和第三支杆(608),第一支杆(1)左侧连接有固定夹板(603),固定夹板(603)前后两端均连接第三支杆(608),第三支杆(608)右侧连接有螺杆(602),第三支杆(608)右侧连接有第二弹簧(607),第二弹簧(607)的另一端连接有第二支杆(601),第二支杆(601)之间连接有移动夹板(604),第二支杆(601)上开有螺纹孔(605),螺杆(602)穿过螺纹孔(605),螺杆(602)上连接有螺帽 (606),螺杆(602)穿过第二弹簧(607)。

计算机图形学 圆周算法的实现

《计算机图形学实验报告》样例 实验名称:圆周画法的实现 1.实验内容 1.画出圆心坐标为(75,90)和半径为50的红色圆周 2.画出圆心坐标为(‐40,‐80)和半径为60的蓝色圆周 2.程序的基本思路和功能 先用MFC构建界面外观,然后在相应位置分别用Bresenham和DDA编辑画圆的程序然后编译运行。 3.关键代码及说明 void Circle::circleMinPoint(CDC* pDC) { xCenter = (float)(400 + x); yCenter = (float)(300 - y); //绘制圆心 drawCenter(pDC); //r = 50; //设置颜色 color = RGB(red,green,blue); float m_x = 0; float m_y = r; float d = 1.25 - r; circlePoint(m_x,m_y,pDC);

while(m_x <= m_y){ if(d<=0){ d = d + 2 * m_x + 3; }else{ d = d + 2 * ( m_x - m_y ) + 5; m_y = m_y - 1; } m_x = m_x + 1; circlePoint(m_x,m_y,pDC); } } void Circle::circleBresenham(CDC* pDC) { //确认圆心坐标 xCenter = (float)(400 + x); yCenter = (float)(300 - y); //绘制圆心 drawCenter(pDC); //r = 50; //设置颜色 color = RGB(red,green,blue); float m_x = 0; float m_y = r;

Circle方法用于绘制圆

Circle方法用于绘制圆、椭圆、扇形或弧,其语法格式如下: [对象。]Circle[[Step](x,y)],半径[,颜色][,起始角][,终止角了[长短轴比率]. 对象可以是窗体或图片框控件,其中各参数的含义如下: Step:该参数是可选的,如果使用该参数,则表示圆心坐标(x,y)是相对当前点(CurrentX,CurrentY)的,而不是相对坐标原点的。 (x,y):用于指定圆的圆心,也是可选的,如果省略则圆心为当前点(CurrentX,GurrentY)。 半径:用于指定圆的半径,对于椭圆来讲,该值是椭圆的长轴长度。 颜色:指定所绘制图形的颜色。 起始角、终止角:用来指定圆弧或扇形的起始角度与终止角度,单位为弧度。取值范围为0~2π时,绘制的是圆弧:给起始角与终止角取值前添加一个负号,则所绘制的是扇形,负号表示绘制圆心到圆弧的径向线。省略这两个参数,则所绘制的是圆或椭圆。 VB规定,从起始角按逆时针方向绘制圆弧至到终止角处,水平向右方向为0度,且与坐标系统无关,如图9.18所示。 长短轴比率:当需要绘制椭圆时,可使用该参数指定椭圆长短轴的比率。若值大于1,则所绘制的是竖立的椭圆;若值小于1,则所绘制的是扁平的椭圆。该值的缺省值为1,即省略时绘制的是圆。

例如,使用下列语句绘制出的各种图形如图9.19所示。 实例9.4绘制太极图 使用Circle方法绘制出如图9.20所示的太极图。 代码如下:

首先定义了一个名为Tjt的子过程,形参x和Y为太极图的圆心,r为半径。在窗体的Click事件过程中以不同的参数调用Tjt子过程,运行程序,单击窗体后就会在窗体的不同位置绘制出大小不同的太极图。

计算机图形学常用算法及代码大全

2.1.1 生成直线的DDA算法 数值微分法即DDA法(Digital Differential Analyzer),是一种基于直线的微分方程来生成直线的方法。 一、直线DDA算法描述: 设(x1,y1)和(x2,y2)分别为所求直线的起点和终点坐标,由直线的微分方程得 可通过计算由x方向的增量△x引起y的改变来生成直线: 也可通过计算由y方向的增量△y引起x的改变来生成直线: 式(2-2)至(2-5)是递推的。 二、直线DDA算法思想: 选定x2-x1和y2-y1中较大者作为步进方向(假设x2-x1较大),取该方向上的增量为一个象素单位(△x=1),然后利用式(2-1)计算另一个方向的增量(△y=△x·m=m)。通过递推公式(2-2)至(2-5),把每次计算出的(x i+1,y i+1)经取整后送到显示器输出,则得到扫描转换后的直线。 之所以取x2-x1和y2-y1中较大者作为步进方向,是考虑沿着线段分布的象素应均匀,这在下图中可看出。 另外,算法实现中还应注意直线的生成方向,以决定Δx及Δy是取正值还是负值。 三、直线DDA算法实现: 1、已知直线的两端点坐标:(x1,y1),(x2,y2) 2、已知画线的颜色:color 3、计算两个方向的变化量:dx=x2-x1 dy=y2-y1 4、求出两个方向最大变化量的绝对值: steps=max(|dx|,|dy|) 5、计算两个方向的增量(考虑了生成方向): xin=dx/steps

yin=dy/steps 6、设置初始象素坐标:x=x1,y=y1 7、用循环实现直线的绘制: for(i=1;i<=steps;i++) { putpixel(x,y,color);/*在(x,y)处,以color色画点*/ x=x+xin; y=y+yin; } 五、直线DDA算法特点: 该算法简单,实现容易,但由于在循环中涉及实型数的运算,因此生成直线的速度较慢。 //@brief 浮点数转整数的宏 实现代码 #define FloatToInteger(fNum) ((fNum>0)?static_cast(fNum+0.5):static_cast(fNum-0.5)) /*! * @brief DDA画线函数 * * @param pDC [in]窗口DC * @param BeginPt [in]直线起点 * @param EndPt [in]直线终点 * @param LineCor [in]直线颜色 * @return 无 */ void CDrawMsg::DDA_DrawLine(CDC *pDC,CPoint &BeginPt,CPoint &EndPt,COLORREF LineCor) { l ong YDis = (EndPt.y - BeginPt.y); l ong XDis = (EndPt.x-BeginPt.x); l ong MaxStep = max(abs(XDis),abs(YDis)); // 步进的步数 f loat fXUnitLen = 1.0f; // X方向的单位步进 f loat fYUnitLen = 1.0f; // Y方向的单位步进

计算机图形学 实验 画圆法

XXXXXXXX 大学(计算机图形学)实验报告 实验名称 画圆法 实验时间 年 月 日 专 业 姓 名 学 号 预 习 操 作 座 位 号 教师签名 总 评 一、实验目的: 1.了解画圆法的基本思想; 2.掌握画圆法的基本步骤。 二、实验原理: 1. 中点画圆法 中点画圆法是利用圆心在坐标原点的、半径为R )0,0(圆的方程222R y x =+,将每个像素的中点坐标代入圆的方程得到d,再通过d 的值来确定中点与圆的位置。 取重点以上的像素点。,则中点在圆内,点下方的像素点;如果则中点在圆外,就取中 如果00,d <>d 若 d<0, 则取P1为下一象素,而且再下一象素的判别式为 若d>=0, 则应取P2为下一象素,而且下一象素的判别式为 第 一个象素是(0,R ),判别式d 的初始值为 中点画圆法绘出的只是一个完整圆弧的八分之一,然后根据圆良好的对称性,绘出和参考点对称的另外七个点,再用中点画圆法,以生成的这几个点为基础,绘出其它七段圆弧,构成一个完整的园。这七个点的坐标分别为:(x0+x,y0-y,c),(x0+x,y0+y,c), (x0-x,y0-y,c), (x0-x,y0+y,c),(x0-y,y0-x,c),(x0-y,y0+x,c), (x0+y,y0+x,c), (x0+y,y0-x,c)。 找到和参考点对称的另外几个点,再在中点绘制圆弧的定义函数中调用,绘制另外的几段圆弧。 。222)5.0()1()5.0,1()(R y x y x F M F d p p p p --++=-+==;32)5.0()2()5.0,2('222++=--++=-+=p p p p p x d R y x y x F d ;5)(2)5.1()2()5.1,2('222+-+=--++=-+=p p p p p p y x d R y x y x F d 。 R R F d -=-=25.1)5.0,1(0

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

《计算机图形学实验》报告 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);

计算机图形学课程总结

计算机图形学报告 前言 计算机图形学(Computer Graphics,简称CG)是一种使用数学算法将二维或三维图形转化为计算机显示器的栅格形式的科学。简单地说,计算机图形学的主要研究内容就是研究如何在计算机中表示图形、以及利用计算机进行图形的计算、处理和显示的相关原理与算法。 其从狭义上是来说是一种研究基于物理定律、经验方法以及认知原理,使用各种数学算法处理二维或三维图形数据,生成可视数据表现的科学。广义上来看,计算机图形学不仅包含了从三维图形建模、绘制到动画的过程,同时也包括了对二维矢量图形以及图像视频融合处理的研究。由于计算机图形学在许多领域的成功运用,特别是在迅猛发展的动漫产业中,带来了可观的经济效益。另一方面,由于这些领域应用的推动,也给计算机图形学的发展提供了新的发展机遇与挑战。 计算机图形学的发展趋势包括以下几个方面: 1、与图形硬件的发展紧密结合,突破实时高真实感、高分辨率渲染的技术难点; 2、研究和谐自然的三维模型建模方法; 3、利用日益增长的计算性能,实现具有高度物理真实的动态仿真; 4、研究多种高精度数据获取与处理技术,增强图形技术的表现; 5、计算机图形学与图像视频处理技术的结合; 6、从追求绝对的真实感向追求与强调图形的表意性转变。 1、三维物体的表示 计算机图形学的核心技术之一就是三维造型三维物体种类繁多、千变万化,如树、花、云、石、水、砖、木板、橡胶、纸、大理石、钢、玻璃、塑料和布等等。因此,不存在描述具有上述各种不同物质所有特征的统一方法。为了用计算机生成景物的真实感图形,就需要研究能精确描述物体特征的表示方法。根据三维物体的特征,可将三维物体分为规则物体和非规则物体两类。 三维实体表示方法通常分为两大类:边界表示和空间分割表示,尽管并非所有的表示都能完全属于这两类范畴中的某一类。边界表示(B-reps)用一组曲面来描述三维物体,这些曲面将物体分为内部和外部。边界表示的典型例子是多边形平面片和样条曲面。空间分割表示(Space-Partitioning)用来描述物体内部性质,将包含一物体的空间区域分割为一组小的、非重叠的、连续实体(通常是立方体)。三维物体的一般空间分割描述是八叉树表示。本章主要介绍三维物体的各种表示方法及其特点。

计算机图形学画圆算法源程序

#include void CirclePoint(int x, int y, int color, int m ) { putpixel(x+m, y+m, color); putpixel(y+m, x+m, color); putpixel(-y+m, x+m, color); putpixel(-x+m, y+m, color); putpixel(-x+m, -y+m, color); putpixel(-y+m, -x+m, color); putpixel(y+m, -x+m, color); putpixel(x+m, -y+m, color); } void MidBresenhamCircle(int r,int color, int m) { int x, y, d; x=0; y=r; d=1-r; while(x<=y) { CirclePoint(x, y, color, m); if(d<0) d+=2*x+3; else { d+=2*(x-y)+5; y--; } x++; } } void main() { int gdriver,gmode,a,b,c; gdriver=DETECT; initgraph(&gdriver,&gmode,"C:\\TC20\\BGI"); printf("qing shu ru\n"); scanf("%d,%d,%d",&a,&b,&c) setbkcolor(0); MidBresenhamCircle(a, b, c); getch(); closegraph(); }

用圆规画圆

用圆规画圆 设计理念:在学生已经认识了圆心和半径的基础上,通过画指定半径的圆加深对圆心和半径的认识,让学生利用圆规画圆,学生通过多次的尝试、失败、再尝试这一系列的动手操作活动,得出怎样用圆规画圆,学生通过自己反复的操作活动,对圆的认识由原来最初的认知状态,到比较系统、完整的认识,在这一过程中学生也有意识的体会出可以通过“尝试、失败、再尝试”的一系列活动来得出正确的结论,同时也培养了学生发现问题和探究问题的意识教材分析:教材对用圆规画圆的编排是先让学生用自己的方法自主画圆。呈现了四种不同的画圆方法(1)用带有圆面的物体描圆(2)用两支铅笔和一段线绳画圆(3)将直尺的一端固定,让铅笔随直尺的另一端转动画圆(4)直接用圆规画圆。接着用圆规画圆。教材用图文结合的形式呈现了用圆规画圆的三个步骤。然后再让学生按照要求做书上的“做一做”,逐步掌握用圆规画圆的方法。第1题是考查学生用圆规画圆的技能是否掌握,第2题考查学生能否根据固定的圆心位置用圆规画圆。“试一试”自己确定半径的长度,用圆规画圆,同桌比较所画圆的大小。然后提出“圆的大小和什么有关系”的问题,引导学生思考、讨论,使学生认识到:圆的大小与它的半径有关系,半径越大,圆就越大。体会半径对决定圆的大小的重要性。 学情分析:学生对圆心、半径、直径等已有了初步的认识,对画圆也有初步了解的的基础上,让学生自主画圆,但个别学生对圆规的使用还不太熟练,让他们经历多次尝试,再尝试的过程。 教学目标:1.经历用不同的方法画圆、按要求用圆规画圆的过程。 2.能用圆规按要求画圆,认识圆的大小与半径的关系。 3.积极参加数学活动,获得成功的学习体验,发展初步的空间观念。 教学重难点:通过操作和观察活动了解、掌握画圆的多种方法,初步学会用圆规画圆 教学准备:多媒体课件、圆卡纸、线、图钉、圆规、直尺、铅笔. 教学流程: 教师活动:一、问题情境 师生交谈上节课有关画圆话题,引出课题 学生活动:把物体上圆形的面按在纸上,然后描出一个圆 二、自主画圆: 1.让学生看书,了解教材中的画圆方式 2.让学生观察教材中的画法,然后鼓励学生同桌合作各画一个圆。 3.交流学生画圆的过程和方法,教师进行提问,关注画圆的注意事项。使学生知道:画圆时,要固定圆心和半径。 学生活动: 学生看书。然后交流画圆的方法 现在请同学们认真观察右边两幅图,看一看是怎样画的,然后同桌合作,用这两种方法,各画一个圆,试一试 学生合作画圆,教师巡视,对有困难的学生进行指导 三、圆规画圆 1.让学生观察圆规,了解圆规的结构特点。

计算机图形学裁剪算法

一、实验目标 1.了解Cohen-SutherLand线段裁剪算法、Liang-Barsky线段裁剪算法、SutherLand-Hodgeman多边形裁剪算法的基本思想; 2.掌握Cohen-SutherLand线段裁剪算法、Liang-Barsky线段裁剪算法、SutherLand-Hodgeman多边形裁剪算法的算法实现; 二、实验内容 本次实验主要是实现Cohen-SutherLand线段裁剪算法、Liang-Barsky线段裁剪算法、SutherLand-Hodgeman多边形裁剪算法。 Cohen-sutherland线段裁剪算法思想: 该算法也称为编码算法,首先对线段的两个端点按所在的区域进行分区编码,根据编码可以迅速地判明全部在窗口内的线段和全部在某边界外侧的线段。只有不属于这两种情况的线段,才需要求出线段与窗口边界的交点,求出交点后,舍去窗外部分。 对剩余部分,把它作为新的线段看待,又从头开始考虑。两遍循环之后,就能确定该线段是部分截留下来,还是全部舍弃。 Cohen-sutherland线段裁剪算法步骤: 1、分区编码 延长裁剪边框将二维平面分成九个区域,每个区域各用一个四位二进制代码标识。各区代码值如图中所示。 四位二进制代码的编码规则是: (1)第一位置1:区域在左边界外侧

(2)第二位置1:区域在右边界外侧 (3)第三位置1:区域在下边界外侧 (4)第四位置1:区域在上边界外侧 裁剪窗口内(包括边界上)的区域,四位二进制代码均为0。 设线段的两个端点为P1(x1,y1)和P2(x2,y2),根据上述规则,可以求出P1和P2所在区域的分区代码C1和C2。 2、判别 根据C1和C2的具体值,可以有三种情况: (1)C1=C2=0,表明两端点全在窗口内,因而整个线段也在窗内,应予保留。 (2)C1&C2≠0(两端点代码按位作逻辑乘不为0),即C1和C2至少有某一位同时为1,表明两端点必定处于某一边界的同一外侧,因而整个线段全在窗外,应予舍弃。 (3)不属于上面两种情况,均需要求交点。 3、求交点 假设算法按照:左、右、下、上边界的顺序进行求交处理,对每一个边界求完交点,并相关处理后,算法转向第2步,重新判断,如果需要接着进入下一边界的处理。 为了规范算法,令线段的端点P 1为外端点,如果不是这样,就需要P 1 和P 2 交换端点。 当条件(C1&0001≠0)成立时,表示端点P1位于窗口左边界外侧,按照求交公式,进行对左边界的求交运算。 依次类推,对位于右、下、上边界外侧的判别,应将条件式中的0001分别改为0010、0100、1000即可。 求出交点P后,用P1=P来舍去线段的窗外部分,并对P1重新编码得到C1,接下来算法转回第2步继续对其它边界进行判别。 Liang-Barsky线段裁剪算法思想: 我们知道,一条两端点为P1(x1,y1)、P2(x2,y2)的线段可以用参数方程形式表示: x= x1+ u·(x2-x1)= x1+ u·Δx y= y1+ u·(y2-y1)= y1+ u·Δy0≤u≤1式中,Δx=x2-x1,Δy=y2-y1,参数u在0~1之间取值,P(x,y)代表了该线段上的一个点,其值由参数u确定,由公式可知,当u=0时,该点为P1(x1,y1),当u=1时,该点为P2(x2,y2)。如果点P(x,y)位于由坐标(xw min,

相关文档
最新文档