实验二维图形基本变换

合集下载

实验.四二维图形的基本几何变换

实验.四二维图形的基本几何变换

实验报告学院:计算机学号:姓名:实验四 二维图形的基本几何变换一、实验目的1.掌握二维图形基本的几何变换原理及变换矩阵; 2.掌握矩阵运算的程序设计。

二、实验内容实现二维图形的基本变换,包括平移、旋转、比例、对称变换。

三、实验环境硬件平台:PC运行环境: Windows 平台,Visual C++四、算法描述二维图形齐次坐标变换矩阵一般表达式 T = 这 3×3 矩阵中各元素功能一共可分成四块,即a 、b 、c 、d 四项用于图形的比例、对称、错切、旋转等基本变换; k 、m 用于图形的平移变换;p 、q 用于图形的透视变换; s 用于图形的全比例变换。

平移变换 旋转变化放缩变换五、实验过程5.1打开Visualc++6.0程序5.2新建一个C++项目⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡s m kq dc p b a ⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡=⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡=⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡''1),(110010011y x t t T y x t t y x y x y x 记为⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡=⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡-=⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡''1)(11000cos sin 0sin cos 1y x R y x y x θθθθθ记为⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡=⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡=⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡''1),(11000001y x s s S y x s s y x y x y x记为5.3单击完成,双击源文件里的二维图形几何变换View.cpp,出现下图5.5找到其中的OnDraw函数,并将其改成如下,使其实现了一条直线的平移。

void C二维图形几何变换View::OnDraw(CDC* pDC){C二维图形几何变换Doc* pDoc = GetDocument();ASSERT_VALID(pDoc);if (!pDoc)return;// TODO: 在此处为本机数据添加绘制代码int a[3][3];int i,j;for(i=0;i<3;i++)for(j=0;j<3;j++)a[i][j]=0;for(i=0;i<3;i++)a[i][i]=1;int x0=80,x1=350,y0=120,y1=120;pDC->MoveTo(x1,y1);E:\c++6.0安装\MSDev98\MyProjects\pDC->LineTo(x0,y0);a[2][0]=80;//使直线在行方向上平移了80个单位a[2][1]=50;//使直线在列方向上平移了50个单位x0=x0*a[0][0]+y0*a[1][0]+a[2][0];y0=x0*a[0][1]+y0*a[1][1]+a[2][1];x1=x1*a[0][0]+y1*a[1][0]+a[2][0];y1=x1*a[0][1]+y1*a[1][1]+a[2][1];pDC->MoveTo(x1,y1);pDC->LineTo(x0,y0);}5.6单击运行程序并有如下结果5.7找到其中的OnDraw函数,并将其改成如下,使其实现了一条直线的平移和缩放。

实验五 二维图形的裁剪和变换

实验五 二维图形的裁剪和变换

实验五二维图形的裁剪和变换一.实验目的:1.理解二维图形变换的含义。

2.掌握二维平移变换的实现。

3.掌握二维旋转变换的实现。

4.掌握二维比例变换的实现。

5.掌握二维平移变换的实现。

二.实验内容:1.分别实现二维图形变换,并测试你的算法。

三.实验过程#include <graphics.h>#include <stdio.h>#define LEFT 1#define RIGHT 2#define BOTTOM 4#define TOP 8int encode(float x,float y,float XL,float XR,float YB,float YT){int c=0;if(x<XL)c|=LEFT;if(x>XR)c|=RIGHT;if(y<YB)c|=BOTTOM;if(y>YT)c|=TOP;return c;}void CS_LineClip(x1,y1,x2,y2,XL,XR,YB,YT)float x1,y1,x2,y2,XL,XR,YB,YT;{int code1,code2,code;float x,y;code1=encode(x1,y1,XL,XR,YB,YT); code2=encode(x2,y2,XL,XR,YB,YT); while((code1!=0 )||(code2!=0)){if((code1&code2)!=0)return;if(code1!=0)code=code1;elsecode=code2;if((LEFT&code)!=0){x=XL;y=y1+(y2-y1)*(XL-x1)/(x2-x1);}else if((RIGHT&code)!=0){x=XR;y=y1+(y2-y1)*(XR-x1)/(x2-x1);}else if((BOTTOM & code )!=0){y=YB;x=x1+(x2-x1)*(YB-y1)/(y2-y1);}else if((TOP & code) !=0){y=YT;x=x1+(x2-x1)*(YT-y1)/(y2-y1);}if(code==code1){x1=x;y1=y;code1=encode(x1,y1,XL,XR,YB,YT);}else{x2=x;y2=y;code2=encode(x2,y2,XL,XR,YB,YT);}}setcolor(255);line(x1,y1,x2,y2);}main(){int graphdriver=DETECT,graphmode;int x1,y1,x2,y2;initgraph( &graphdriver, &graphmode,"\TC\Turboc 2");line(45,15,45,200);line(45,15,400,15);line(45,200,400,200);line(400,15,400,200);CS_LineClip(20.0,30.0,200.0,400.0,45.0,400.0,15.0,200.0); outtextxy(x1,y1,"start point");outtextxy(x2,y2,"end point");getch();closegraph();}。

河南工业大学-图形学实验四

河南工业大学-图形学实验四

河南工业大学-图形学实验四-CAL-FENGHAI.-(YICAI)-Company One1实验四:二维变换与裁剪算法的实现一、实验目的1、掌握平移变换、旋转变换和缩放变换方法;2、达到掌握二维图形基本几何变换及运用几何变换快速方便生成图形的目的;3、掌握图形裁剪算法。

二、实验要求1. 在MFC单文档应用程序中,添加奇次二维坐标点类CP2,如图1.1 所示,参考图1.2部分代码,分别完成二维图形的平移、旋转和缩放。

(注:变换参数可在程序内直接给出或用对话框等形式输入,简单二维图形经二维变换后可生成复杂图形。

)图1.1 CP2类定义图1.2 部分二维变换参考代码2. 利用Cohen-Sutherland端点编码算法编程实现任意线段的裁剪,要求自定义窗口区域和直线端点。

(注:未被裁剪的线段及被裁剪的线段用不同的颜色显示出来。

)三、实验内容一,二维图形的变换○1菜单栏的建立○2对话框的创建,创建对应的类为dialog○3为编辑框Edit添加成员变量:右键,建立类向导,选择Member Variables,双击IDC_EDIT1(对应编辑框的ID),Member variable name m_x1Category ValueVariable type OK○4新建两个类CCP2和TransForm,CCP2类用于将二维点坐标转换成齐次坐标,TransForm类是平移,旋转,缩放的具体实现。

代码如下:// CP2.h#pragma onceclass CP2{public:CP2();virtual ~CP2();CP2(double x, double y);//如果滚动条不能拉动,请启用宏。

○5在文件视图中找到test4View.h protected里面加入变量CString x1,y1,x2,y2,translate,scale,rotate。

用于在test4View.cpp中接收编辑框的值。

《计算机图形学》实验指导书

《计算机图形学》实验指导书

计算机图形学实验指导书袁科计算机技术实验中心目录实验一实现DDA、中点画线算法和Bresenham画线算法 (24)实验二实现Bezier曲线 (25)实验三实现B样条曲线 (26)实验四实现多边形填充的边界标志算法 (27)实验五实现裁剪多边形的Cohen-Sutherland算法 (28)实验六二维图形的基本几何变换 (30)实验七画图软件的编制 (31)实验一实现DDA、中点画线算法和Bresenham画线算法【实验目的】1、掌握直线的多种生成算法;2、掌握二维图形显示原理。

【实验环境】VC++6.0/ BC【实验性质及学时】验证性实验,2学时,必做实验【实验内容】利用任意的一个实验环境,编制源程序,分别实现直线的三种生成算法,即数字微分法(DDA)、中点画线法以及Bresenham画线算法。

【实验原理】1、数字微分法(Digital Differential Analyzer,DDA)算法思想:基于直线的微分方程来生成直线。

ε=1/max(|△x|,|△y|)max(|△x|,|△y|)=|△x|,即|k|≤1 的情况:max(|△x|,|△y|)=|△y|,此时|k|≥1:2、中点画线法算法思想:每次在最大位移方向上走一步,另一方向是否走步取决于误差项的判断。

3、Bresenham画线算法算法思想:其基本思想同中点算法一样,即每次在最大位移方向上走一步,而另一个方向是否走步取决于误差项的判断。

【实验要求】1.上交源程序;2.上交实验报告,实验报告内容如下:(1) 实验名称(2) 实验目的(3) 算法实现的设计方法及程序流程图(4) 程序结果分析【分析与思考】(1) 上述所阐述的三个算法,其基本算法只能适用于直线的斜率(|K|<=1) 的情形,如何将上述算法进行推广,使其能够处理任意斜率的直线?(2) 计算机显示屏幕的坐标圆心在哪里,与我们平时的习惯有什么差异,如何协调二者?实验二 实现Bezier 曲线【实验目的】1、掌握Bezier 曲线的定义;2、能编程实现N 次Bezier 曲线的绘制与显示。

CADCAM实验报告

CADCAM实验报告

实验一图形变换一、目的与任务目的:通过学生上机,了解计算机绘图的相关基础知识和方法。

任务:熟悉二维、三维图形的几何变换。

二、内容、要求与安排方式1、实验内容与要求:编写简单的二维、三维图形几何变换的程序。

要求用熟悉的编程语言编制调试和运行程序,并打印程序清单和输出结果。

2、实验安排方式:课外编写好程序清单,按自然班统一安排上机。

三、实验步骤1、课外时间编制好程序框图。

2、课外时间编写好源程序清单。

3、上机调试和运行程序。

4、打印程序清单和运行结果(包含变换前后的位置)。

四、流程图五、程序清单Private Sub Form_Load()Text1.Text = InputBox("输入A点X坐标")Text2.Text = InputBox("输入A点Y坐标")Text4.Text = InputBox("输入B点X坐标")Text5.Text = InputBox("输入B点Y坐标")Text7.Text = InputBox("输入C点X坐标")Text8.Text = InputBox("输入C点Y坐标")End SubPrivate Sub Command1_Click()Text19.Text = 1Text20.Text = 0Text21.Text = 0Text22.Text = 0Text23.Text = 1Text24.Text = 0Text25.Text = -Val(Text47.Text)Text26.Text = -Val(Text48.Text)Text27.Text = 1End SubPrivate Sub Command2_Click()Text28.Text = Format(Cos(Val(Text46.Text) * 3.1415926 / 180), "0.000") Text29.Text = Format(Sin(Val(Text46.Text) * 3.1415926 / 180), "0.000") Text30.Text = 0Text31.Text = Format(-Sin(Val(Text46.Text) * 3.1415926 / 180), "0.000") Text32.Text = Format(Cos(Val(Text46.Text) * 3.1415926 / 180), "0.000") Text33.Text = 0: Text34.Text = 0: Text35.Text = 0: Text36.Text = 1End SubPrivate Sub Command3_Click()Text37.Text = 1Text38.Text = 0Text39.Text = 0Text40.Text = Val(Text58.Text)Text41.Text = 1Text42.Text = 0Text43.Text = 0Text44.Text = 0Text45.Text = 1End SubPrivate Sub Command6_Click()Text49.Text = 1Text50.Text = 0Text51.Text = 0Text52.Text = 0Text53.Text = 1Text54.Text = 0Text55.Text = Val(Text47.Text)Text56.Text = Val(Text48.Text)Text57.Text = 1End SubPrivate Sub Command4_Click()a = Val(Text1.Text) * Val(Text19.Text) + Val(Text2.Text) * Val(Text22.Text) + Val(Text3.Text) * Val(Text25.Text)b = Val(Text1.Text) * Val(Text20.Text) + Val(Text2.Text) * Val(Text23.Text) + Val(Text3.Text) * Val(Text26.Text)c = Val(Text1.Text) * Val(Text21.Text) + Val(Text2.Text) * Val(Text24.Text) + Val(Text3.Text) * Val(Text27.Text)d = Val(Text4.Text) * Val(Text19.Text) + Val(Text5.Text) * Val(Text22.Text) + Val(Text6.Text) * Val(Text25.Text)e = Val(Text4.Text) * Val(Text20.Text) + Val(Text5.Text) * Val(Text23.Text) + Val(Text6.Text) * Val(Text26.Text)f = Val(Text4.Text) * Val(Text21.Text) + Val(Text5.Text) * Val(Text24.Text) + Val(Text6.Text) * Val(Text27.Text)g = Val(Text7.Text) * Val(Text19.Text) + Val(Text8.Text) * Val(Text22.Text) + Val(Text9.Text) * Val(Text25.Text)h = Val(Text7.Text) * Val(Text20.Text) + Val(Text8.Text) * Val(Text23.Text) + Val(Text9.Text) * Val(Text26.Text)i = Val(Text7.Text) * Val(Text21.Text) + Val(Text8.Text) * Val(Text24.Text) + Val(Text9.Text) * Val(Text27.Text) j = a * Val(Text28.Text) + b * Val(Text31.Text) + c * Val(Text34.Text)k = a * Val(Text29.Text) + b * Val(Text32.Text) + c * Val(Text35.Text)l = a * Val(Text30.Text) + b * Val(Text33.Text) + c * Val(Text36.Text)m = d * Val(Text28.Text) + e * Val(Text31.Text) + f * Val(Text34.Text)n = d * Val(Text29.Text) + e * Val(Text32.Text) + f * Val(Text35.Text)o = d * Val(Text30.Text) + e * Val(Text33.Text) + f * Val(Text36.Text)p = g * Val(Text28.Text) + h * Val(Text31.Text) + i * Val(Text34.Text)q = g * Val(Text29.Text) + h * Val(Text32.Text) + i * Val(Text35.Text)r = g * Val(Text30.Text) + h * Val(Text33.Text) + i * Val(Text36.Text)a1 = j * Val(Text37.Text) + k * Val(Text40.Text) + l * Val(Text43.Text)b1 = j * Val(Text38.Text) + k * Val(Text41.Text) + l * Val(Text44.Text)c1 = j * Val(Text39.Text) + k * Val(Text42.Text) + l * Val(Text45.Text)d1 = m * Val(Text37.Text) + n * Val(Text40.Text) + o * Val(Text43.Text)e1 = m * Val(Text38.Text) + n * Val(Text41.Text) + o * Val(Text44.Text)f1 = m * Val(Text39.Text) + n * Val(Text42.Text) + o * Val(Text45.Text)g1 = p * Val(Text37.Text) + q * Val(Text40.Text) + r * Val(Text43.Text)h1 = p * Val(Text38.Text) + q * Val(Text41.Text) + r * Val(Text44.Text)i1 = p * Val(Text39.Text) + q * Val(Text42.Text) + r * Val(Text45.Text)Text10.Text = a1 * Val(Text49.Text) + b1 * Val(Text52.Text) + c1 * Val(Text55.Text)Text11.Text = a1 * Val(Text50.Text) + b1 * Val(Text53.Text) + c1 * Val(Text56.Text)Text12.Text = a1 * Val(Text51.Text) + b1 * Val(Text54.Text) + c1 * Val(Text57.Text)Text13.Text = d1 * Val(Text49.Text) + e1 * Val(Text52.Text) + f1 * Val(Text55.Text)Text14.Text = d1 * Val(Text50.Text) + e1 * Val(Text53.Text) + f1 * Val(Text56.Text)Text15.Text = d1 * Val(Text51.Text) + e1 * Val(Text54.Text) + f1 * Val(Text57.Text)Text16.Text = g1 * Val(Text49.Text) + h1 * Val(Text52.Text) + i1 * Val(Text55.Text)Text17.Text = g1 * Val(Text50.Text) + h1 * Val(Text53.Text) + i1 * Val(Text56.Text)Text18.Text = g1 * Val(Text51.Text) + h1 * Val(Text54.Text) + i1 * Val(Text57.Text)End SubPrivate Sub Command5_Click()EndEnd Sub六、运行结果。

计算机图形学_实验2_二维图形绘制

计算机图形学_实验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趋向无穷大时得到一个圆,可是问题是这个圆是空心的,无法填充红色。

计算机图形学实验报告_2

计算机图形学实验报告学号:********姓名:班级:计算机 2班指导老师:***2010.6.19实验一、Windows 图形程序设计基础1、实验目的1)学习理解Win32 应用程序设计的基本知识(SDK 编程);2)掌握Win32 应用程序的基本结构(消息循环与消息处理等); 3)学习使用VC++编写Win32 Application 的方法。

