计算机图形学实验三报告
计算机图形学实验报告3

学号计算机图形学实验报告实验三三维图形的投影变换学生姓名专业、班级地理信息系统指导教师任丽敏成绩电子与信息工程系2013 年 4月 26日天津城市建设学院设计性实验任务书电子与信息工程系地理信息系统专业2班姓名学号 :课程名称:计算机图形学设计题目:三维图形的投影变换达成限期:自2013年4月7日至2013年4月17日设计依照、要求及主要内容(可另加附页):1 设计依照 :本课程设计是依照教材 <<计算机计算机图形学 >> 一书的第 4 章三维图形的投影变换为设计依照 , 制作三维图形的投影变换的程序。
2 设计要求 :绘制三维物体的轴测投影图和一点透视图基本要求:(1)在程序中给定控制多面体的极点坐标及点线信息。
(2)视点固定在 z 轴某点上,输入物体的旋转角度及平移量。
(3)正轴测投影图和一点透视图。
附带要求:绘制二点透视图指导教师:任丽敏实验目的:工程制图中常用到的三视图,是由空间中一个立体向 3 个相互垂直的投影面作正投影获得的。
这三个正交的投影面分别称为:正立投影面(V 面)、侧立投影面( W面)、水平投影面( H 面)。
在空间坐标系中,这三个投影面分别对应三个坐标平面。
我们要编写程序实现三维物体的轴测投影图和一点透视图。
题目:绘制三维物体的轴测投影图和一点透视图。
(1)在程序中给定控制多面体的极点坐标及点线信息。
(2)视点固定在 z 轴某点上,输入物体的旋转角度及平移量。
(3)正轴测投影图和一点透视图。
设计思想:此次的实验与上一次实验最大的不一样之处在于要在二维的平面里显示三维的立体图,所以要绘制三维物体的轴测投影图和一点透视图,就需要进行三维坐标和二维坐标的变换(第一将二维变换到三维,而后再将三维变换到二维)。
所以,我第一找到自己定义的三维坐标系和原有的二维坐标系之间的变换关系式,而后直接引用正等侧投影的矩阵对原有的图进行了变换,实现了正轴测投影图。
原程序:一、在二维平面绘制三维立体图运转结果:二、正等侧投影图运转结果:3、一点透视图运转结果领会:此次的实验最大的打破口就是在二维平面实现三维立体图形的绘制,要找出三维坐标和二维坐标之间的关系,实现它们之间的变换,而后能够依据图形的形成过程,进行坐标变换就能够实现了。
计算机图形学实验报告3 - Bresenham画线

