计算机图形学实验三报告
计算机图形学实验报告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。
计算机图形学作业实验报告
计算机图形学实验报告班级:学号:姓名:指导教师:完成日期:实验一:多边形填充一、实验目的了解多边形属性,熟悉相关函数的调用。
二、实验内容步骤和实现:首先进行初始化工作,进行显示模式(单缓冲区)和窗口等设定,主要实现根据两个函数,一个是指定场景绘制函数,glutDisplayFunc(Paint),paint函数中设置了两个三角形,一个填充,一个不填充。
用到了启用多边形点画模式glEnable(GL_POL YGON_STIPPLE)的函数,和指定多边形点画模式(填充) glPolygonStipple(fly)的函数。
另外一个就是循环执行OpenGl命令的glutMainLoop()函数。
三、实验结果四、源程序// POL Y_STIPPLE.C#include <gl/glut.h>void makeObject() // 定义一个三角形{ glBegin(GL_TRIANGLES); // 开始定义三角形// 按逆时针方向指定三角形的顶点坐标glVertex2f(-0.95, -0.95);glVertex2f(0.95, -0.95);glVertex2f(0, 0.95);glEnd(); // 三角形定义结束}void display(){ GLsizei w = glutGet(GLUT_WINDOW_WIDTH); // 程序窗口宽度GLsizei h = glutGet(GLUT_WINDOW_HEIGHT); // 程序窗口高度GLubyte fly[] = // 第二个三角形点画模式的mask值{ 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, // 0X03, 0X80, 0X01, 0XC0, 0X06, 0XC0, 0X03, 0X60, //0X04, 0X60, 0X06, 0X20, 0X04, 0X30, 0X0C, 0X20, //0X04, 0X18, 0X18, 0X20, 0X04, 0X0C, 0X30, 0X20, //0X04, 0X06, 0X60, 0X20, 0X44, 0X03, 0XC0, 0X22, //0X44, 0X01, 0X80, 0X22, 0X44, 0X01, 0X80, 0X22, //0X44, 0X01, 0X80, 0X22, 0X44, 0X01, 0X80, 0X22, //0X44, 0X01, 0X80, 0X22, 0X44, 0X01, 0X80, 0X22, //0X66, 0X01, 0X80, 0X66, 0X33, 0X01, 0X80, 0XCC, //0X19, 0X81, 0X81, 0X98, 0X0C, 0XC1, 0X83, 0X30, //0X07, 0XE1, 0X87, 0XE0, 0X03, 0X3F, 0XFC, 0XC0, //0X03, 0X31, 0X8C, 0XC0, 0X03, 0X33, 0XCC, 0XC0, //0X06, 0X64, 0X26, 0X60, 0X0C, 0XCC, 0X33, 0X30, //0X18, 0XCC, 0X33, 0X18, 0X10, 0XC4, 0X23, 0X08, //0X10, 0X63, 0XC6, 0X08, 0X10, 0X30, 0X0C, 0X08, //0X10, 0X18, 0X18, 0X08, 0X10, 0X00, 0X00, 0X08 };glClear(GL_COLOR_BUFFER_BIT); // 清除颜色缓冲区glViewport(0, 0, w / 2, h); // 第一个视口,显示第一个三角形glColor3f(1, 1, 1); // 设置颜色,白色,默认值makeObject(); // 第一个三角形glViewport(w / 2, 0, w / 2, h); // 第二个视口,显示第二个三角形glColor3f(1, 0, 0); // 设置颜色,红色glEnable(GL_POL YGON_STIPPLE); // 启用多边形点画模式glPolygonStipple(fly); // 指定多边形点画模式(填充)makeObject(); // 第二个三角形glDisable(GL_POL YGON_STIPPLE); // 关闭多边形点画模式glFlush(); // 强制OpenGL命令序列在有限的时间内完成执行}int main(){ glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA);// 设置程序窗口的显示模式(单缓冲区、RGBA颜色模型)glutInitWindowPosition(100, 100); // 程序窗口的位置glutInitWindowSize(300, 150); // 程序窗口的大小glutCreateWindow("一个填充多边形的例子!"); // 窗口的标题glutDisplayFunc(display); // 指定场景绘制函数glutMainLoop(); // 开始循环执行OpenGL命令}实验二:基本图元绘制二、实验目的了解OpenGL图形软件包绘制图形的基本过程及其程序框架,并在已有的程序框架中添加代码实现直线和圆的生成算法,演示直线和圆的生成过程,从而加深对直线和圆等基本图形生成算法的理解。
计算机图形学实验报告
计算机图形学实验报告计算机图形学实验报告引言计算机图形学是研究计算机生成和处理图像的学科,它在现代科技和娱乐产业中扮演着重要的角色。
本实验报告旨在总结和分享我在计算机图形学实验中的经验和收获。
一、实验背景计算机图形学实验是计算机科学与技术专业的一门重要课程,通过实践操作和编程,学生可以深入了解图形学的基本原理和算法。
本次实验主要涉及三维图形的建模、渲染和动画。
二、实验内容1. 三维图形建模在实验中,我们学习了三维图形的表示和建模方法。
通过使用OpenGL或其他图形库,我们可以创建基本的几何体,如立方体、球体和圆柱体,并进行变换操作,如平移、旋转和缩放。
这些基本操作为后续的图形处理和渲染打下了基础。
2. 光照和着色光照和着色是图形学中重要的概念。
我们学习了不同的光照模型,如环境光、漫反射和镜面反射,并了解了如何在三维场景中模拟光照效果。
通过设置材质属性和光源参数,我们可以实现逼真的光照效果,使物体看起来更加真实。
3. 纹理映射纹理映射是一种将二维图像映射到三维物体表面的技术。
通过将纹理图像与物体的顶点坐标相对应,我们可以实现更加细致的渲染效果。
在实验中,我们学习了纹理坐标的计算和纹理映射的应用,使物体表面呈现出具有纹理和细节的效果。
4. 动画和交互动画和交互是计算机图形学的重要应用领域。
在实验中,我们学习了基本的动画原理和算法,如关键帧动画和插值技术。
通过设置动画参数和交互控制,我们可以实现物体的平滑移动和变形效果,提升用户体验。
三、实验过程在实验过程中,我们首先熟悉了图形库的使用和基本的编程技巧。
然后,我们按照实验指导书的要求,逐步完成了三维图形建模、光照和着色、纹理映射以及动画和交互等任务。
在实验过程中,我们遇到了许多挑战和问题,但通过不断的尝试和调试,最终成功实现了预期的效果。
四、实验结果通过实验,我们成功实现了三维图形的建模、渲染和动画效果。
我们可以通过键盘和鼠标控制物体的移动和变形,同时观察到真实的光照效果和纹理映射效果。
工作报告之计算机图形学实验报告
工作报告之计算机图形学实验报告计算机图形学实验报告【篇一:计算机图形学实验报告及代码】第1 章概述一、教学目标通过本章的学习,使学生能够了解计算机图形学的基本概念、研究内容;当前的发展概况;本门课程的特点和应用。
二、教学要求1. 了解计算机图形学的概念和研究内容;2. 了解本门课程的发展概况。
三、教学内容提要1. 计算机图形学的研究内容2. 计算机图形学发展概况3. 计算机图形学特点和应用4. 计算机图形学当前研究的课题5. 计算机图形生成和输出的流水线四、教学重点、难点及解决方法本章将主要围绕计算机图形学的基本概念进行介绍,介绍研究内容;当前的发展概况;本门课程的特点和应用等等。
五、课时安排2学时六、教学设备多媒体七、检测教学目标实现程度的具体措施和要求通过课堂提问的方式来检测学生对基本概念的掌握程度。
八、教学内容1.1 计算机图形学的研究内容计算机图形学(computer graphics): 研究通过计算机将数据转换为图形,并在专用显示设备上显示的原理、方法和技术的学科。
计算机图形表现形式(1).线条式(线框架图)用线段来表现图形,容易反映客观实体的内部结构,如各类工程技术中结构图的表示,机械设计中零件结构图及电路设计中的电路原理图等。
具有面模型、色彩、浓淡和明暗层次效应,适合表现客观实体的外形或外貌,如汽车、飞机、轮船等的外形设计以及各种艺术品造型设计等。
(2).真实感面模型图形跑车靓照计算机图形分类(空间)(1).二维图形(2d):在平面坐标系中定义的图形(2).三维图形(3d):在三维坐标系中定义的图形计算机图形产生方法(1).矢量法(短折线法)任何形状的曲线都用许多首尾相连的短直线(矢量)逼近。
(2).描点法(像素点串接法)每一曲线都是由一定大小的像素点组成计算机绘图方式:(1)交互式绘图允许操作者以某种方式(对话方式或命令方式)来控制和操纵图形生成过程,使得图形可以边生成、边显示、边修改,直至符合要求为止。
计算机图形实验报告
计算机图形实验报告计算机图形实验报告引言:计算机图形学是一门研究如何使用计算机生成、处理和显示图像的学科。
在现代科技的发展中,计算机图形学的应用越来越广泛,涉及到许多领域,如电影制作、游戏开发、虚拟现实等。
本实验报告将介绍我在计算机图形实验中的学习和实践经验。
一、实验目的本次实验的主要目的是通过学习和实践,掌握计算机图形学的基本概念和技术。
具体来说,我们将学习如何使用计算机编程语言实现简单的图形绘制、变换和渲染等功能。
二、实验过程1. 学习基本概念在开始实验之前,我们首先学习了计算机图形学的基本概念,包括点、线、多边形等基本图元的表示方法,以及坐标系统和颜色模型等相关知识。
这些基础概念为后续的实验操作打下了坚实的基础。
2. 图形绘制在实验中,我们使用了一种编程语言来实现图形的绘制。
通过编写代码,我们可以在计算机屏幕上绘制出各种形状的图形,如直线、矩形、圆等。
这些图形的绘制是通过计算机的像素点来实现的,我们可以通过改变像素点的颜色和位置来绘制出不同的图形。
3. 图形变换除了图形的绘制,我们还学习了图形的变换技术。
通过对图形进行平移、旋转、缩放等操作,我们可以改变图形的位置、大小和形状。
这些变换操作可以通过矩阵运算来实现,通过改变矩阵的数值,我们可以对图形进行不同的变换操作。
4. 图形渲染图形渲染是计算机图形学中的一个重要环节。
通过对图形进行光照、阴影和纹理等处理,我们可以使图形看起来更加真实和逼真。
在实验中,我们学习了一些基本的渲染算法,如平均法线法、Phong光照模型等,通过应用这些算法,我们可以实现不同材质和光照条件下的图形渲染效果。
三、实验结果通过实验,我们成功地实现了一些基本的图形绘制、变换和渲染功能。
我们可以在计算机屏幕上绘制出各种形状的图形,并对其进行平移、旋转、缩放等操作。
同时,我们还实现了简单的光照和阴影效果,使图形看起来更加真实和立体。
四、实验总结通过本次实验,我对计算机图形学有了更深入的了解。
计算机图形学实验报告三
《计算机图形学》实验报告glClear(GL_COLOR_BUFFER_BIT);//glEnable(GL_SCISSOR_TEST);//glScissor(0.0f,0.0f,500,300);glutWireTeapot(0.4);glFlush();}//窗口调整子程序void myReshape(int w, int h){glViewport(500, -300, (GLsizei)w, (GLsizei)h);glMatrixMode(GL_PROJECTION);glLoadIdentity();if (w <= h)glOrtho(-1, 1, -(float)h / w, (float)h / w, -1, 1);elseglOrtho(-(float)w / h, (float)w / h, -1, 1, -1, 0.5);}2,使用opengl函数写一个图形程序,要求分别使用三个光源从一个茶壶的前右上方(偏红色),正左侧(偏绿色)和前左下方(偏蓝色)对于其进行照射,完成程序并观察效果。
}//绘图子程序void display(void){glColor3f(1.0, 1.0, 0.0);glClear(GL_COLOR_BUFFER_BIT);//glMatrixMode(GL_MODELVIEW);//glLoadIdentity();//设置光源的属性1GLfloat LightAmbient1[] = { 1.0f, 0.0f, 0.0f, 1.0f }; //环境光参数 ( 新增 )GLfloat LightDiffuse1[] = { 1.0f, 0.0f, 0.0f, 1.0f }; // 漫射光参数 ( 新增 )GLfloat Lightspecular1[] = { 1.0f, 0.0f, 0.0f, 1.0f }; // 镜面反射GLfloat LightPosition1[] = { 500.0f, 500.0f, 500.0f, 1.0f }; // 光源位置 ( 新增 ) glLightfv(GL_LIGHT0, GL_POSITION, LightPosition1);glViewport(0, 0, (GLsizei)w, (GLsizei)h);glMatrixMode(GL_PROJECTION);glLoadIdentity();3,使用opengl函数完成一个图形动画程序,显示一个球沿正弦曲线运动的过程,同时显示一个立方体沿抛物线运动过程。
《计算机图形学》实验3实验报告
实验3实验报告格式《计算机图形学》实验3实验报告实验题目:直线(光栅化)实数型Bresenham 算法在用户坐标系和Java AWT 坐标系下显示图像实验内容:1 直线(光栅化)实数型Bresenham 算法原理及程序。
2 直线(光栅化)DDA 算法原理及程序。
3 在用户坐标系和Java AWT 坐标系下显示图像的算法原理及实现。
写程序调用验证之。
参考资料:1 课件:光栅图形生成算法.PP T2 Bresenham 算法演示程序已经在MyCanvas 包里,DDA 算法applet 演示程序DDA.java3 有一个示范程序imageDrawApplet.java基本概念:(详细叙述自己对实验内容的理解) 直线(光栅化):画一条从(x1, y1)到(x2, y2)的直线,实质上是一个发现最佳逼近直线的像素序列、并填入色彩数据的过程。
这过程称为直线光栅化。
Bresenham 算法:Bresenham 直线算法是用来描绘由两点所决定的直线的算法,它会算出一条线段在 n 维光栅上最接近的点。
这个算法只会用到较为快速的整数加法、减法和位元移位,常用于绘制电脑画面中的直线。
DDA 算法:DDA 算法(Digital Differential Analyzer ),又称数值微分法,是计算机图形学中一种基于直线的微分方程来生成直线的方法。
算法设计:(详细叙述自己设计的Bresenham 算法以及程序的功能、不同坐标系下图像显示的算法)程序功能:用DDA 算法画出直线,在不同的坐标系下显示图像。
Bresenham 算法:用坐标为(xi ,yi,r)的象素来表示直线上的点,则第i+1个点只能在C 和D 中选取。
令d1=BC ,d2=DBd1-d2=(yi+1–yi,r)-( yi,r+1-yi+1)=2yi+1–yi,r –(yi,r+1)= 2yi+1–2yi,r –1x i x i+1令ε(xi+1)= yi+1–yi,r–0.5=BC-AC=BA=B-A= yi+1–(yi,r+ yi,r+1)/2当ε(xi+1)≥0时,yi+1,r= yi,r+1,即选D点,即下个点(xi+1,yi+1 )对应的象素(xi +1,yi+1,r )为(xi+1,yi,r+1 )当ε(xi+1)<0时,yi+1,r= yi,r,即选C点,即下个点(xi+1,yi+1 )对应的象素(xi +1,yi+1,r )为(xi+1,yi,r )ε(xi+1)= yi+1–yi,r–0.5ε(xi+1)≥0时,yi+1,r= yi,r+1ε(xi+1)<0时,yi+1,r= yi,r用户坐标系下图像显示算法:定义自己的坐标系,将用户坐标系转换为Java awt坐标,调用Graphics类的drawImage方法即可。
计算机图形学实验报告
计算机图形学实验报告一、实验目的本次计算机图形学实验旨在深入了解和掌握计算机图形学的基本原理、算法和技术,通过实际操作和编程实现,提高对图形生成、处理和显示的能力,培养解决实际图形问题的思维和实践能力。
二、实验环境本次实验使用的编程语言为 Python,借助了相关的图形库如Pygame 或 matplotlib 等。
开发环境为 PyCharm 或 Jupyter Notebook。
三、实验内容(一)二维图形的绘制1、直线的绘制使用 DDA(Digital Differential Analyzer)算法或 Bresenham 算法实现直线的绘制。
通过给定直线的起点和终点坐标,在屏幕或图像上绘制出直线。
比较两种算法的效率和准确性,分析其优缺点。
2、圆的绘制采用中点画圆算法或 Bresenham 画圆算法绘制圆。
给定圆心坐标和半径,生成圆的图形。
研究不同半径大小对绘制效果和计算复杂度的影响。
(二)图形的填充1、多边形填充实现扫描线填充算法,对任意多边形进行填充。
处理多边形的顶点排序、交点计算和填充颜色的设置。
测试不同形状和复杂度的多边形填充效果。
2、图案填充设计自定义的填充图案,如纹理、条纹等,并将其应用于图形填充。
探索如何通过改变填充图案的参数来实现不同的视觉效果。
(三)图形的变换1、平移、旋转和缩放对已绘制的图形(如矩形、三角形等)进行平移、旋转和缩放操作。
通过矩阵运算实现这些变换。
观察变换前后图形的位置、形状和方向的变化。
2、组合变换将多个变换组合应用于图形,如先旋转再平移,或先缩放再旋转等。
分析组合变换的顺序对最终图形效果的影响。
(四)三维图形的表示与绘制1、三维坐标变换学习三维空间中的平移、旋转和缩放变换矩阵,并将其应用于三维点的坐标变换。
理解如何将三维坐标映射到二维屏幕上显示。
2、简单三维图形绘制尝试绘制简单的三维图形,如立方体、球体等,使用线框模型或表面模型。
探讨不同的绘制方法和视角对三维图形显示的影响。
计算机图形学报告
else if((c[0]==b[0])&&(c[1]==b[1])&&(c[2]==b[2])&&(c[3]==b[3]))
{
setcolor(0);
setlinestyle(0,0,3);
setwritemode(0);
line(x2,y2,x11,y11);
x2=x11;y2=y11;
getcode(x11,y11,b);
专业班级
学号
学生姓名
实验日期
2010年5月28日
成绩
课程名称
图形学
实验名称
实验四VC++图形程序设计
一、实验目的:
1.掌握VC++进行图形程序设计的基本方法;
2.了解VC++的图形功能,了解常见的图形库函数,请读者参见VC++帮助;
3.能设计较复杂的动、静态图形。
二、实验环境:
普通PC386以上微机; VC++语言程序设计环境。
}
else if(c[2]==1)
{
x11=(int)((x2-x1)*(bottom-y1)/(y2-y1)+x1);
y11=bottom;
}
else if(c[3]==1)
{
x11=(int)((x2-x1)*(top-y1)/(y2-y1)+x1);
y11=top;
} /*3:求交运算结束*/
{
e=d*(1+*cos(8*a));
f=e*(1+sin(16*a));
x1=150+f*cos(a);
x2=150+f*cos(a+pi/16);
计算机图形学实验报告
实验一:二维图形的绘制和变换一、实验目的掌握基本的图形学算法,熟悉VC下图形学的编程,初步了解并使用OpenGL 绘制图形。
二、实验内容二维图形的绘制和变换,绘制包括直线、三角形、矩形,变换包括平移、旋转、缩放。
三、实验原理二维图形的绘制和变换:在图形系统中,矩阵是实现变换的标准方法。
平移变换、旋转变换和缩放变换的矩阵表示形式如下。
平移变换:P’=P+T。
旋转变换:P’=R*P。
缩放变换:P’=S*P。
引入齐次坐标后,平移、旋转和缩放变换的矩阵表示形式如下所示。
(1)平移变换:[1 0 0][x’, y’, 1] = [x, y, 1] [0 1 0][tx ty 1](2)旋转变换:[cosɵsinɵ0][x’, y’, 1] = [x, y, 1] [-sinɵcosɵ0][0 0 1](3)缩放变换:[s x0 0][x’, y’, 1] = [x, y, 1] [0 s y0][0 0 1]四、实验代码及结果1.编写对一个三角形分别实现平移、缩放、旋转等变化的源码及效果图。
实验核心代码void display(void){glClear (GL_COLOR_BUFFER_BIT);glColor3f (1.0, 1.0, 1.0);glLoadIdentity ();glColor3f (1.0, 1.0, 1.0);glTranslatef(-100.0,-50.0,1.0);draw_triangle ();glLoadIdentity ();glTranslatef (0.0, 100.0, 1.0);draw_triangle ();glLoadIdentity ();glRotatef (90.0, 0.0, 0.0, 1.0);draw_triangle ();glLoadIdentity ();glScalef (0.5, 0.5, 1.0);draw_triangle ();glFlush ();}2. 实现如图功能#include<windows.h>#include <GL/glut.h>#include <stdlib.h>void init(void){glClearColor (0.0, 0.0, 0.0, 0.0);glShadeModel (GL_SMOOTH); }void draw_triangle(void){glShadeModel(GL_SMOOTH);glColor3f(0.2,0.7,0.30);glBegin (GL_TRIANGLES);//画出三角形,为混合色填充方式glVertex2f(50.0, 25.0);glColor3f(0.4,0.5,0.60);glVertex2f(150.0, 25.0);glColor3f(0.9,0.7,0.8);glVertex2f(100.0, 100.0);glEnd();}void display(void){glClear (GL_COLOR_BUFFER_BIT);glColor3f (1.0, 1.0, 1.0);glLoadIdentity ();glColor3f (1.0, 1.0, 1.0);glTranslatef(-100.0,-50.0,1.0);draw_triangle ();glLoadIdentity ();glTranslatef (0.0, 100.0, 1.0);glRotatef (90.0, 0.0, 0.0, 1.0);glScalef (0.5, 0.5, 1.0);draw_triangle ();//经过三种变换后画出图形glFlush ();}void reshape (int w, int h){glViewport (0, 0, (GLsizei) w, (GLsizei) h);glMatrixMode (GL_PROJECTION);glLoadIdentity ();if (w <= h)gluOrtho2D (-200.0, 250.0, -100.0*(GLfloat)h/(GLfloat)w,200.0*(GLfloat)h/(GLfloat)w);//调整裁剪窗口elsegluOrtho2D (-200.0*(GLfloat)w/(GLfloat)h,250.0*(GLfloat)w/(GLfloat)h, -50.0, 200.0);glMatrixMode(GL_MODELVIEW);int main(int argc, char** argv){glutInit(&argc, argv);glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);glutInitWindowSize (600, 600);glutInitWindowPosition (100, 100);glutCreateWindow (argv[0]);init ();glutDisplayFunc(display);glutReshapeFunc(reshape);glutMainLoop();return 0;}实验二:使用中点扫描算法绘制直线和圆一、实验目的掌握基本的图形学算法,熟悉VC下图形学的编程,初步了解并使用OpenGL 绘制图形。
计算机图形学课程设计实验报告
百度文库《计算机图形学》实验报告班级计算机科学与技术姓名学号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.........void Mbline(double,double,double,double); .....}3、.....public:CCcircleDoc* GetDocument();void CirclePoint(double,double); ......}3、....................public:CEllipseDoc* GetDocument();void EllipsePoint(double,double); ................}3、cppAET::AET(){}AET::~AET(){}2、>Point[i].y)=Point[i].x;Max=Point[j].y;E[i].k=double((Point[j].x-Point[i].x))/(Point[j].y-Point[i].y);ext=NULL;CurrentE=CurrentB->p;<Point[i].y)=Point[j].x;Max=Point[i].y;E[i].k=double((Point[i].x-Point[j].x))/(Point[i].y-Point[j].y);ext=NULL;CurrentE=CurrentB->p;;for(int i=1;i<Number;i++){if(Point[i].y<ScanMin){ScanMin = Point[i].y; >ScanMax){ScanMax = Point[i].y; //扫描线的最大值}}for( i=ScanMin;i<=ScanMax;i++) //建立桶节点{if(ScanMin == i) //桶头结点{HeadB = new Bucket; //建立桶的头结点CurrentB = HeadB; //CurrentB为Bucket当前节点指针CurrentB->Scanline = ScanMin;CurrentB->p = NULL; //没有连接边链表CurrentB->next = NULL;}else{ //建立桶的其他节点CurrentB->next = new Bucket; //新建一个桶节点CurrentB = CurrentB->next; //使CurrentB指向新建的桶节点CurrentB->Scanline = i;CurrentB->p = NULL; //没有连接边链表CurrentB->next = NULL;}}}//************************菜单函数****************************/*void CTest2View::OnMenuAET(){AfxGetMainWnd()->SetWindowText("多边形有效边表填充算法");//显示标题CColorDialog ccd(GetColor);if()==IDOK)//调用调色板选取前景色{GetColor=();}getchar();RedrawWindow();//刷新屏幕CreatBucket();//初始化桶Et();//建立边表PolygonFill();//多边形填充}*/4、//void CTest2View::OnDraw(CDC* pDC){CTest2Doc* pDoc = GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for native data here//--------------------------------------------------pDC->Polygon(Point,7);//绘制多边形//输出多边形的顶点编号pDC->TextOut(550,410,"P0");pDC->TextOut(350,600,"P1"); pDC->TextOut(230,340,"P2");pDC->TextOut(350,30,"P3");pDC->TextOut(490,220,"P4");pDC->TextOut(600,30,"P5");pDC->TextOut(805,450,"P6");getchar();RedrawWindow();//刷新屏幕CreatBucket();//初始化桶Et();//建立边表PolygonFill();//多边形填充//OnMenuAET();}三、实验结果。
- 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. 总结在这次的实验中,按照图形变换的基本原理,我简单实现了图形的几种变换。
但是由于自己对函数的运用的不太熟悉,因此,在这次的实验中遇到一些困难,以后要在这方面有所改进。
通过这次的实验,知道了如何利用程序进行二维图形的一些基本变换,在以后的学习过程中要不断努力。