4)学习MFC 类库的概念与结构;5)学习使用VC++编写Win32 应用的方法(单文档、多文档、对话框);6)学习使用MFC 的图形编程。

2、实验内容1)使用WindowsAPI 编写一个简单的Win32 程序,调用绘图API 函数绘制若干图形。

(可选任务)2 )使用MFC AppWizard 建立一个SDI 程序,窗口内显示"Hello,Thisis my first SDI Application"。

(必选任务)3)利用MFC AppWizard(exe)建立一个SDI 程序,在文档视口内绘制基本图形(直线、圆、椭圆、矩形、多边形、曲线、圆弧、椭圆弧、填充、文字等),练习图形属性的编程(修改线型、线宽、颜色、填充样式、文字样式等)。

定义图形数据结构Point\Line\Circle 等保存一些简单图形数据(在文档类中),并在视图类OnDraw 中绘制。

3、实验过程1)使用MFC AppWizard(exe)建立一个SDI 程序,选择单文档;2)在View类的OnDraw()函数中添加图形绘制代码,说出字符串“Hello,Thisis my first SDI Application”,另外实现各种颜色、各种边框的线、圆、方形、多边形以及圆弧的绘制;3)在类视图中添加图形数据point_pp,pp_circle的类,保存简单图形数据,通过在OnDraw()函数中调用,实现线、圆的绘制。