在大括号内填入以下代码
CDC *pDC=GetDC();
int k;
double x1=10,y1=10,x2=200,y2=150;
double x,y,deltx,delty,E;
deltx=x2-x1;delty=y2-y1;
x=x1;y=y1;k=1;
if(deltx>0&&delty>0)
3.Object IDs选择ID_Bresenham,Messages选择COMMAND
4.点击Add Function,点击OK,点击Edit Code,进入编辑函数的界面([项目名]View.cpp)
void C[项目名]View::OnBresenham()
{
// TODO: Add your command handler code here
实验要求:
掌握Bresenham画线算法
实验仪器:
软件:VC++6.0,windows XP
硬件:计算机
实验步骤、内容:
一、新建MFC工程
1.开始所有程序Microsoft Visual C++ 6.0Microsoft Visual C++ 6.0
2.文件-->新建-->工程,工程名称填[项目名],左边的类型选择MFC AppWizard [exe],点击确定
{
if(fabs(deltx)>fabs(dfor(k=1;k<=fabs((int)deltx);k++)
{
pDC->SetPixel((int)x,(int)y,RGB(0,0,0));
E+=(2*delty);
计算机图形学课程设计实验报告

《计算机图形学》实验报告班级计算机科学与技术姓名学号2014 年6 月2 日实验一基本图形生成算法一、实验目的:1、掌握中点Bresenham绘制直线的原理;2、设计中点Bresenham算法;3、掌握八分法中点Bresenham算法绘制圆的原理;4、设计八分法绘制圆的中点Bresenham算法;5、掌握绘制1/4椭圆弧的上半部分和下半部分的中点Bresenham算法原理;6、掌握下半部分椭圆偏差判别式的初始值计算方法;7、设计顺时针四分法绘制椭圆的中点Bresenham算法。
二、实验过程:1、实验描述实验1:使用中点Bresenham算法绘制斜率为0<=k<=1的直线。
实验2:使用中点Bresenham算法绘制圆心位于屏幕客户区中心的圆。
实验3:使用中点Bresenham算法绘制圆心位于屏幕客户区中心的椭圆。
2、实验过程1)用MFC(exe)建立一个单文档工程;2)编写对话框,生成相应对象,设置相应变量;3)在类CLineView中声明相应函数,并在相关的cpp文件中实现;4)在OnDraw()函数里调用函数实现绘制直线、圆、椭圆;5)运行程序,输入相应值,绘制出图形。
三、源代码实验1:直线中点Bresenham算法1.// cline.cpp : implementation file// cline dialogcline::cline(CWnd* pParent /*=NULL*/): CDialog(cline::IDD, pParent){//{{AFX_DATA_INIT(cline)m_x0 = 0;m_y0 = 0;m_x1 = 0;m_y1 = 0;//}}AFX_DATA_INIT}void cline::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(cline)DDX_Text(pDX, IDC_x0, m_x0);DDX_Text(pDX, IDC_y0, m_y0);DDX_Text(pDX, IDC_x1, m_x1);DDX_Text(pDX, IDC_y1, m_y1);//}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(cline, CDialog)//{{AFX_MSG_MAP(cline)//}}AFX_MSG_MAPEND_MESSAGE_MAP()2、// LineView.hclass CLineView : public CView{public:CLineDoc* GetDocument();..........void Mbline(double,double,double,double); //直线中点Bresenham函数.......}3、// Line.cpp//*******************直线中点Bresenham函数*********************/void CLineView::Mbline(double x0, double y0, double x1, double y1) {CClientDC dc(this);COLORREF rgb=RGB(0,0,255); //定义直线颜色为蓝色double x,y,d,k;x=x0; y=y0; k=(y1-y0)/(x1-x0); d=0.5-k;for(x=x0;x<=x1;x++){dc.SetPixel((int)x,(int)y,rgb);if(d<0){y++;d+=1-k;}elsed-=k;}}4、//LineView.cppvoid CLineView::OnDraw(CDC* pDC){CLineDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for native data herecline a;a.DoModal();//初始化CLineView::Mbline(a.m_x0,a.m_y0,a.m_x1,a.m_y1); }实验2:圆中点Bresenham算法1、//cricle.cpp// Ccricle dialogCcricle::Ccricle(CWnd* pParent /*=NULL*/): CDialog(Ccricle::IDD, pParent){//{{AFX_DATA_INIT(Ccricle)m_r = 0;//}}AFX_DATA_INIT}void Ccricle::DoDataExchange(CDataExchange* pDX) {CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(Ccricle)DDX_Text(pDX, r_EDIT, m_r);//}}AFX_DATA_MAP}2、//CcircleView.hclass CCcircleView : public CView{.......public:CCcircleDoc* GetDocument();void CirclePoint(double,double); //八分法画圆函数void Mbcircle(double); //圆中点Bresenham函数........}3、//CcircleView.cppvoid CCcircleView::OnDraw(CDC* pDC){CCcircleDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for native data hereCcricle r;r.DoModal();CCcircleView::Mbcircle(r.m_r);//画圆}4、//CcircleView.cpp//*******************八分法画圆*************************************/ void CCcircleView::CirclePoint(double x,double y){CClientDC dc(this);COLORREF rgb=RGB(0,0,255);dc.SetPixel((int)(300+x),(int)(300+y),rgb);dc.SetPixel((int)(300-x),(int)(300+y),rgb);dc.SetPixel((int)(300+x),(int)(300-y),rgb);dc.SetPixel((int)(300-x),(int)(300-y),rgb);dc.SetPixel((int)(300+y),(int)(300+x),rgb);dc.SetPixel((int)(300-y),(int)(300+x),rgb);dc.SetPixel((int)(300+y),(int)(300-x),rgb);dc.SetPixel((int)(300-y),(int)(300-x),rgb);}//**************************圆中点Bresenham函数*********************/ void CCcircleView::Mbcircle(double r){double x,y,d;COLORREF rgb=RGB(0,0,255);d=1.25-r;x=0;y=r;for(x=0;x<y;x++){CirclePoint(x,y); //调用八分法画圆子函数if(d<0)d+=2*x+3;else{d+=2*(x-y)+5;y--;}}}实验3:椭圆中点Bresenham算法1、//ellipse1.cpp// Cellipse dialogCellipse::Cellipse(CWnd* pParent /*=NULL*/) : CDialog(Cellipse::IDD, pParent){//{{AFX_DATA_INIT(Cellipse)m_a = 0;m_b = 0;//}}AFX_DATA_INIT}void Cellipse::DoDataExchange(CDataExchange* pDX) {CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(Cellipse)DDX_Text(pDX, IDC_EDIT1, m_a);DDX_Text(pDX, IDC_EDIT2, m_b);//}}AFX_DATA_MAP}2、//EllipseView.hclass CEllipseView : public CView{......................public:CEllipseDoc* GetDocument();void EllipsePoint(double,double); //四分法画椭圆void Mbellipse(double a, double b); //椭圆中点Bresenham函数..................}3、//Ellipse.cpp//*****************四分法画椭圆********************************/void CEllipseView::EllipsePoint(double x,double y){CClientDC dc(this);COLORREF rgb=RGB(0,0,255);dc.SetPixel((int)(300+x),(int)(300+y),rgb);dc.SetPixel((int)(300-x),(int)(300+y),rgb);dc.SetPixel((int)(300+x),(int)(300-y),rgb);dc.SetPixel((int)(300-x),(int)(300-y),rgb);}//************************椭圆中点Bresenham函数*********************/ void CEllipseView::Mbellipse(double a, double b){double x,y,d1,d2;x=0;y=b;d1=b*b+a*a*(-b+0.25);EllipsePoint(x,y);while(b*b*(x+1)<a*a*(y-0.5))//椭圆AC弧段{if(d1<0)d1+=b*b*(2*x+3);else{d1+=b*b*(2*x+3)+a*a*(-2*y+2);y--;}x++;EllipsePoint(x,y);}d2=b*b*(x+0.5)*(x+0.5)+a*a*(y-1)*(y-1)-a*a*b*b;//椭圆CB弧段while(y>0){if(d2<0){d2+=b*b*(2*x+2)+a*a*(-2*y+3);x++;}elsed2+=a*a*(-2*y+3);y--;EllipsePoint(x,y);}}4、//EllipseView.cppvoid CEllipseView::OnDraw(CDC* pDC){CEllipseDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for native data hereCellipse el;el.DoModal();//初始化CEllipseView::Mbellipse(el.m_a, el.m_b);//画椭圆}四、实结果验实验1:直线中点Bresenham算法实验2:圆中点Bresenham算法实验3:椭圆中点Bresenham算法实验二有效边表填充算法一、实验目的:1、设计有效边表结点和边表结点数据结构;2、设计有效边表填充算法;3、编程实现有效边表填充算法。
计算机图形学实验报告

