计算机图形学实验课件_第1页
计算机图形学实验课件_第2页
计算机图形学实验课件_第3页
计算机图形学实验课件_第4页
计算机图形学实验课件_第5页
已阅读5页,还剩44页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、2022/8/101计算机图形学实验2022/8/102序号实 验 项 目1填充算法的实现 2正方体的比例、平移、旋转变换及投影显示 3用矩形窗口对多边形的裁剪 4多点插值的埃米尔特曲线、贝齐尔曲线及B样条曲线 54阶3次等距B样条曲线绘制及变换 6求解两凸多边形的交集 7显示Julia集 8上机考试2022/8/103如何建立一个VC+应用程序框架文件:2022/8/1042022/8/1052022/8/1062022/8/1072022/8/1082022/8/109编辑状态下的窗口布局2022/8/1010调试状态下的窗口布局2022/8/1011一.MFC绘图函数: 1.1 生成设备

2、环境对象 设备环境是一个对窗口的绘图表面的属性保持跟踪的数据结构。这些属性包括用于在屏幕上绘图的当前所使用的画笔和画刷。设备环境每次只能用一种画笔和一种画刷。而设备环境对象就是设备环境类的一个实例,它设置了绘图工具,并提供了绘制点、线等简单图形的绘图函数。所有的绘图工作都要通过设备环境对象来实现。2022/8/1012例如,如果想用一个能够画粗线条的画笔,就必须创建一个新画笔,然后用它取代设备环境中原有的画笔。类似的,如果想用红色的画刷填充一个图形,必须创建一个画刷,并将它选进设备环境,这就是Windows程序员在设备环境中取得工具的方式。2022/8/1013下面简单介绍几种设备环境:Gra

3、phical Drawing Classes2022/8/1014.CDC 设备环境对象类,是其它设备环境的基类。 一般情况下,应用程序都要在View(视图)类中来进行绘图,视图窗口绘制或者重绘,应用程序框架都要调用视图类的OnDraw成员函数。void CMyDrawView:OnDraw(CDC* pDC)/ TODO: add draw code for native data here2022/8/1015.CPaintDC 构造函数调用BeginPaint ,析构函数调用EndPaint。 有时在视图窗口以外的窗口(如对话框)中绘制图形,需要调用窗口类的WM_PAINT的消息处理函数

4、 OnPaint来绘制或者重绘窗口,OnPaint函数必须生成由 CPaintDC类派生的设备环境对象,如下所示:void CMyDialog:OnPaint() CPaintDC dc(this);2022/8/1016CPaintDC dc(this);创建一个名为dc的设备环境对象,而this指向当前的对话框。这样就可以在对话框画图了。 注意:由于视图类窗口也是窗口的一类,所以视图窗口要绘制时,也收到WM_PAINT 的消息,但是当CView的派生类没有OnPaint函数消息处理函数时,将执行CView提供的OnPaint函数,生成和准备设备环境对象,然后将对象传入OnDraw函数。只有

5、不从视图类派生的窗口类才需要提供自己的OnPaint函数做各种窗口绘图工作。2022/8/1017void CView:OnPaint() CClientDC dc(this)if(输出设备是屏幕)OnDraw(&dc);else/输出设备是打印机OnPrint(&dc);2022/8/1018.CClientDC 这个设备环境对象仅仅代表了当前窗口区域。它的构造函数调用GetDC函数,它的析构函数调用ReleaseDC 函数。对于在OnDraw和OnPaint消息处理函数之外的函数中显示图形,必须生成CClientDC类成员的设备环境对象。2022/8/1019CMyWnd:Function

6、()CClientDC dc(this);/ CMyWnd必须是CWnd的子类(派生类)/ TODO: Add your message handler code here2022/8/1020CMyWnd:Function()CClientDC *pDC; pDC-GetDC();/ TODO: Add your message handler code herepDC-ReleaseDC();2022/8/1021#include math.hvoid CDDALineView:DDALine(CDC* pDC, int x1, int y1, int x2, int y2) double