4、实验结果正确地在指定位置显示了"Hello,This is my first SDI Application"字符串,成功绘制了圆,椭圆,方形,多边形以及曲线圆弧、椭圆弧,同时按指定属性改绘了圆、方形和直线。

《计算机图形学》实验报告

实验报告模板《计算机图形学》实验报告一、实验目的及要求1.实习三维图形的坐标系之间的变换;2.三维图形几何变换;3.掌握三维图形的坐标系之间的变换算法及三维图形几何变换的原理和实现;4.实现二维图形的基本变换(平移、旋转、缩放、错切、对称、复合等);5.实现三维图形的基本变换(平移、旋转、缩放、复合等);二、理论基础在齐次坐标理论下,二维图形几何变换矩阵可用下式表示:⎪⎪⎪⎭⎫⎝⎛===ifchebgdaTnkxx kk2,1,0,)(ϕ平移变换:[x* y* 1] =[x y 1] *0000001ts⎛⎫⎪⎪⎪⎝⎭=[t*x s*y 1]比例变换:[x* y* 1]=[x y 1] *1000101m n⎛⎫⎪⎪⎪⎝⎭=[m+x n+y 1]旋转变换:在平面上的二维图形饶原点逆时针旋转Ө角,变换矩阵为[x* y* 1]=[x y 1] *cos sin0sin cos0001θθθθ⎛⎫⎪- ⎪⎪⎝⎭= [x*cosө-y*sinө]复合变换:以上各种变换矩阵都是以原点为参照点,当以任意参照点进行变换的时候,我们就要用到复合变换矩阵。

三维变换类似于二维,在画图时,把三维坐标转换为二维即可。

三、算法设计与分析二维变换:#define dx 50#define dy 100void CCGWithVCView::OnTransScale() //平移(50,100){// TODO: Add your command handler code here// AfxMessageBox(_T("Please Insert The Move Change Code!")) ;int m[4][2]={{100,50},{50,100},{150,100},{100,50}};int i;int a[2],b[2];CDC * pDC = GetDC();for(i=0;i<3;i++){a[0]=m[i][0];a[1]=m[i][1];b[0]=m[i+1][0];b[1]=m[i+1][1];DDALine(a,b, RGB(0, 200, 255), pDC);}for(i=0;i<3;i++){a[0]=m[i][0]+dx;a[1]=m[i][1]+dy;b[0]=m[i+1][0]+dx;b[1]=m[i+1][1]+dy;DDALine(a,b, RGB(0, 200, 255), pDC);}}#define h 0.1745#include<math.h>void CCGWithVCView::OnTransRotate() //旋转{// TODO: Add your command handler code here// AfxMessageBox(_T("Please Insert The Rotate Change Code!")) ;int m[4][2]={{100,50},{50,100},{150,100},{100,50}};int i;int a[2],b[2];CDC * pDC = GetDC();for(i=0;i<3;i++){a[0]=m[i][0];a[1]=m[i][1];b[0]=m[i+1][0];b[1]=m[i+1][1];DDALine(a,b, RGB(0, 200, 255), pDC);}for(i=0;i<3;i++){a[0]=m[i][0]*cos(h)-m[i][1]*sin(h);a[1]=m[i][1]*cos(h)+m[i][0]*sin(h);b[0]=m[i+1][0]*cos(h)-m[i+1][1]*sin(h);b[1]=m[i+1][1]*cos(h)+m[i+1][0]*sin(h);DDALine(a,b, RGB(0, 200, 255), pDC);}}#define k 2;#define f 2.5void CCGWithVCView::OnTransMove() //缩放{// TODO: Add your command handler code here//AfxMessageBox(_T("Please Insert The Scale Change Code!")) ;int m[4][2]={{100,50},{50,100},{150,100},{100,50}};int i;int a[2],b[2];CDC * pDC = GetDC();for(i=0;i<3;i++){a[0]=m[i][0];a[1]=m[i][1];b[0]=m[i+1][0];b[1]=m[i+1][1];DDALine(a,b, RGB(0, 200, 255), pDC);}for(i=0;i<3;i++){a[0]=m[i][0]*k;a[1]=m[i][1]*f;b[0]=m[i+1][0]*k;b[1]=m[i+1][1]*f;DDALine(a,b, RGB(0, 200, 255), pDC);}}#define n 2#define d 0void CCGWithVCView::OnTransOther(){// TODO: Add your command handler code here//AfxMessageBox(_T("Please Insert The Other Change Code!")) ;int m[4][2]={{100,50},{50,100},{150,100},{100,50}};int i;int a[2],b[2];CDC * pDC = GetDC();for(i=0;i<3;i++){a[0]=m[i][0];a[1]=m[i][1];b[0]=m[i+1][0];b[1]=m[i+1][1];DDALine(a,b, RGB(0, 200, 255), pDC);}for(i=0;i<3;i++){a[0]=m[i][0]+n*m[i][1];a[1]=m[i][1]+d*m[i][0];b[0]=m[i+1][0]+n*m[i+1][1];b[1]=m[i+1][1]+d*m[i+1][0];DDALine(a,b, RGB(0, 200, 255), pDC);}}三维变换:#include<math.h>#define dx 100#define dy 100#define dz 0void CCGWithVCView::OnTransScale() //平移(50,100){// TODO: Add your command handler code here// AfxMessageBox(_T("Please Insert The Move Change Code!")) ;int i;int p2d[6][2];int p3d[6][3]={{400,300,0},{300,400,0},{300,300,10},{275,300,0},{400,300,0},{300,300,10}};for( i=0;i<6;i++){p2d[i][0]=p3d[i][1]-p3d[i][0]/sqrt(2);p2d[i][1]=p3d[i][2]+p3d[i][0]/sqrt(2);}int a[2],b[2];CDC * pDC = GetDC();for(i=0;i<5;i++){a[0]=p2d[i][0];a[1]=p2d[i][1];b[0]=p2d[i+1][0];b[1]=p2d[i+1][1];DDALine(a,b, RGB(0, 200, 255), pDC);}for( i=0;i<6;i++){p2d[i][0]=p3d[i][1]+dy-p3d[i][0]+dx/sqrt(2);p2d[i][1]=p3d[i][2]+dz+p3d[i][0]+dx/sqrt(2);}for(i=0;i<5;i++){a[0]=p2d[i][0];a[1]=p2d[i][1];b[0]=p2d[i+1][0];b[1]=p2d[i+1][1];DDALine(a,b, RGB(0, 0, 255), pDC);}}#define k 0.1745void CCGWithVCView::OnTransRotate() //旋转{// TODO: Add your command handler code here// AfxMessageBox(_T("Please Insert The Rotate Change Code!")) ;int i;int p2d[6][2];int p3d[6][3]={{400,300,0},{300,400,0},{300,300,10},{275,300,0},{400,300,0},{300,300,10}};for( i=0;i<6;i++){p2d[i][0]=p3d[i][1]-p3d[i][0]/sqrt(2);p2d[i][1]=p3d[i][2]+p3d[i][0]/sqrt(2);}int a[2],b[2];CDC * pDC = GetDC();for(i=0;i<5;i++){a[0]=p2d[i][0];a[1]=p2d[i][1];b[0]=p2d[i+1][0];b[1]=p2d[i+1][1];DDALine(a,b, RGB(0, 200, 255), pDC);}for( i=0;i<6;i++){p2d[i][0]=p3d[i][1]*cos(k)-p3d[i][2]*sin(k)-p3d[i][0]/sqrt(2);p2d[i][1]=p3d[i][2]*cos(k)+p3d[i][1]*sin(k)+p3d[i][0]/sqrt(2);}for(i=0;i<5;i++){a[0]=p2d[i][0];a[1]=p2d[i][1];b[0]=p2d[i+1][0];b[1]=p2d[i+1][1];DDALine(a,b, RGB(0, 0, 255), pDC);}}四、程序调试及结果的分析二维:三维:五、实验心得及建议在实验过程中,尽管过程中任由许多不会的地方,而且有待于今后的提高和改进,但我加深了对书本上知识的理解与掌握,同时也学到了很多书本上没有东西,并积累了一些宝贵的经验,这对我以后的学习与工作是不无裨益的。

图形学实验报告

图形学实验报告图形学实验报告概述:在本次图形学实验中,我们将探索和学习计算机图形学的基本概念和技术。

通过实验,我们深入了解了图形学的原理和应用,以及如何使用计算机生成和处理图像。

实验一:像素和颜色在这个实验中,我们学习了图像是由像素组成的,每个像素都有自己的颜色值。

我们使用了Python编程语言和PIL库来创建一个简单的图像,并设置了不同的像素颜色。

通过改变像素的颜色值,我们可以创建出各种各样的图像效果。

实验二:坐标系统和变换在这个实验中,我们学习了坐标系统和图形变换。

我们使用OpenGL库来创建一个简单的二维图形,并通过平移、旋转和缩放等变换操作来改变图形的位置和形状。

这些变换操作使我们能够在屏幕上创建出各种不同的图案和效果。

实验三:线段和多边形在这个实验中,我们学习了如何使用线段和多边形来绘制图形。

我们使用了Bresenham算法来绘制直线,并学习了如何使用多边形填充算法来填充图形。

通过这些技术,我们可以创建出更加复杂和精细的图像。

实验四:光照和阴影在这个实验中,我们学习了光照和阴影的原理和应用。

我们使用了光照模型来模拟光线的传播和反射,以及计算物体的明暗效果。

通过调整光照参数和材质属性,我们可以创建出逼真的光照和阴影效果。

实验五:纹理映射和渲染在这个实验中,我们学习了纹理映射和渲染的概念和技术。

我们使用了纹理映射来将图像贴到三维物体表面,以增加物体的细节和真实感。

通过渲染技术,我们可以模拟光线的折射和反射,以及创建出逼真的材质效果。

实验六:三维建模和动画在这个实验中,我们学习了三维建模和动画的基本原理和方法。

我们使用了三维建模工具来创建三维模型,并学习了如何使用关键帧动画来实现物体的运动和变形。

通过这些技术,我们可以创建出逼真的三维场景和动画效果。

总结:通过这次图形学实验,我们深入了解了计算机图形学的原理和应用。

我们学习了像素和颜色、坐标系统和变换、线段和多边形、光照和阴影、纹理映射和渲染,以及三维建模和动画等技术。

-图形学实验报告-二维基本变换

一、 实验目的和要求利用VC6.0编写二维基本几何变换算法的实现。

实现平移,比例,旋转等变换。

二、 算法原理介绍齐次坐标表示法就是用N+1维向量来表示一个N 维向量。

在齐次坐标系统中,点(X,Y)用(X,Y ,H)来表达,其中H 为非零的一个任意数。

点(X,Y)的标准齐次坐标表达为(X/H,Y/H,1),由于H 是一个任意非零常量,为了简便起见,我们通常取H=1。

齐次坐标系统中的点(X,Y ,1)包含有笛卡尔坐标上的点(X,Y)。

平移变换:比例变换:旋转变换:对称变换:关于x 轴对称:关于y 轴对称:⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡1000000y x SS ⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡-100010001关于原点对称:关于y=x 对称:关于y=-x 对称:错切变换:当b=0时: (x` y` 1)=(x+cy y 1)。

图形的y 坐标不变。

当c>0:图形沿+x 方向作错切位移。

ABCD →A1B1C1D1当c<0:图形沿-x 方向作错切位移。

ABCD → A2B2C2D2当c=0时, (x` y` 1)=(x bx+y 1):图形的x 坐标不变。

当b>0:图形沿+y 方向作错切位移。

ABCD → A1B1C1D1当b<0:图形沿-y 方向作错切位移。

ABCD → A2B2C2D2当b 不等于0且c 不等于0时,(x` y` 1)=(x+cy bx+y 1) :图形沿x,y 两个方向作错切位移。

∴错切变换引起图形角度关系的改变,甚至导致图形发生变形。

三、 程序核心源代码void CChangeView::Tmove(double Tx,double Ty) //平移变换矩阵{ ClearMatrix(TM);RedrawWindow();TM[0][0]=1;TM[1][1]=1;TM[2][0]=Tx;TM[2][1]=Ty;TM[2][2]=1;⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡-100010001⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡--100010001⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡100001010⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡--100001010⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡1000101c bCalculate(P,TM);AfxGetMainWnd()->SetWindowText("二维几何变换-平移变换");Draw(P,p3);}void CChangeView::Tscale(double Sx,double Sy) //比例变换矩阵{ ClearMatrix(TS);RedrawWindow();TS[0][0]=Sx;TS[1][1]=Sy;TS[2][2]=1;Calculate(P,TS);AfxGetMainWnd()->SetWindowText("二维几何变换-比例变换");Draw(P,p3);}void CChangeView::Trotate(double thta)//旋转变换矩阵{ ClearMatrix(TR);RedrawWindow();TR[0][0]=cos(thta*PI/180);TR[0][1]=sin(thta*PI/180);TR[1][0]=-sin(thta*PI/180);TR[1][1]=cos(thta*PI/180);TR[2][2]=1;Calculate(P,TR);AfxGetMainWnd()->SetWindowText("二维几何变换-旋转变换");Draw(P,p3);}void CChangeView::Treflect(double Fx,double Fy) //反射变换矩阵{ ClearMatrix(TF);RedrawWindow();TF[0][0]=Fx;TF[1][1]=Fy;TF[2][2]=1;Calculate(P,TF);AfxGetMainWnd()->SetWindowText("二维几何变换-反射变换");Draw(P,p3);}void CChangeView::Treform(double b,double c) //错切变换矩阵{ ClearMatrix(TC);RedrawWindow();TC[0][0]=1; TC[0][1]=b; TC[1][0]=c; TC[1][1]=1; TC[2][2]=1;Calculate(P,TC);AfxGetMainWnd()->SetWindowText("二维几何变换-错切变换");Draw(P,p3);}void CChangeView::OnMENUup(){// TODO: Add your command handler code hereTmove(0,10);}void CChangeView::OnMENUdown(){// TODO: Add your command handler code hereTmove(0,-10);}void CChangeView::OnMENUleft(){// TODO: Add your command handler code hereTmove(-10,0);}void CChangeView::OnMENUright(){// TODO: Add your command handler code hereTmove(10,0);}void CChangeView::OnMENUClockwise() //顺时针旋转{// TODO: Add your command handler code hereTrotate(-30);}void CChangeView::OnMENUAnticlockwise() //逆时针旋转{// TODO: Add your command handler code hereTrotate(30);}void CChangeView::OnMENUIncrease(){// TODO: Add your command handler code hereTscale(2,2);}void CChangeView::OnMENUDecrease(){// TODO: Add your command handler code here Tscale(0.5,0.5);}void CChangeView::OnMENUY(){// TODO: Add your command handler code here Treflect(-1,1);}void CChangeView::OnMENUO(){// TODO: Add your command handler code here Treflect(-1,-1);}void CChangeView::OnMENUX(){// TODO: Add your command handler code hereTreflect(1,-1);}void CChangeView::OnMENUXdirectionplus(){// TODO: Add your command handler code here Treform(0,1);}void CChangeView::OnOnMENUXdirectionneg() {// TODO: Add your command handler code here Treform(0,-1);}void CChangeView::OnMENUITYdirectionplus(){// TODO: Add your command handler code here Treform(1,0);}void CChangeView::OnMENUYdirectionneg(){// TODO: Add your command handler code here Treform(-1,0);}void CChangeView::OnMENUReset(){// TODO: Add your command handler code here if(p3==4){ KeepMatrix(OSquare,P); }if(p3==3){ KeepMatrix(OTriangle,P); }if(p3==2){ KeepMatrix(OLine,P); }Draw(P,p3);}void CChangeView::Onre(){// TODO: Add your command handler code here Treflect(-1,-1);}四、实验结果抓图原图:平移变换后:对称变换后:(关于X轴对称)旋转变换后:(顺时针旋转)比例变换后:缩小放大错切变换后:Y正向五、参考文献[1]赵建忠,段康廉.三维建模在虚拟矿山系统中的应用[J].中国科技论文.[2]许惠平,陈越,陈华根,廖晓留,王智博.青藏高原亚东-格尔木地学断面域岩石圈结构演化虚拟现实表达[J].中国科技论文.[3]罗斌,魏世民,黄昔光,张艳.基于OpenGL的3P-6SS并联机构的仿真与轨迹规划研究[J].;国家自然科学基金资助项目.。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验一二维图形的基本变换
一.实验目的
1、掌握CAD图形处理的原理和方法;
2、通过上机操作,熟悉多边形的平移、比例和旋转变换,掌握二维图形的基本变换。

3、理解CAD对图形进行复合变换(平移、比例和旋转变换)的过程。

二.实验要求
1、上机调试所编程序,实现图形的绘制、平移变换、比例变换和旋转变换。

2、二维图形各点的坐标、平移、比例、旋转角度可由用户任意输入,原图形和变换后的图形必须同时显示在显示器上。

三.实验设备
1、计算机系统;
2、安装Turbo C或其他C语言集成开发工具
四.实验原理
在计算机图形处理中,经常需要对已经生成的图形进行几何变换处理。

例如,改变原始图形的大小、移动图形到某一指定位置或根据需要将图形旋转某一个角度,这就要求图形的处理软件能够实现缩放、平移、旋转等几何变换。

由于点是构成一个几何形体的最基本的元素,而一幅二维图形可以看成是一个点集,如三角形有三个特征
点……,因此,我们就可以把对图形的几何变换归结对点的变换。

通过对构成几何图形的特征点集的几何变换即可实现整个图形的几何变换。

即如何实现一个旧点到变化后新点的计算求解是本次实验的重点。

我们给出平移、比例、旋转变换的矩阵分别为:
平 移: T t =⎥⎥⎥⎦
⎤⎢⎢⎢⎣⎡1010001n m (m,n 分别为x,y 方向上的平移量) 全比例: T s =⎥⎥⎥⎦
⎤⎢⎢⎢⎣⎡1000000b a (a,b 分别为x,y 方向上的比例因子)
旋 转: T r =⎥⎥⎥⎦
⎤⎢⎢⎢⎣⎡-1000cos sin 0sin cos θθθθ (θ为旋转角,逆时针为正)
假设一几何图形由A(x A,y A ) B(x B ,y B ) C(x C ,y C ) D(x D ,y D )四点组成,那么变换后四点坐标为A ’(x ’A,y ’A ) B ’(x ’B ,y ’B ) C ’(x ’C ,y ’C ) D ’(x ’D ,y ’D )
平移:⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎣⎡1111''''''''D D C C B B A A Y X Y X Y X Y X =⎥⎥⎥⎥⎥⎦⎤⎢
⎢⎢⎢⎢⎣⎡1111D D C C B B A A Y X Y X Y X Y X T t =⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎣⎡1111D D C C B B A A Y X Y X Y X Y X ⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡1010001n m =⎥⎥⎥⎥⎥⎦
⎤⎢⎢⎢⎢⎢⎣⎡++++++++1111n Y m X n Y m X n Y m X n Y m X D D C C B B A A 比例:⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎣⎡1111''''''''D D C C B B A A Y X Y X Y X Y X =⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎣⎡1111D D C C B B A A Y X Y X Y X Y X T s =⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎣⎡1111D D C C B B A A Y X Y X Y X Y X ⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡1000000b a =⎥⎥⎥⎥⎥⎦
⎤⎢⎢⎢⎢⎢⎣⎡1111D D C C B B B A bY aX bY aX bY aX bY aX
旋转:⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎣⎡1111''''''''D D C C B B A A Y X Y X Y X Y X =⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎣⎡1111D D C C B B A A Y X Y X Y X Y X T r =⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎣⎡1111D D C C B B A A Y X Y X Y X Y X ⎥⎥⎥⎦
⎤⎢⎢⎢⎣⎡-1000cos sin 0sin cos θθθθ =⎥⎥⎥⎥⎦
⎤⎢⎢⎢⎢⎣⎡+-+-+-+-1cos sin sin cos 1cos sin sin cos 1cos sin sin cos 1cos sin sin cos θθθθθθθθθθθθθθθθC D D D C C C C B B B B
A A A A Y X Y X Y X Y X Y X Y X Y X Y X 由以上的推导过程,我们得到变换前点与变化后点的关系,进而可以用图形处理软件实现相应的变换。

五.实验步骤:(通过实验具体描述)
编制在屏幕上绘制一任意图形的程序、并进行平移变换、比例变换、旋转变换等基本变换。

六.程序流程图:
七.实验注意事项:
该实验在机房进行上机编程,应注意机房的上机秩序,如出现断电、死机等问题应及时向老师汇报,由实验教师解决。

不能自己随意处理,更不能够随意打开机箱。

八.实验预习要求:
实验前认真预习实验原理,对所用编程语言要预先熟悉,要求在给定时间内编程并显示出结果。

实验报告要带入具体数据,写清实验原理,画出程序框图,列出程序清单。

九.程序清单(B5打印)
十.实验处理结果(B5打印)或在程序空白处画出
十一.实验心得体会。

相关文档
最新文档