计算机图形学实验报告
实验目的:通过本次实验,深入了解并掌握计算机图形学的基本原理和相关技术,培养对图形处理的理解和能力。
实验内容:
1. 图像的基本属性
- 图像的本质及表示方法
- 像素和分辨率的概念
- 灰度图像和彩色图像的区别
2. 图像的处理技术
- 图像的采集和处理
- 图像的变换和增强
- 图像的压缩和存储
3. 计算机图形学的应用
- 图像处理在生活中的应用
- 计算机辅助设计中的图形学应用
- 三维建模和渲染技术
实验步骤和结果:
1. 在计算机图形学实验平台上加载一张测试图像,分析其像素构成
和基本属性。
2. 运用图像处理技术,对测试图像进行模糊、锐化、色彩调整等操作,观察处理后的效果并记录。
3. 学习并掌握计算机图形学中常用的处理算法,如卷积、滤波等,
尝试应用到测试图像上并进行实验验证。
4. 探讨计算机图形学在数字媒体制作、虚拟现实、计算机辅助设计
等领域的应用案例,并总结其在实践中的重要性和价值。
结论:
通过本次实验,我对计算机图形学有了更深入的了解,掌握了图像
处理技术的基本原理和应用方法。
计算机图形学作为一门重要的学科,对多个领域有着广泛的应用前景,有助于提高数字媒体技术、虚拟现
实技术等领域的发展水平。
希望在未来的学习和工作中能进一步深化
对计算机图形学理论和实践的研究,不断提升自己在这一领域的专业
能力和创新意识。
计算机图形学-实验报告3-透视投影算法

