实验二 二维基本图元的生成
第二章 二维基本图形的生成与二维区域的填充
2.1.1 生成直线的DDA算法
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; }
= m =直线的斜率 (2-1)
2016/3/10 10
2.1.1 生成直线的DDA算法
可通过计算由x方向的增量△x引起y的改 变来生成直线:xi+1=xi+△x (2-2) yi+1=yi+△y=yi+△x· m (2-3) 也可通过计算由y方向的增量△y引起x 的改变来生成直线:yi+1=yi+△y (2-4) xi+1=xi+△x=xi+△y/m (2-5) 式(2-2)至(2-5)是递推的。
2016/3/10 11
2.1.1 生成直线的DDA算法
二、直线DDA算法思想: 选定x2-x1和y2-y1中较大者作为步进方向 (假设x2-x1较大),取该方向上的增量为一个象素 单位(△x=1),然后利用式(2-1)计算另一个方向 的增量(△y=△x· m=m)。通过递推公式(2-2)至(2 -5),把每次计算出的(xi+1,yi+1)经取整后送到显 示器输出,则得到扫描转换后的直线。 之所以取x2-x1和y2-y1中较大者作为步进方 向,是考虑沿着线段分布的象素应均匀,这在下 图中可看出。
第二章 二维基本图形的生成与区 域填空
重点:掌握二维图元直线、圆、区域 填充、字符的生成算法。 难点:理解二维图元生成的算法思想 并且用C语言进行算法的实现。 课时安排:授课8学时(直线、圆:3学时; 区域填充:4学时;字符:1学时); 上机4学时(直线、圆:2学时;区域填充: 2 学时)。 2016/3/10 1
5-二维基本图元生成-剪裁技术
2.1 Cohen_Sutherland 算法
2.2
矢量剪裁法
2.2
矢量剪裁法
2.2
矢量剪裁法
3 4 5 3 4 5 3 4 5 1 0 2 1 0 2 1 0 2 6 7 8 6 7 8 6 7 8
2.2
矢量剪裁法
3 4 5
1 0 2
6 7 8
3 4 5
1 0 2
6 7 8
2.2
矢量剪裁法
逐次多边形裁剪算法框图
处理线段SP过程子框图
3.1 Sutlerland_Hodgman算法
3.1 Sutlerland_Hodgman算法
推广
关于任意凸多边形窗口的裁剪
3.2 Weiler-Athenton算法
基本思想:有时延多边形某一条边的方向来处 理顶点,有时沿窗口的边界方向处理。一般按 逆时针(顺时针)以及当前处理多边形顶点对 是由外到内还是由内到外。
2.4
梁友栋_Barskey算法
2.4
梁友栋_Barskey算法
二维裁剪问题 :
生成诱导窗口 Q0Q1 = l ∩口 = l ∩ (Δ1 ∩ Δ 2 ) = (l ∩ Δ1 ) ∩ (l ∩ Δ 2 ) = LR ∩ TB 可见部分 VW = P0 P 1 ∩ Q0Q1 = P0 P 1 ∩ LR ∩ TB
假定条件
2
直线段裁剪
待裁剪线段和窗口的关系
线段完全可见; 显然不可见; 线段至少有一端点在窗口 之外,但部分可见 。
1)Cohen-Sutherland; 2)矢量剪裁法*; 3)中点分割算法; 4)梁友栋_Barskey算法*
2020年整理二维基础图形生成2汇编PPT课件
else length=fabs(y2-y1);
deltx=(x2-x1)/length; delty=(y2-y1)/length;
02.11.2020
x=x1; y=y1; k=1;
while(k<=length) {
SetPixel(hdc,x,y, RGB(0,0,0)); x=x+deltx; y=y+delty; k=k+1; Sleep(50); } }
16
画线中点算法
n 目标:消除DDA算法中的浮点运算(浮点数取整
运算,不利于硬件实现; DDA算法,效率低)
n 条件:
w同DDA算法
w斜 率: m[0,1]
n 直线段的隐式方程((x0,y0)(x1,y1)两端点) F(x,y)=ax+by+c=0 式中 a=y0-y1,b=x1-x0,c=X0Y1-X1Y0
02.11.2020
1
扫描转换直线段
• DDA算法 • 中点画线法 • Bresenham算法
圆弧、椭圆弧扫描转换
• 中点算法 • Bresenham算法 • 内接多边形迫近法* • 等面积多边形逼近法*
02.11.2020
2
1 简单的二维图形显示流程
02.11.2020
3
图形显示前需要:扫描转换+裁剪 ● 裁剪 ---〉扫描转换:最常用,节约计算时间。 ● 扫描转换 ---〉裁剪:算法简单; ● 扫描转换到画布 --〉位块拷贝:算法简单,但耗时耗
w斜率:my/x
x x 1 x 0 , y y 1 y 0
二维基本图形生成
2021/7/11
17
画直线段的过程中,当前象素点为(xp, yp),一个象素点有 两种可选择点p1(xp+1, yp)或p2(xp+1, yp+1)。若M=(xp+1, yp+0.5)为p1与p2之中点,Q为理想直线与x=xp+1垂线的交 点。当M在Q的下方,则P2 应为下一个象素点;M在Q的上 方,应取P1 为下一点。就是中点画线法的基本原理。
直线方程:ym•xB
直接求交算法:
划分区间[x0,x1]: x 0 ,x 1 , ,x n ,其 x i 1中 x i 1 计算纵坐标: yi m•xi B
取整:{(xi, yi)}in0
{(xi, yi,r)}in0
yi,rro(u yi) n (idn yi t0 .)5 )(
2021/7/11
2021/7/11
24
举例 用中点画线方法扫描转换连接两点P0(0,0)和P1 (5,2)的直线段
a=y0-y1=-2; b=x1-x0=5; d0=2*a+b=1; d1=2*a=-4; d2=2*(a+b)=6 xy d 00 1 1 0 -3 d1 2 1 3 d2 3 1 -1 d1 4 2 5 d2 52 1
while(k≤lenght)
putpixel(x,y) x﹦x﹢△x y﹦y﹢△y k﹦k﹢1
endwhile
end
2021/7/11
15
DDA直线绘制的C++实现 void DDA直线绘制(HDC hdc) {
计算机图形学_实验2_二维图形绘制
深圳大学实验报告课程名称:计算图形学实验名称:二维图形绘制学院:计算机与软件学院专业:计算机科学与技术报告人:学号:班级:同组人:无指导教师:周虹实验时间:2014/10/31实验报告提交时间:2014/11/3教务处制一.实验目的1、能正确使用OpenGL图元产生图画,并且学会使用多种生成图案的方式。
2、能正确设置图元属性,得到不同的绘制效果。
二.实验步骤1、用三角形模式画有颜色填充的太阳,圆心为(-0.5,0.7)2、直线模式,以-0.5,0.7为圆心画一些列直线作为太阳光3、用三角形画树,多边形画树干4、直线模式,以-0.5,0.7为圆心画一小花点缀树5、以三角形模式画一个小山坡,用天蓝色填充6、直线模式,以-0.5,0.7为圆心,以不同大小的直线画一系列小花点缀小山坡7、以不同大小的点形成双色围栏8、用不同的多边形模式画小树,用多边形模式画树干,并染上特别的颜色9、用虚线画零星的小草三.实验结果1、用三角形模式画有颜色填充的太阳,圆心为(-0.5,0.7)2、直线模式,以-0.5,0.7为圆心画一些列直线作为太阳光3、用三角形画树,多边形画树干4、直线模式,以-0.5,0.7为圆心画一小花点缀树5、以三角形模式画一个小山坡,用天蓝色填充6、直线模式,以-0.5,0.7为圆心,以不同大小的直线画一系列小花点缀小山坡7、以不同大小的点形成双色围栏8、用不同的多边形模式画小树,用多边形模式画树干,并染上特别的颜色9、用虚线画零星的小草四.实验心得通过这次实验,我比较深入地理解了二维图形的绘制过程和不同图元相关属性的设置,并学会运用不同的图元组合得到自己想要的画。
本次实验收获良多,主要体现在以下方面:作图时要善于运用函数。
例如在本次实验中涉及到画圆,可是opengl中并没有提供画圆的工具,这时函数就显得尤为重要了。
可是,有了函数还不够,得到函数后要根据自己要的属性选择适当的作图模式。
例如本次画太阳的过程中,一开始我选用GL_LINES的模式,当n趋向无穷大时得到一个圆,可是问题是这个圆是空心的,无法填充红色。
图元的生成实验报告
图元的生成实验报告一、实验目的本实验旨在通过使用计算机图形学中的图形库,实现图元的生成过程,加深对图形学中图元生成算法的理解,并通过实验总结掌握运用图形库生成图元的方法。
二、实验器材与环境- 软件:计算机图形学图形库、Python编程环境、Markdown编辑器- 硬件:一台装有计算机图形学图形库的计算机三、实验过程与方法1. 实验准备首先确保计算机上已安装计算机图形学图形库,并配置好Python编程环境。
2. 实验步骤1. 编写程序代码,导入所需的计算机图形学图形库。
2. 创建画布,并设置画布的大小、背景颜色等基本参数。
3. 使用图形库提供的函数,生成所需的图元。
可以选择绘制直线、圆、多边形等基本图元,也可以根据需要自己设计复杂的图元。
4. 将生成的图元加入画布中,设置图元的位置、颜色、线条样式等。
5. 显示画布,并将生成的图元显示在屏幕上。
四、实验结果与分析本次实验的目的是掌握使用计算机图形学图形库生成图元的方法,因此不要求生成特定的图元形状,可以选择自己感兴趣的形状进行实验。
在本次实验中,我们选择了绘制一个五角星作为图元,代码如下:pythonimport graphics创建画布win = graphics.GraphWin("Experiment", 500, 500) 绘制五角星p1 = graphics.Point(250, 50)p2 = graphics.Point(225, 200)p3 = graphics.Point(350, 100)p4 = graphics.Point(175, 100)p5 = graphics.Point(300, 200)line1 = graphics.Line(p1, p3)line2 = graphics.Line(p3, p5)line3 = graphics.Line(p5, p2)line4 = graphics.Line(p2, p4)line5 = graphics.Line(p4, p1)line1.draw(win)line2.draw(win)line3.draw(win)line4.draw(win)line5.draw(win)显示画布win.getMouse()win.close()运行以上代码后,我们生成了一个五角星,并显示在屏幕上。
实验一 二维基本图元的生成1
实验一二维基本图元的生成一.实验目的1.了解并掌握二维基本图元的生成算法。
2.实现直线生成的DDA算法、中点算法和Bresenham算法。
二.实验内容和要求1.选择自己熟悉的任何编程语言, 建议使用VC++6.0。
2.创建良好的用户界面,包括菜单,参数输入区域和图形显示区域。
3.实现生成直线的DDA算法、中点算法和Bresenham算法(至少一种)。
三.实验报告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所示。
实验二 二维基本图元的生成
yIncrement = float (dy) / float (steps);
setPixel (round (x), round (y));
for (k = 0; k < steps; k++) {
x += xIncrement;
}
注意:
(1)代码没有主函数及其它OpenGL的初始化函数,请用前面实验一中的代码进行添加,该函数在回调函数myDraw()中调用执行;
(2)代码中出现的
class scrPt {
public:
GLint x, y;
};
是C++中的类定义,对于没有学习过C++的读者,这里可看作是C语言中的一个结构体:
{
setPixel (xCenter + x, yCenter + y);
setPixel (xCenter - x, yCenter + y);
setPixel (xCenter + x, yCenter - y);
setPixel (xCenter - x, yCenter - y);
}
注意:
(1)代码没有主函数及其它OpenGL的初始化函数,请用前面实验一中的代码进行添加,该函数在回调函数myDraw()中调用执行;
*/
void ellipseMidpoint (int xCenter, int yCenter, int Rx, int Ry)
{
int Rx2 = Rx * Rx;
int Ry2 = Ry * Ry;
int twoRx2 = 2 * Rx2;
第二章 二维图形生成
第二章二维图形生成一、复习要求1、直线生成的常用算法2、二次曲线生成的常用算法3、字符4、区域填充的实现方法二、内容提要1.直线的生成算法(1)生成直线的常用算法在数学上,理想的直线是没有宽度的,由无数个点构成的集合。
当我们对直线进行光栅化时,只能在显示器所给定的有限个象素组成的矩阵中,确定最佳逼近于该直线的一组象素,并且按扫描线顺序,对这些象素进行写操作,这就是通常所说的用显示器绘制直线或直线的扫描转换。
由于一个图中可以包含成千上万条直线,所以要求绘制算法应尽可能的快。
本节我们介绍一个象素宽直线的三个常用算法:逐点比较法、数值微分法(DDA)和Bresenham算法。
①逐点比较法画直线段的过程中,当前象素点为(x p, y p),一个象素点有两种可选择点p1(x p+1, y p)或p2(x p+1, y p+1)。
若M=(x p+1, y p+0.5),为p1与p2之中点,Q为理想直线与x=x p+1垂线的交点。
当M在Q的下方,则P2 应为下一个象素点;M在Q的上方,应取P1 为下一点。
就是逐点比较法的基本原理。
图2-1 逐点比较法每步迭代涉及的象素和中点示意图下面讨论逐点比较法的实现。
令直线段L(p0(x0,y0), p1(x1, y1)), 其方程式 F(x, y)=ax+by+c=0。
其中,a=y0-y1, b=x1-x0, c=x0y1-x1y0; 点与L的关系:on: F(x,y)=0; up: F(x, y)>0; down: F(x, y)<0; 因此,欲判断中M在Q点的上方还是下方,只要把M代入F(x,y),并判断它的符号。
构造判别式:d=F(M)=F(x p+1, y p+0.5)=a(x p+1)+b(y p+0.5)+c当d<0,M在L(Q点)下方,取P2为下一个象素;当d>0,M在L(Q点)上方,取P1为下一个象素;当d=0,选P1或P2均可,约定取P1为下一个象素;注意到d是x p, y p的线性函数,可采用增量计算,提高运算效率。
实验二 二维图形绘制
实验二二维图形绘制2.1 实验目的1.熟练掌握二维图形(直线、圆、圆弧、椭圆、矩形、射线、构造线等图形对象)的绘制方法。
2.熟练掌握二维图形(等分点,测量点,二维多段线,矩形,等边多边形,椭圆,圆环、填充圆、轨迹线、修订云线、擦除区域等)的绘制方法和区域填充命令的使用。
3.熟悉键盘命令、菜单选项、工具按钮、功能区面板的使用。
4.掌握图形文件创建、打开、保存功能。
5.熟悉键盘、鼠标的数据输入方法。
2.2 实验内容绘制图s2-1、s3-2所示图形。
图s2-1 简单图形图s2-22.3 实验要求1.图s2-1图形界限为12⨯9(英制),图s2-2图形界限为12.4⨯9,按图中标注尺寸绘制。
2.绘图时只允许使用二维绘图命令,不允许使用任何编辑命令和辅助绘图功能。
3.尺寸标注略。
4.在图中某部位练习绘制修订云线和擦除区域。
5.将图s2-1按文件名“ex21.dwg”保存,将图s2-2按文件名“ex22.dwg”保存。
2.4 实验步骤2.4.1 实验步骤一6.启动AutoCAD 2010系统,进入AutoCAD 2010绘图界面。
7.选择执行菜单“文件”→“新建”,在“选择样板”对话框中选择“acad.dwt”样板文件,或在“创建新图形”对话框中选择“从草图开始”向导,从“默认设置”区中选择“英制”绘图单位,设置图形界限为12⨯9。
8.用LINE命令绘制矩形和平行四边形,如图s2-3所示。
命令: LINE↙指定第一点: 2,2↙指定下一点或 [放弃(U)]: @8,0↙指定下一点或 [闭合(C)/放弃(U)]: @0,6↙指定下一点或 [闭合(C)/放弃(U)]: @-8,0↙图s2-3指定下一点或 [闭合(C)/放弃(U)]: C↙命令: ↙指定第一点: @4,0↙指定下一点或 [放弃(U)]: @-4,-3↙指定下一点或 [闭合(C)/放弃(U)]: @4,-3↙指定下一点或 [闭合(C)/放弃(U)]: @4,3↙指定下一点或 [闭合(C)/放弃(U)]: C↙9.用RAY 和XLINE命令绘制四条射线、一条水平构造线和一条垂直构造线,如图s2-4所示。
03 二维线画图元的生成
• 先裁剪 • 先扫描转换
3
扫描转换直线段(1/7)
• 扫描转换直线段
– 求与直线段充分接近的像素集
• 两点假设
– 直线段的宽度为1
– 直线段的斜率: m[1,1]
4
扫描转换直线段(2/7)
• DDA算法
– 条件: • 待扫描转换的直线段:P0 (x0, y0)P1(x1, y1)
• 中点算法
– 目标:消除DDA算法中的浮点运算 – 条件:
• 同DDA算法
• 斜率:m[0,1]
– 直线段的隐式方程
y m • x B y y x B x
x • y y • x x • B F(x, y) x • y y • x x • B 0
7
扫描转换直线段(5/7)
• 取判别式 • 递推计算
di
2F(M )
2F ( xi
1,
yi,r
1) 2
di1
di
di 2y,当di 0 2(y x),当di
0
– 初值条件
(x0 , y0,r ) (x0, y0)
1
d0
2F (x0
1,
y0,r
) 2
2y
x
– 程序:见47页
思考题
10
扫描转换圆弧(1/8)
• 处理对象:圆心在原点的圆弧 • 圆的八对称性
21
生成圆弧的正负法(4/4)
• 正负法生成圆弧
– 考虑第一像限Biblioteka 弧段 – 圆弧是易画曲线 – 程序:见63页
22
线画图元的属性控制(1/5)
• 线宽控制
– 像素复制方法
• 优点:
– 实现简单
实训项目2 基本二维图形的绘制与编辑
●任务一
9.
●任务二
10.
●任务三
●任务四
●任务五
●任务六 图2—22 ●拓展练习
图2—23
实训项目二 基本二维图形的绘制和编辑
任务三 绘制凹形槽平面图
● 目录
【任务分析】
●任务一
●任务二
如图凹形槽由直线、圆弧和圆组成,在绘制过程中可以使用多 段线命令绘制外边框的圆弧和直线段,再使用圆命令、复制命令绘 制内部的圆。
●任务三
●任务四
●任务五
●任务六 ●拓展练习 图2—8 凹形槽
实训项目二 基本二维图形的绘制和编辑
1.
2.
3.
●任务二
●任务三 图2—14 图2—15 图2—16
●任务四
4.
●任务五
5.
6.
●任务六 ●拓展练习 图2—17 图2—18 图2—19
实训项目二 基本二维图形的绘制和编辑
● 目录
●任务一
7.
8.
●任务二
●任务三
●任务四
●任务五
●任务六 ●拓展练习 图2—20 图2—21
实训项目二 基本二维图形的绘制和编辑
实训项目二 基本二维图形的绘制和编辑
● 目录
三、常用图层名及设置
●任务一
●任务二
●任务三
●任务四 表2—1常用图层名及设置 ●任务五
四、 图形显示缩放
功能: 图形显示缩放只是将屏幕上的 对象放大或缩小其视觉尺寸,对象 的实际尺寸仍保持不变。
图2 —5 “缩放”工具栏
●任务六 ●拓展练习
实训项目二 基本二维图形的绘制和编辑
实训项目二 基本二维图形的绘制和编辑
任务四 绘制样板平面图
基本图元生成算法
刘春晓
y F(x,y)=0 F(x,y)>0 x F(x,y)<0 F(x,y)=0
y
F(x,y)>0
F(x,y)<0
x
图5-4
直线将平面分为三个区域
计算机图形学
刘春晓
判别式:
d i = F ( xiM , yiM ) = F ( xi + 1, yi + 0.5) = yi + 0.5 − k ( xi + 1) − b
计算机图形学
刘春晓
源程序
BresenhamCircle(int r, color)
{ int x,y,delta, d1, d2, dir x=0; y=r; delta = 2*(1-r) while(y>=0){ drawpixel(x,y,color); if(delta < 0){ d1 = 2* (delta + y) -1; if(d1 <=0) dir = 1; else dir = 2; } else if( delta > 0){ d2 = 2*(delta-x)-1; if(d2 <= 0) dir = 2; else dir = 3; } else dir = 2; 计算机图形学
x
图4-3
计算机图形学
中点Bresenham画圆的原理
刘春晓
M的坐标为:M(xi +1,yi-0.5)
• 当F(xM,yM)<0时,取Pu(xi +1,yi) • 当F(xM,yM)>0时,取Pd(xi +1,yi-1) • 当F(xM,yM)=0时,约定取Pu。
构造判别式:
d i = F ( xM , yM ) = F ( x i +1, yi − 0.5) = ( x i +1) 2 + ( yi − 0.5) 2 − R 2
二维图形生成技术
计算机图形学实验二课程名称:计算机图形学实验名称:二维图形生成技术实验日期:2011-12-07班级:数媒0902班姓名:沈玉婷学号:0305090206一、实验目的和要求1、掌握二维基本图元直线段生成的DDA算法,中点算法、Bresenham算法;2、掌握二维基本图元圆的扫描算法;3、掌握二维图元填充的种子填充算法;4、掌握二维图元填充的多边形扫描线算法。
二、实验内容1、编程实现利用交互形式确定直线的两端点,并实现DDA、中点算法和Bresenham算法生成直线2、推导1/4圆的中点画圆算法,并编程实现。
3、构造任意一个边界表示的多边形,假定该多边形内部是四连通的。
要求:用递归算法实现对多边形内部的填充,要求内部颜色和边界不一致。
三、实验步骤假设已知P(xi,yi),则可能的下一个像素只能是P1(xi+1,yi)或者P2(xi+1,yi+1),构造圆函数为F(x,y)=x²+y²-R²圆上的点(x,y),有F(x,y)=0;圆外的点(x,y),有F(x,y)>0;圆内的点(x,y),有F(x,y)<0。
构造原函数:F(x,y)= x2+y2-R2..构造判别式:di=F(Mi)=F(xi+1,yi-0.5)=(xi+1)2+(yi-0.5)2-R21.di<0,则应取P1(xi+1,yi)为下一像素:di+1=F(xi+2,yi-0.5)=(xi+2)2+(yi-0.5)2-R2=di+2xi+32.di>=0,则应取P2(xi+1,yi-1)为下一像素:di+1=F(xi+2,yi-1.5)=(xi+2)2+(yi-1.5)2-R2= di+2(xi-yi)+5若按顺时针方向生成1/4圆,则第一个像素是(0,R),则判别式的初值:d0=1.25-R,进一步整理可令:d0=1-R;程序中令:xx=0,yy=r;dtx=3,dty=2-2*r;d=1-r;画四分之一圆,令yy>=0即可;其中按照di的正负确定下一像素的位置,逐渐画出四分之一的圆。
实训二 绘制基本二维图形
实训二绘制基本二维图形一、实训目的及要求1掌握绘制直线对象2掌握绘制矩形和等边多边形3掌握绘制曲线对象4掌握设置点的样式并绘制点对象二、实训步骤1绘制直线、射线、构造线。
2绘制矩形、正多边形。
3绘制圆、圆环、圆弧、椭圆和椭圆弧。
4绘制点、设置点的样式与大小、绘制定数等分点、绘制定距等分点。
三、实训内容1.绘制直线根据指定的端点绘制一系列直线段。
命令:LINE单击“绘图”工具栏上的(直线)按钮,或选择“绘图”|“直线”命令,即执行LINE命令,AutoCAD提示:第一点:(确定直线段的起始点)指定下一点或[放弃(U)]:(确定直线段的另一端点位置,或执行“放弃(U)”选项重新确定起始点)指定下一点或[放弃(U)]:(可直接按Enter键或Space键结束命令,或确定直线段的另一端点位置,或执行“放弃(U)”选项取消前一次操作)指定下一点或[闭合(C)/放弃(U)]:(可直接按Enter键或Space键结束命令,或确定直线段的另一端点位置,或执行“放弃(U)”选项取消前一次操作,或执行“闭合(C)”选项创建封闭多边形)指定下一点或[闭合(C)/放弃(U)]:↙(也可以继续确定端点位置、执行“放弃(U)”选项、执行“闭合(C)”选项)执行结果:AutoCAD绘制出连接相邻点的一系列直线段。
用LINE 命令绘制出的一系列直线段中的每一条线段均是独立的对象。
2.绘制射线绘制沿单方向无限长的直线。
射线一般用作辅助线。
选择“绘图”|“射线”命令,即执行RAY命令,AutoCAD提示:指定起点:(确定射线的起始点位置)指定通过点:(确定射线通过的任一点。
确定后AutoCAD绘制出过起点与该点的射线)指定通过点:↙(也可以继续指定通过点,绘制过同一起始点的一系列射线3. 绘制构造线绘制沿两个方向无限长的直线。
构造线一般用作辅助线。
单击“绘图”工具栏上的(构造线)按钮,或选择“绘图”|“构造线”命令,即执行XLINE命令,AutoCAD提示:指定点或[水平(H)/垂直(V)/角度(A)/二等分(B)/偏移(O)]:4.绘制矩形根据指定的尺寸或条件绘制矩形。
二维基本图元生成ok
边界表示
枚举出边界上所有的像素; 边界上的所有像素着同一颜色; 内部像素着与边界像素不同的颜色;
4.2 种子填充 区域填充
将指定的颜色从种子点扩展到整个区域的过程
例子: 例子:PaintBrush
例子: 例子:PhotoShop
4.3 种子填充
连通性:4连通,8连通 4连通:
8连通
4.3 种子填充
4 区域填充 4.1扫描线算法的基本原理
基本思想:
按扫描线顺序,计算扫描线与多边形的相交区间,再用 要求的颜色显示这些区间的象素,即完成填充工作.
对于一条扫描线填充过程可以分为四个步骤:
(1)求交; (2)排序; (3)配对; (4)填色.
4.1 扫描线算法的基本原理
8 7 6 5 4 3 2
P6(2,7)
2.1 逐点比较法
2.1 逐点比较法
xi +1 = xi + 1 Fi +1 = x A yi +1 y A xi +1 = x A yi y A ( xi + 1) = x A yi y A xi y A = Fi y A
2.1 逐点比较法
事例:
2.2 DDA算法
条件:
待扫描转换的直线段:P0 ( x0, y 0) P ( x1, y1) 1 斜率:m = y / x
x 0 1 2 3 4
y 0 0 1 1 2
e -0.5 -0.1 0.3 -0.3 0.1
3 2 1 0 1 2 3 4 5
5 2 -0.5
3,曲线的生成
3,曲线的生成
圆弧的生成 规则曲线的生成 自由曲线的生成
3.1 圆弧的生成
处理对象:圆心在原点的圆弧 圆的八对称性 生成圆弧的隐函数方法
第3章 二维图元生成技术 计算机图形学
两个距离的差
d 1 d 2 2k ( xi 1) 2 yi 2b 1
若此差值为正,则d1>d2,下一个像素点应取 P2 (xi +1, yi+1);若此差值为负,d1<d2,下一个像素点应 取P1 (xi+1, yi);若此差值为零,则d l=d2,下一 个像素点可取两个像素点中的任意一个.
dy=abs(y2-y1);
if(dx<dy){iTag=1;Swap(x1, y1);Swap(x2, y2);Swap(dx, dy);} tx=(x2-x1)>0?1:-1;ty=(y2-y1)>0?1:-1; curx=x1;cury=y1; inc1=2*dy;inc2=2*(dy-dx);d=inc1-dx;
k
y1 y 0 y x1 x0 x
d i 1 d i 2y xi 1 2x yi 1 2y xi 2x yi
d 当di≥0时,yi+1=yi+1, i 1 di (2y 2x) 当di≤0时,yi+1=yi d i 1 d i 2y 初始判别量d0
5 4
29
3.1.3 Bresenham算法
已经确定的像素为P(xi yi),下一个可选 择的像素点为P1(xi+1, yi)和P2(xi+1, yi +1) )两者中的一个
3.1.3 Bresenham算法
在x=xi+1处直线上点y=k(xi+1)+b,该点到P1 (xi+ 1, yi)和P2 (xi+1, yi+1)的距离分别令为d1和d2:
第二章 二维图形生成技术
x 0 1 2 3 4
Line: P0(0, 0)-- P1(5, 2) 3 2 1 0 1 2 3 4 5
中点画线法(5/6)
d的初始值 Nhomakorabead0=F(X0+1,Y0+0.5) =F(X0,Y0)+a+0.5 =a+0.5b 用2d代替d后,d0=2a+b d的增量都是整数 只有整数运算,不含乘除法 可用硬件实现
float dx,dy,x,y,steps; int x1=0,y1=0,x2=200,y2=100,i; if(abs(x2-x1)>abs(y2-y1)) steps=(float)abs(x2-x1); else steps=(float)abs(y2-y1); dx=(x2-x1)/steps; dy=(y2-y1)/steps; x=(float)x1; y=(float)y1; for(i=1;i<=steps;i++) { pDC->SetPixel((int)(x+0.5),(int)(y+0.5),RGB(0,0,255)); x=x+dx; y=y+dy; }
因(X0,Y0)在直线上, 所以F(X0,Y0)=0
优点:
/* 算法2.2*/
中点画线法(6/6)
void Midpoint Line (int x0,int y0,int x1, int y1,int color) { int a, b, d1, d2, d, x, y; a=y0-y1, b=x1-x0, d=2*a+b; d1=2*a, d2=2* (a+b); x=x0, y=y0; drawpixel(x, y, color); while (x<x1) { if (d<0) {x++; y++; d+=d2; } else {x++; d+=d1;} drawpixel (x, y, color); } /* while */ } /* mid PointLine */
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
void circlePlotPoints (scrPt, scrPt);
/* Plot the initial point in each circle quadrant. */
circlePlotPoints (circCtr, circPt);
/* Calculate next points and plot in each octant. */
setPixel (circCtr.x - circPt.y, circCtr.y + circPt.x);
setPixel (circCtr.x + circPt.y, circCtr.y - circPt.x);
setPixel (circCtr.x - circPt.y, circCtr.y - circPt.x);
if (x0 > xEnd) {
x = xEnd;
y = yEnd;
xEnd = x0;
}
else {
x = x0;
y = y0;
}
setPixel (x, y);
while (x < xEnd) {
x++;
if (p < 0)
p += twoDy;
else {
y++;
p += twoDyMinusDx;
inline int round (const float a) { return int (a + 0.5); }
void lineDDA (int x0, int y0, int xEnd, int yEnd){
int dx = xEnd - x0, dy = yEnd - y0, steps, k;
(2)代码中两次调用setPixel(int , int)函数,该函数不是C或C++的系统函数,需要我们自己去定义。
{
setPixel (xCenter + x, yCenter + y);
setPixel (xCenter - x, yCenter + y);
setPixel (xCenter + x, yCenter - y);
setPixel (xCenter - x, yCenter - y);
}
注意:
(1)代码没有主函数及其它OpenGL的初始化函数,请用前面实验一中的代码进行添加,该函数在回调函数myDraw()中调用执行;
}
}
void circlePlotPoints (scrPt circCtr, scrPt circPt)
{
setPixel (circCtr.x + circPt.x, circCtr.y + circPt.y);
setPixel (circCtr.x - circPt.x, circCtr.y + circPt.y);
二、实现
读懂课本第76页所给的如下代码,理解执行的原理:
#include <stdlib.h>
#incluБайду номын сангаасe <math.h>
/* Bresenham line-drawing procedure for |m| < 1.0. */
void lineBres (int x0, int y0, int xEnd, int yEnd){
实验二二维基本图元的生成
实验目的:
通过实验掌握下列知识:
1.进一步掌握OpenGL的绘制原理;
2.直线生成算法的理解与实现;
3.圆生成算法的理解与实现;
4.椭圆生成算法的理解与实现;
内容及步骤:
一、
读懂课本第72页所给的如下代码,理解执行的原理:
#include <stdlib.h>
#include <math.h>
setPixel (circCtr.x + circPt.x, circCtr.y - circPt.y);
setPixel (circCtr.x - circPt.x, circCtr.y - circPt.y);
setPixel (circCtr.x + circPt.y, circCtr.y + circPt.x);
yIncrement = float (dy) / float (steps);
setPixel (round (x), round (y));
for (k = 0; k < steps; k++) {
x += xIncrement;
y += yIncrement;
setPixel (round (x), round (y));
}
setPixel (x, y);
}
}
注意:
(1)代码没有主函数及其它OpenGL的初始化函数,请用前面实验一中的代码进行添加,该画线函数在回调函数myDraw()中调用执行;
(2)代码中两次调用setPixel(int , int)函数,该函数不是C或C++的系统函数,需要我们自己去定义。
三、实现
int dx = fabs (xEnd - x0), dy = fabs(yEnd - y0);
int p = 2 * dy - dx;
int twoDy = 2 * dy, twoDyMinusDx = 2 * (dy - dx);
int x, y;
/* Determine which endpoint to use as start position. */
srtPtpoint;
point.x=200;
point.y=200;
circleMidpoint(point, 100); //圆点为半径为100
四、
读懂课本第93页所给的如下代码,理解执行的原理:
inline int round (const float a) { return int (a + 0.5); }
/* The following procedure accepts values for an ellipse
* center position and its semimajor and semiminor axes, then
* calculates ellipse positions using the midpoint algorithm.
if (p > 0)
p += Rx2 - py;
else {
x++;
px += twoRy2;
p += Rx2 - py + px;
}
ellipsePlotPoints (xCenter, yCenter, x, y);
}
}
void ellipsePlotPoints (int xCenter, int yCenter, int x, int y)
void setPixel(GLint x,GLint y){
glBegin(GL_POINTS);
glVertex2i(x,y);
glEnd();
}
(3)函数前的修饰符inline表示该函数是一个内联函数。内联函数在编译时直接用函数体代码替代该函数被调用的位置,加快程序执行的速度,与宏定义非常类似。
}
void circleMidpoint (scrPt circCtr, GLint radius)
{
scrPt circPt;
GLint p = 1 - radius; // Initial value of midpoint parameter.
circPt.x = 0; // Set coordinates for top point of circle.
}
注意:
(1)代码没有主函数及其它OpenGL的初始化函数,请用前面实验一中的代码进行添加,该函数在回调函数myDraw()中调用执行;
(2)代码中出现的
class scrPt {
public:
GLint x, y;
};
是C++中的类定义,对于没有学习过C++的读者,这里可看作是C语言中的一个结构体:
读懂课本第85页所给的如下代码,理解执行的原理:
#include <GL/glut.h>
class scrPt {
public:
GLint x, y;
};
void setPixel (GLint x, GLint y)
{
glBegin (GL_POINTS);
glVertex2i (x, y);
glEnd ( );
structscrPt {
GLint x, y;
};
表示一个点的坐标,在回调函数myDraw()中调用执行void circleMidpoint (scrPt circCtr, GLint radius)时注意,circCtr是圆点的坐标,需要初始化。
例如:圆点的坐标是(200,200),那么可以写为:
float xIncrement, yIncrement, x = x0, y = y0;
if (fabs (dx) > fabs (dy))
steps = fabs (dx);
else
steps = fabs (dy);
xIncrement = float (dx) / float (steps);
}
ellipsePlotPoints (xCenter, yCenter, x, y);