7、 dx,dy,e,x,y;dx=x2-x1; dy=y2-y1;e=(fabs(dx)fabs(dy)? fabs(dx):fabs(dy); dx/=e; dy/=e;x=x1; y=y1;for(int i=1; iSetPixel(int)(x+0.5),(int)(y+0.5),RGB(0,0,0);x+=dx; y+=dy;2022/8/10221.2 选择绘图工具画笔,画刷,字体等都属于图形设备接口对象。(CGdiObject)系统默认的画笔和画刷:默认的画笔画出的线为宽度为1像素的黑色实线。默认的画刷是白色的,己用默认的画刷填充图形时,图形的内部填充成白色。2022/8/1023

8、121 选用库存的绘图工具CDC:SelectStockObject(int nIndex);void CMyView:OnDraw(CDC*pDC)pDC-SelectStockObject(WHITE_PEN);pDC-SelectStockObject(GRAY_BRUSH);2022/8/1024122 生成自定义的绘图工具 生成自定义画笔和画刷的基本步骤: (1)生成画笔(CPen类)和画刷(CBrush)类的实例; (2)调用CPen类和CBrush类的成员函数来初始化画笔和画刷; (3)将生成的画笔和画刷选入设备环境对象中,并将设备环境对象的原有的画笔和画刷保存在指针中; (4)

9、调用相应的绘图函数进行绘图; (5)将原来的画笔和画刷重新选入设备环境对象中 2022/8/1025 (1)生成笔(CPen类)和刷(CBrush)类的实例; CPen pen; CBrush brush; (2)调用CPen类和CBrush类的成员函数来初始化笔和刷; 画笔的初始化 CPen:CreatePen 2022/8/1026 BOOL CreatePen(int nPenStyle, int nWidth,COLORREF crColor); nPenStyle : PS_SOLID PS_DOT PS_DASH PS_DASHDOT PS_DASHDOTDOT nWidth :

10、线的宽度(线宽1均产生实线)2022/8/1027 crColor参数指定线的颜色,类型为 COLORREF RGB(BYTE bRed , BYTE bGreen, BYTE bBlue); 0bRed ,bGreen, bBlue255 RGB宏功能定义了16种纯颜色。 2022/8/1028RGB(0,0,0);黑色RGB(255,255,255);白色RGB(128,0,0);深红RGB(255,0,0);红色RGB(0, 128,0);深绿RGB(0, 255,0);绿色RGB(0,0,128);深蓝RGB(0,0,255);蓝色RGB(128,128,0);深黄RGB(255,25

11、5,0);黄色RGB(0,128,128);深青RGB(0,255,255);青色等。2022/8/10292022/8/1030画刷的初始化:/创建实心画刷 BOOL CreateSolidBrush( COLORREF crColor);/创建影线画刷BOOL CreateHatchBrush( int nIndex,COLORREF crColor);/创建位图画刷BOOL CreatePatternBrush( CBitmap *pBitmap);2022/8/1031 nIndex指定格子的形式。 HS_CROSS 水平垂直交叉阴影 HS_HORIZONAL 水平阴影线 HS_VER

12、TICAL 竖直阴影线 HS_DIAGCROSS 45度交叉阴影对角线 HS_BDIAGONAL 以45度角从左上到右下倾斜的阴影 HS_FDIAGONAL 以45度角从左下到右上倾斜的阴影2022/8/10322022/8/1033(3)将生成的笔和刷选入设备环境对象中,并将设备环境对象的原有的笔和刷保存在指针中;CDC:SelectObjectCPen * SelectObject (CPen *pPen);CBrush*SelectObject(Cbrush*pBrush);注意:该函数返回的是原来的设备环境对象的指针2022/8/10341.3 设置绘图属性 (1) 背景色 GetBk

13、Color()返回当前的背景色。 SetBkColor(COLORREF crColor)函数是将当前的背景色设置成参数crColor所代表的颜色值。2022/8/1035(2)背景方式 GetBkMode() SetBkMode(int nBkMode) nBkMode: OPAQUE(不透明) TRANSPARENT(透明) 这两个函数主要影响Chord ,Ellipse和Pie等闭合图形绘图函数。2022/8/1036(3)绘图方式GetROP2( );int SetROP2( int nDrawMode );绘图方式(nDrawMode) 组合后像素的颜色R2_BLACK 总为黑色R2

14、_WHITE 总为白色R2_NOT 颜色与屏幕颜色相反R2_COPYPEN 具有画笔的颜色R2_NOTCOPYPEN 具有与画笔相反的颜色2022/8/1037R2_XORPEN final pixel = pen XOR screen pixel.R2_NOTXORPEN final pixel = NOT(pen XOR screen pixel)2022/8/10380001110001110001110001110001110001110001110110010001110001112022/8/10391.4 几种常用的绘图函数1.画线函数 (1) 成员函数MoveTo:将当前的绘图

15、位置移到point 指定的坐标处 CPoint MoveTo(int x,int y); CPoint MoveTo(POINT point); (2) 成员函数LineTo 在当前的绘图位置上与一个新坐标点之间画一条直线,这个新的坐标点将变成当前位置。 BOOL LineTo (int x,int y); BOOL LineTo (POINT point);2022/8/1040(3)成员函数Arc 画一个椭圆形的弧线,它是一个指定边界矩形内一个内切椭圆的一段。 BOOL Arc(int x1,int y1,int x2, int y2,int x3,int y3,int x4,int y4

16、);(4)成员函数PolylBezier BOOL PolyBezier( const POINT *lpPoints,int nCount); 绘制由几个控制点所决定的多条Bezier曲线一般给定的点为所画样条函数的3倍加12022/8/10412.画简单的闭合图形 (1) Rectangle BOOL Rectangle(int x1,int y1, int x2,int y2); (2) Ellipse BOOL Ellipse(int x1,int y1, int x2,int y2); 2022/8/1042 (3) Chord(一个椭圆和一条直线相交的图形) BOOL Chord(

17、int x1,int y1,int x2,int y2,int x3,int y3,int x4,int y4); (4)Polygon BOOL Polygon( LPPOINT lpPoints, int nCount ); LpPoints是一个指向CPoint实例的POINT数组的指针 其中 nCount22022/8/1043三.鼠标消息函数的应用:2022/8/10442022/8/1045void CMyLineView:OnLButtonDown (UINT nFlags, CPoint point) m_Oldpoint=point;/保存光标的当前位置m_Newpoint=

18、point;/存放画线的起始位置SetCapture(); /捕捉鼠标m_pLMouseDown=TRUE;/表示鼠标为按下的状态CRect rect;GetClientRect(&rect);/获得并保存用户区坐标 MyLine应用程序(鼠标消息的应用)2022/8/1046ClientToScreen(&rect); /用用户区坐标重新计算屏幕坐标ClipCursor(&rect); /限制光标在用户区内/默认处理,调用基类消息处理函数CView:OnLButtonDown(nFlags, point);2022/8/1047void CMyLineView:OnMouseMove (UINT nFlags, CPoint point) if(m_pLMouseDown)CClientDC dc(this); dc.SetROP2(R2_NOT); /设置绘图模式,以屏幕颜色的相反色绘图 2022/8/1048/以重绘的方式擦除前一个OnMouseMove绘制的直线 dc.MoveTo(m_Newpoint); dc.LineTo(m_Oldpoint); dc.MoveTo(m_Newpoint);

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论