实验地点
软件实验室
指导教师
李丽亚
在屏幕客户区中心绘制立方体的透视投影线框模型使用工具栏的动画图标按钮或键盘上的方向键旋转视点观察立方体生成立方体的旋转动画
实验报告
课ห้องสมุดไป่ตู้名称
班级
班级学号
姓名
实验日期
成绩
实验题目
透视投影算法
一、实验目的:
观察变换矩阵
透视投影变换矩阵
一点透视
二点透视
三点透视
二、实验内容:
在屏幕客户区中心绘制立方体的透视投影线框模型,使用工具栏的“动画”图标按钮或键盘上的方向键旋转视点观察立方体,生成立方体的旋转动画。选择工具栏的123图标按钮分别绘制立方体线框模型的一点透视图,二点透视图,三点透视图。
三、实验步骤:
(1)读入立方体8个顶点构成的顶点表与6个表面构成的表面表。
(2)使用透视投影矩阵在屏幕坐标系绘制立方体的透视投影。
(3)旋转视点观察立方体的透视投影。
(4)使用鼠标左键增加视径,缩小立方体的透视投影。
(5)使用鼠标左键减小视径,放大立方体的透视投影。
(6)使用双缓冲技术绘制立方体旋转动画。
《计算机图形学》实验报告

《计算机图形学》实验报告一、实验目的计算机图形学是一门研究如何利用计算机生成、处理和显示图形的学科。
通过本次实验,旨在深入理解计算机图形学的基本原理和算法,掌握图形的生成、变换、渲染等技术,并能够运用所学知识解决实际问题,提高对图形学的应用能力和编程实践能力。
二、实验环境本次实验使用的编程语言为 Python,使用的图形库为 Pygame。
开发环境为 PyCharm。
三、实验内容1、直线的生成算法DDA 算法(Digital Differential Analyzer)Bresenham 算法DDA 算法是通过计算直线的斜率来确定每个像素点的位置。
它的基本思想是根据直线的斜率和起始点的坐标,逐步计算出直线上的每个像素点的坐标。
Bresenham 算法则是一种基于误差的直线生成算法。
它通过比较误差值来决定下一个像素点的位置,从而减少了计算量,提高了效率。
在实验中,我们分别实现了这两种算法,并比较了它们的性能和效果。
2、圆的生成算法中点画圆算法中点画圆算法的核心思想是通过判断中点的位置来确定圆上的像素点。
通过不断迭代计算中点的位置,逐步生成整个圆。
在实现过程中,需要注意边界条件的处理和误差的计算。
3、图形的变换平移变换旋转变换缩放变换平移变换是将图形在平面上沿着指定的方向移动一定的距离。
旋转变换是围绕一个中心点将图形旋转一定的角度。
缩放变换则是改变图形的大小。
通过矩阵运算来实现这些变换,可以方便地对图形进行各种操作。
4、图形的填充种子填充算法扫描线填充算法种子填充算法是从指定的种子点开始,将相邻的具有相同颜色或属性的像素点填充为指定的颜色。
扫描线填充算法则是通过扫描图形的每一行,确定需要填充的区间,然后进行填充。
在实验中,我们对不同形状的图形进行了填充,并比较了两种算法的适用情况。
四、实验步骤1、直线生成算法的实现定义直线的起点和终点坐标。
根据所选的算法(DDA 或Bresenham)计算直线上的像素点坐标。
计算机图形学实验报告

