实验二圆弧及椭圆弧的生成
一、实验目的
掌握几种圆弧和椭圆弧生成算法的比较,特别是Bresenham圆弧和椭圆弧生成算法
二、实验环境
实验设备:
计算机
实验使用的语言:
C或VisualC++、OpenGL
三、实验内容
1.用Bresenham生成算法在屏幕上绘制出圆弧的图形。
2.用Bresenham生成算法在屏幕上绘制出椭圆弧的图形
四、实验步骤
圆的生成算法一般将圆划分为8等份,只需计算(90°,45°)的八分之一圆弧,其它用对称法求得(参
见下图)。
Bresenham生成算法思想如下(第一象限,且斜率k<1的情况):
1)计算误差初值P1=3-2r,i=1,画点(0,r);
2)求下一个光栅点位置Xi+1=Xi+1如果Pi<0,贝Uyi+1=yi,否则yi+1=yi-1;
3)画点(Xi+1,yi+1);
4)求下一个误差Pi+1点,如果Pi<0,贝UPi+1=Pi+2xi+6,否则Pi+1=Pi+4(xi-yi)+10;
5)i=i+1,如果x=y则结束操作,否则转步骤2。
卜(ysx)
实验三多边形的区域填充
一、实验目的
1.通过实验,进一步理解和掌握几种常用多边形填充算法的基本原理;2.掌握多边形区域填充算法的基本过程;
3.掌握在VisualC++环境下用多边形填充算法编程实现指定多边形的填充
二、实验环境
实验设备:
计算机
实验使用的语言:
C或VisualC++、OpenGL
三、实验内容
1.用种子填充算法实现区域填充。
2.扫描线填充算法实现区域填充。
3.用x-扫描线算法实现多边形的填充(可选);4.实现边缘填充算法和边标志填充算法(可选);
四、实验步骤区域填充是指从区域内的某一个象素点(种子点)开始,由内向外将填充色扩展到整个区域内的过程。
区域是指已经表示成点阵形式的填充图形,它是相互连通的一组像素的集合。
1、栈结构实现4-连通边界填充算法的算法步骤为:
种子象素入栈;当栈非空时重复执行如下三步操作:
(a)栈顶象素出栈;
(b)将出栈象素置成填充色;
(c)检查出栈象素的4-邻接点,若其中某个象素点不是边界色且未置成多边形色,则把该象素入栈。
2、栈结构实现8-连通边界填充算法的算法步骤为:
种子象素入栈;当栈非空时重复执行如下三步操作:
(a)栈顶象素出栈;
(b)将出栈象素置成填充色;
(c)检查出栈象素的8-邻接点,若其中某个像素点不是边界色且未置成多边形色,则把该像素入栈。
实验四二维几何变换
一、实验目的
进一步加深对常用的二维几何变换的理解,如平移、旋转、放大缩小等。
掌握变换顺序和变换矩阵。
二、实验环境
实验设备:
计算机
实验使用的语言:
C或VisualC++、OpenGL
、实验内容
1.通过二维几何变换的数学模型,编写平移、旋转、放缩、对称变换;
2.绘制一个北极星图案或字母图案,如下图所示,实现该图形的平移、旋转、放缩、对称等几何变换;
3.加入鼠标功能,实现图形的拾取及交互式移动等功能。
四、实验步骤
二维几何图形的步骤:
1、选取二维空间坐标系。
2、在选定的坐标系中,确定图形走笔顺序或连点顺序(拓扑结构),写出图形中上各顶点位置坐标,同时引入齐次坐标表示成n(点数)*3阶矩阵。
3、根据图形的拓扑结构及顶点坐标,绘制图形。
4、将图形的顶点坐标矩阵乘以变换矩阵(不同的变换乘以不同的变换矩阵),得到变换后的顶点坐标,再根据图形的拓扑结构及顶点坐标,绘制变换之后的图形。
实验五裁剪算法
一、实验目的
1、熟悉各种直线裁剪算法,包括Cohen-Sutherland线段裁剪算法,中点分割线段裁剪算法,
Liang-Barsky裁剪算法等,掌握编码裁剪法的编程方法和步骤。
2、掌握多边形逐边裁剪(Sutherland-Hodgman)法的编程方法和步骤。
3、了解字符裁剪算法的原理与编程方法。
二、实验环境
实验设备:
计算机
实验使用的语言:
C或VisualC++、OpenGL
三、实验内容
1、实现直线的裁剪。
在屏幕上绘制出一个矩形作为裁剪边界,再用不同的颜色绘出几个由线段组成的简单几何图形,它们和裁剪边界可相交或不相交。
按一个键,实现一条线段的裁剪,裁剪后的线段可用另一种颜色绘制,继续按键,直至全部线段裁剪完。
2、实现多边形逐边裁剪算法。
四、实验步骤
1、Sutherland-Cohen(编码)裁剪算法用数组保存裁剪边界的坐标值和被裁剪边界的坐标值;根据逐边裁剪方法对被裁剪边界进裁剪,计算出裁剪后的坐标;再将裁剪后的直线用不同颜色绘制到屏幕上。
Sutherland-Cohen(编码)算法的思想是:
对于每条线段P1P2分为三种情况处理。
(1)若P1P2完全
在窗口内,则显示该线段P1P2简称取”之。
(2)若P1P2明显在窗口外,则丢弃该线段,简称弃”之。
(3)若线段既不满足“取”的条件,也不满足“弃”的条件,则在交点处把线段分为两段。
其中一段完全在窗口外,可弃之。
然后对另一段重复上述处理。
2、Sutherland-Hodgman多边形裁剪算法多边形裁剪算法的关键在于,通过裁剪,不仅要保留窗口内多边形的边界部分,而且要将窗框有关部分按一定的次序插入多边形保留边界之间,从而使多边形的边仍然保持封闭状态。
Sutherland-Hodgman多边形裁剪算法:
令多边形的顶点按边线逆时针走向排序Pi、P2、…、Pn,
多边形各边先与上窗框求交。
求交后删去多边形一窗框之上的部分,并插入窗边及延长线与多边形的交点之间的部分,从而形成一个新多边形。
然后,新的多边形按相同的方法与右窗框相剪裁。
如此重重,直至多边形与各窗框都裁剪完毕。
实验六三维图形变换
、实验目的
1、复习用二维平面来表示三维立体图形的正等测投影或斜二侧投影图形。
2、编程实现三维简单立体的平移变换、旋转变换、对称变换、变比变换、错切变换。
3、对变换后的简单三维几何体用正等测投影或斜二侧投影图形来表示。
4、用编写的绘制三维几何图形的函数。
、实验环境
实验设备:
计算机
实验使用的语言:
C或VisualC++、OpenGL
、实验内容
1、在屏幕上绘制出如下图所示或其他简单几何体的正等测投影的几何图形。
2、对上述简单三维几何体进行三维平移变换、旋转、缩放、对称等几何变换,用不同的颜色在屏幕上绘制出变换后的三维图形正等测投影图。
四、实验步骤
1、三维图形的变换实际上是一个变换矩阵,平面图形是由若干个三维点P(xi,yi,zi)组成,经过变换后的三维点P(xi,yi,zi),其变换公式为:
[xyz1]=[xyz1]?
T
对于不同的变换,都是用矩阵乘法来计算坐标,只需改变变换矩阵即可。
因此对每一种坐标变换可编成一个子程序。
2、变换后的三维点并不能直接在二维屏幕上绘制出来,必须用到前一个实验的内容,选用一
个轴测投影,将三维点经过轴测投影变换后,得出P*(x*i,y*i,z*i)
***?
?
?
[xyz1]=[xyz1]?
T正等测
3、编程时的技巧
用数组将三维图形的特征坐标点(顶点)保存,由特征坐标点(顶点)绘制出三维图形的命令(-
般由直线命令组成)编写一个绘图子程序,调用绘图子程序绘制出变换以前的图形(必须经过轴测投影
变换),根据不同的三维几何变换,选用相应三维坐标变换公式(调用相应的子程序)得出变换后的坐标;再经轴测投影变换后,得出P**(x*i,y*i,z*i),调用绘图子程序绘制出变换后的图形。
实验七Bezier曲线生成
一、实验目的
1、复习Bezier曲线参数表示法。
2、编程实现用二次Bezier曲线绘制。
3、编程实现用三次Bezier曲线绘制和分段光滑Bezier曲线图形的绘制。
二、实验环境
实验设备:
计算机
实验使用的语言:
C或VisualC++、OpenGL
三、实验内容
1、编程实现在屏幕上绘制出两次Bezie曲线的几何图形和特征多边形图形,对于直线和曲线设置不同的线形和颜色。
2、先在屏幕上绘制出三次Bezie曲线的几何图形和特征多边形图形,对于直线和曲线设置不同的线形和颜色。
3编程实现用分段三次Bezier曲线绘制光滑Bezier曲线图形。
四、实验步骤
1、二次Bezier曲线的计算公式为:
P(t)=(P0-2P1+P2)t2+(-2P0+2P1)t+P0
X(t)=(X0-2X1+X2)t2+(-2X0+2X1)t+X0
Y(t)=(Y0-2Y1+Y2)t2+(-2Y0+2Y1)t+Y0
其中P0、P1、P2为三个已知的点,坐标分别为(X0、Y0)、(X1、Y1)、(X1、Y2)。
2、三次Bezier曲线的计算公式为:
P(t)=(-P0+3P1-3P2+P3)t3+(3P0-6P1+3P2)t2+(-3P0+3P1)t+P0
32
X(t)=(-X0+3X1-3X2+X3)t3+(3X0-6X1+3X2)t2+(-3X0+3X1)t+X0
Y(t)=(-Y0+3Y1-3Y2+Y3)t3+(3Y0-6Y1+3Y2)t2+(-3Y0+3Y1)t+Y0
其中Po、Pi、P2、P3为四个已知的点,坐标分别为(Xo、Yo)、(XI、Yi)、(XI、Y2)、(X3、
Y3)。
3、程序设计方法
根据Bezier曲线的定义,输入Bezier曲线的特征多边形(例如三次Bezier曲线输入四
个型值点),然后把t从0~1分成n等分,按相应的Bezier曲线公式计算出Bezier曲线上的
Bezier曲
点,用绘直线段的方法依次这些点连接起来,就得到Bezier曲线。
如果要画多段线,可设置一些变量存放Bezier曲线的条数,按条数依次绘制出来即可。
实验八交互式绘图技术实现
、实验目的
1、掌握各种交互式绘图技术及其原理;
2、掌握VisualC++集成编程环境的使用,图形设备接口和常用图形程序设计、鼠标编程、画刷
与画笔以及菜单设计等,能够利用VisualC++实现各种交互式绘图技术;
3、了解OpenGL的基本操作及其库函数,能够通过OpenGL库函数实现各种交互式绘图技术。
、实验环境
实验设备:
计算机
实验使用的语言:
C或VisualC++、OpenGL
三、实验内容
1、用VisualC++设计一个简易的交互式绘图软件,能够实现铅笔绘图,以及直线、圆等基本图形的绘制;
2、能够实现橡皮筋画线或圆、拾取、拖动、撤销和重做等交互式技术;
3、能够用OpenGL函数库实现橡皮筋技术和拾取操作。
四、实验步骤
(一)铅笔绘图的实现:
1、建一个MFCAppWizard(exe)工程(具体操作见附录B),新增“绘图”菜单,并在该菜单下添加子菜单“铅笔”;
2、向视图类中添加1个菜单消息响应函数和3个鼠标消息响应函数,并输入时间处理程序代码。
(1)新增成员变量:
public:
intdrawMode;//画图模式,1表示铅笔
intisDrag;//鼠标是否是拖动,1表示拖动,0表示移动
CPointp0;〃铅笔的起点
(2)初始化变量:
CMy11View:
:
CMy11View()
{
//TODO:
addconstructioncodeheredrawMode=0;
isDrag=0;
}
(3)在消息响应函数中添加代码
voidCMy11View:
:
OnPen()〃“铅笔”菜单响应函数
{
//TODO:
AddyourcommandhandlercodeheredrawMode=1;//设置为铅笔模式
}
voidCMy11View:
:
OnLButtonDown(UINTnFlags,CPointpoint)
{
//TODO:
Addyourmessagehandlercodehereand/orcalldefault
isDrag=1;〃设置为拖动
pO=point;//记下起点
CView:
:
OnLButtonDown(nFlags,point);
}
voidCMy11View:
:
OnLButtonUp(UINTnFlags,CPointpoint)
{
//TODO:
Addyourmessagehandlercodehereand/orcalldefault
isDrag=0;〃设置为移动
CView:
:
OnLButtonUp(nFlags,point);
voidCMy11View:
:
OnMouseMove(UINTnFlags,CPointpoint){
//TODO:
Addyourmessagehandlercodehereand/orcalldefaultif(isDrag&&drawMode==1)//如果是鼠标拖动,且是铅笔模式
{
CDC*pdc=GetDC();pdc->MoveTo(pO);pdc->LineTo(point);
p0=point;
ReleaseDC(pdc);
}
CView:
:
OnMouseMove(nFlags,point);
}
(4)编译运行程序,验证运行结果。
(二)橡皮筋画直线的实现
(1)并在“绘图”菜单下再添加子菜单“直线”,添加“直线”菜单响应函数,并编写代码
voidCMy11View:
:
OnLine()//“直线”菜单响应函数
{
//TODO:
Addyourcommandhandlercodehere
drawMode=2;//设置为绘制直线模式
}
(2)新增成员变量
CPointp1;
(3)修改OnLButtonDown以及OnMouseMove函数的代码:
voidCMy11View:
:
OnLButtonDown(UINTnFlags,CPointpoint)
{
//TODO:
Addyourmessagehandlercodehereand/orcalldefault
isDrag=1;
p0=point;
p1=point;
CView:
:
OnLButtonDown(nFlags,point);
}
voidCMy11View:
:
OnMouseMove(UINTnFlags,CPointpoint)
{
//TODO:
Addyourmessagehandlercodehereand/orcalldefaultif(isDrag)//鼠标拖动
{
CDC*pdc=GetDC();
switch(drawMode)
{
case1:
pdc->MoveTo(pO);
pdc->LineTo(point);
p0=point;
break;〃铅笔绘图
case2:
pdc->SetROP2(R2_NOTXORPEN);〃采用异或模式绘图
pdc->MoveTo(pO);
pdc->LineTo(p1);//擦除原直线
pdc->MoveTo(pO);pdc->LineTo(point);
p1=point;
break;〃橡皮筋画直线
}
ReleaseDC(pdc);
}
CView:
:
OnMouseMove(nFlags,point);
}
(4)编译运行程序,验证运行结果。