实验结果与结论
• 在本次实验中,我们成功地实现了复杂场景的渲染,得到了具有较高真实感和视觉效果的图像。通过对比 实验前后的效果,我们发现光线追踪和着色器的运用对于提高渲染质量和效率具有重要作用。同时,我们 也发现场景图的构建和渲染脚本的编写对于实现复杂场景的渲染至关重要。此次实验不仅提高了我们对计 算机图形学原理的理解和实践能力,也为我们后续深入研究渲染引擎的实现提供了宝贵经验。
2. 通过属性设置和变换操作,实现了对图形的定 制和调整,加深了对图形属性的理解。
4. 实验的不足之处:由于时间限制,实验只涉及 了基本图形的绘制和变换,未涉及更复杂的图形 处理算法和技术,如光照、纹理映射等。需要在 后续实验中进一步学习和探索。
02
实验二:实现动画效果
实验目的
掌握动画的基本原 理和实现方法
04
实验四:渲染复杂场景
实验目的
掌握渲染复杂场景的基本流程和方法 理解光线追踪和着色器在渲染过程中的作用
熟悉渲染引擎的实现原理和技巧 提高解决实际问题的能力
实验步骤
• 准备场景文件 • 使用3D建模软件(如Blender)创建或导入场景模型,导出为常用的3D格式(如.obj或.fbx)。 • 导入场景文件 • 在渲染引擎(如Unity或Unreal Engine)中导入准备好的场景文件。 • 构建场景图 • 根据场景的层次结构和光照需求,构建场景图(Scene Graph)。 • 设置光照和材质属性 • 为场景中的物体设置光照和材质属性(如漫反射、镜面反射、透明度等)。 • 编写渲染脚本 • 使用编程语言(如C或JavaScript)编写渲染脚本,控制场景中物体的渲染顺序和逻辑。 • 运行渲染程序 • 运行渲染程序,观察渲染结果。根据效果调整光照、材质和渲染逻辑。 • 导出渲染图像 • 将渲染结果导出为图像文件(如JPEG或PNG),进行后续分析和展示。
计算机图形学实验报告实验三

贵州大学实验报告学院:计算机科学与信息学院专业:计科班级:计科101(2)把这些交点的x坐标值以升序排列;(3)对每一对交点间的区域进行填充。
第三个步骤是从奇数个交点出发到偶数个交点。
如上图,对y=8的扫描线排序x坐标得到的表是(2,4,9,13),然后对交点2与4之间、9与13之间的所有象素点进行填充。
边界上的象素:“左闭右开”,“下闭上开”(将左边界和下边界的点算为内部,而将右边界和上边界算为外部)顶点:“上开下闭”。
区域填充算法:算法原理:区域填充–对区域重新着色的过程。
(1)将指定的颜色从种子点扩展到整个区域的过程(2)区域填充算法要求区域是连通的连通性: 4连通、8连通算法实现简单描述:堆栈结构实现种子算法,四向算法:1、种子象素压入堆栈2、若堆栈非空,即有区域中象素在堆栈中,做如下循环:A.栈顶象素出栈;B.将出栈象素置为多边形颜色;C.按左、上、右、下四个方向左右顺序检查与出栈象素相邻的四个象边缘填充算法与扫描线法的比较:适合用于具有帧缓存的图形系统。
处理后,按扫描线顺序读出帧缓存的内容,送入显示设备。
优点:边缘填表充法的数据结构和程序结构都比扫描线法简单缺点:对于复杂图形,每一象素可能被访问多次,输入/输出的量比扫描线算法大得多。
要对帧缓存的大量象素反复赋值,速度较慢,并难于用图元填充。
边标志算法(轮廓填充算法)改进的边填充法:优点:对每个象素只访问一次。
不必建立、维护边表及对边表进行排序,适于硬件实现。
步骤:1、对多边形的每条边进行直线扫描变换,即将多边形经过的象素打上边标志;2、填充,即对每条多边形相交的扫描线依次从左到右逐个访问该扫描线上的象素;使用一个布尔变量inside 来指示当前点的状态(inside的初始值为False) ,若当前象素在多边形内部,则inside为真,反之为假。
若当前象素为打上边标志的点,就将inside取反(为 True),对未打标志的象素,inside不变仍为False。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
计算机科学与通信工程学院实验报告课程计算机图形学实验题目二维图形变换学生姓名学号专业班级指导教师日期成绩评定表二维图形变换1. 实验内容完成对北极星图案的缩放、平移、旋转、对称等二维变换。
提示:首先要建好图示的北极星图案的数据模型(顶点表、边表)。
另外,可重复调用“清屏”和“暂停”等函数,使整个变换过程具有动态效果。
2. 实验环境软硬件运行环境:Windows XP开发工具:visual studio 20083. 问题分析4. 算法设计程序框架://DiamondView.hclass CDiamondView : public CView{……public://参数输入和提示对话框void Polaris();//北极星……};//DiamondView.cppvoid 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);POINTvertex1[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);newPen1.DeleteObject();newPen1.CreatePen(PS_SOLID, 2, RGB(255,0,90));oldPen = pDC->SelectObject(&newPen1);POINTvertex4[11]={{x[12],y[12]},{x[13],y[13]},{x[3],y[3]},{x[9],y[9]},{x[14],y[14]},{x[15],y[15]}, {x[3],y[3]},{x[11],y[11]},{x[12],y[12]},{x[3],y[3]},{x[14],y[14]}};pDC->Polyline(vertex4, 11);newPen1.DeleteObject();newPen1.CreatePen(PS_SOLID, 2, RGB(0,100,255));oldPen = pDC->SelectObject(&newPen1);POINT vertex5[5]={{x[15],y[15]},{x[16],y[16]},{x[3],y[3]},{x[16],y[16]},{x[7],y[7]}};pDC->Polyline(vertex5, 5);POINT vertex6[5]={{x[2],y[2]},{x[17],y[17]},{x[3],y[3]},{x[17],y[17]},{x[13],y[13]}};pDC->Polyline(vertex6, 5);pDC->SelectObject(oldPen);Sleep(10);}void CDiamondView::Polaris(){InvalidateRgn(NULL);UpdateWindow();CDC *pDC = GetDC();long x[18],y[18];x[1]=553,y[1]=100;x[2]=515,y[2]=251;x[3]=553,y[3]=338;x[4]=516,y[4]=426;x[5]=553,y[5]=551;x[6]=589,y[6]=253;x[7]=591,y[7]=426;x[8]=678,y[8]=212;x[9]=641,y[9]=311;x[10]=454,y[10]=438;x[11]=478,y[11]=364;x[12]=415,y[12]=338;x[13]=466,y[13]=301;x[14]=703,y[14]=338;x[15]=640,y[15]=375;x[16]=665,y[16]=450;x[17]=440,y[17]=226;hzbjx(pDC,x,y);Sleep(500); InvalidateRect(NULL); UpdateWindow();long x1[18],y1[18]; //缩小for(double n=1;n>=0.5;n-=0.01){for (int i=1;i<18;i++){x1[i]=Round(x[i]*n);y1[i]=Round(y[i]*n);}hzbjx(pDC,x1,y1);Sleep(10);InvalidateRect(NULL);UpdateWindow();}InvalidateRect(NULL); UpdateWindow();long x2[18],y2[18]; //放大for(double n=1;n<=1.5;n+=0.01) {for (int i=1;i<18;i++){x2[i]=Round(x1[i]*n);y2[i]=Round(y1[i]*n);}hzbjx(pDC,x2,y2);Sleep(10);InvalidateRect(NULL);UpdateWindow();}InvalidateRect(NULL); UpdateWindow();hzbjx(pDC,x,y);Sleep(500);long x3[18],y3[18]; //沿X轴平移for(int n=0;n<=300;n+=2){for(int j=1;j<18;j++){x3[j]=x[j]+n;y3[j]=y[j];}hzbjx(pDC,x3,y3);Sleep(1);InvalidateRect(NULL); UpdateWindow();}long x4[18],y4[18]; //沿Y轴平移for(int n=0;n<=300;n+=2){for(int j=1;j<18;j++){x4[j]=x3[j];y4[j]=y3[j]+n;}hzbjx(pDC,x4,y4);Sleep(1);InvalidateRect(NULL);UpdateWindow();}long x5[18],y5[18]; //顺时针旋转for (double t=0;t<=PI;t+=0.01){for(int k=1;k<18;k++){x5[k]=Round(x[k]*cos(t)-y[k]*sin(t)-x[3]*cos(t)+y[3]*sin(t)+x[3]);y5[k]=Round(x[k]*sin(t)+y[k]*cos(t)-x[3]*sin(t)-y[3]*cos(t)+y[3]);}hzbjx(pDC,x5,y5);InvalidateRect(NULL);UpdateWindow();}Sleep(500);long x6[18],y6[18]; //逆时针旋转for (double t=PI;t>=0;t-=0.01){for(int k=1;k<18;k++){x6[k]=Round(x[k]*cos(t)-y[k]*sin(t)-x[3]*cos(t)+y[3]*sin(t)+x[3]);y6[k]=Round(x[k]*sin(t)+y[k]*cos(t)-x[3]*sin(t)-y[3]*cos(t)+y[3]);}hzbjx(pDC,x6,y6);InvalidateRect(NULL);UpdateWindow();}Sleep(500);long x7[18],y7[18];//沿X=1000对称for(int l=1;l<18;l++){x[l]=Round(x[l]*0.5);y[l]=Round(y[l]*0.5);x7[l]=1000-x[l];y7[l]=y[l];}hzbjx(pDC,x,y);hzbjx(pDC,x7,y7);Sleep(200);long x8[18],y8[18];//沿Y=600对称for(int l=1;l<18;l++){x8[l]=x[l];y8[l]=600-y[l];}hzbjx(pDC,x,y);hzbjx(pDC,x8,y8);Sleep(200);long x9[18],y9[18];for(int l=1;l<18;l++){x9[l]=1000-x[l];y9[l]=600-y[l];}hzbjx(pDC,x,y);hzbjx(pDC,x9,y9);}6. 程序运行结果图1 北极星图案的数据模型图2 北极星图案的缩放图3 北极星图案的平移图4 北极星图案的旋转图5 北极星图案的对称7. 总结在这次的实验中,按照图形变换的基本原理,我简单实现了图形的几种变换。
但是由于自己对函数的运用的不太熟悉,因此,在这次的实验中遇到一些困难,以后要在这方面有所改进。
通过这次的实验,知道了如何利用程序进行二维图形的一些基本变换,在以后的学习过程中要不断努力。