设计1 环境设置 (实验环境 microsoft visual studio 2010) 一、实验目的1.掌握图形驱动程序及图形模式的基本概念,掌握图形初始化方法;2.掌握进行图形程序设计的基本方法;3.了解的图形功能,了解常见的图形库函数;二、实验要求1.图形系统初始化;2.综合应用图形库函数,进行图形设计与绘制;3.熟悉开发环境,要求会对程序进行编辑,编译,调试三、设计说明图形系统初始化以及主要代码:#include "stdafx.h"#include <iostream>#include <windows.h>using namespace std;LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)//回调函数{HDC hdc ; //设备句柄PAINTSTRUCT ps ; //绘图结构RECT rect,rc ; //矩形结构HBRUSH hBrush; //刷子HPEN hpen; //笔SYSTEMTIME tm; //定义时间结构体变量switch (message) //从回调函数的参数据中传入的值,是系统执行回调函数之后的结果体现{case WM_PAINT: //画矩形hdc = BeginPaint (hwnd, &ps) ;//准备指定的窗口来重绘并将绘画相关的信息放到一个PAINTSTRUCT结构中SetTextColor(hdc,RGB(0,255,255));//设置指定设备环境(HDC)的字体颜色TextOut(hdc,10,160, TEXT("画出直线!"),16);//该函数用当前选择的字体、背景颜色和正文颜色将一个字符串写到指定位置MoveToEx(hdc,200,100,NULL);//将当前绘图位置移动到某个具体的点,同时也可获得之前位置的坐标。
开始画线,从100,100开始LineTo(hdc,300,400);//用当前画笔画一条线,从当前位置连到一个指定的点。
这个函数调用完毕,当前位置变成x,y/*以下是画笔的用法,函数原型是BOOL CreatePen(int nPenStyle, int nWidth, COLORREF crColor); 功能是:用指定的样式、宽度和颜色创建一个画笔参数(1)nPenStyle指定画笔样式,可以是下述常数之一,PS_SOLID画笔画出的是实线;PS_DASH 画笔画出的是虚线(nWidth必须是1);PS_DOT画笔画出的是点线(nWidth必须是1);PS_DASHDOT画笔画出的是点划线(nWidth必须是1);PS_DASHDOTDOT画笔画出的是点-点-划线(nWidth必须是1);PS_NULL画笔不能画图;PS_INSIDEFRAME画笔在由椭圆、矩形、圆角矩形、饼图以及弦等生成的封闭对象框中画图。
如指定的准确RGB颜色不存在,就进行抖动处理。
参数(2)nWidth 以逻辑单位表示的画笔的宽度参数(3)crColor画笔的RGB颜色返回值:如函数执行成功,就返回指向新画笔的一个句柄;否则返回零。
一旦不再需要画笔,记得用DeleteObject函数将其删除。
*/hpen=CreatePen(PS_SOLID,5,RGB(0,255,0));//获得刷子SelectObject(hdc,hpen);//选择你获得的刷子。
该函数选择一对象到指定的设备上下文环境中,该新对象替换先前的相同类型的对象。
原型:HGDIOBJ SelectObject(HDC hdc, HGDIOBJ hgdiobj)MoveToEx(hdc,200,200,NULL);//刷子的起点LineTo(hdc,500,500);//刷子的结束点/*下面的函数取得客户端的矩形,rect和rc为用户定义的矩形结构变量。
该函数获取窗口客户区的坐标。
客户区坐标指定客户区的左上角和右下角。
由于客户区坐标是相对窗口客户区的左上角而言的,因此左上角坐标为(0,0),函数原型BOOL GetClientRect(HWND hWnd,LPRECT lpRect );第一个参数为窗口句柄,第二个参数为客户区坐标*/GetClientRect (hwnd, &rect);rc.left=rect.left+300;//客户端矩形的左上方点加400像素rc.top=rect.top+300;rc.right=rect.right-50;rc.bottom=rect.bottom-20;/*下面的函数创建一个具有指定颜色的逻辑刷子。
函数原理:HBRUSH CreateSolidBrush(COLORREF crColor);参数crColor:指定刷子的颜色。
返回值:如果该函数执行成功,那么返回值标识一个逻辑实心刷子;如果函数失败,那么返回值为NULL。
实心刷子实际上就是指系统用来绘制要填充图形的内部区域的位图。
在应用程序调用CreateSolidBrush创建刷子以后,可以通过调用SelectObject函数把该刷子选入设备环境。
*/hBrush=CreateSolidBrush(RGB(0,255,255));//创建刷子,并变化矩形中的颜色FillRect(hdc,&rc,hBrush);//用指定的画刷填充矩形,此函数包括矩形的左上边界,但不包括矩形的右下边界。
原型:int FillRect(HDC hdc, CONST RECT *lprc, HBRUSH hbr)/*以下函数用来设置背景色,hDC是当前设备的句柄,mode是要设置的模式,其值可以为OPAQUE 和TRANSPARENT。
比如按钮的文字颜色是黑色的,而背景是灰色的,这就需要使用SetBkMode函数来设置DrawText函数的输出方式,OPAQUE的方式是用当前背景的画刷的颜色输出显示文字的背景,而TRANSPARENT是使用透明的输出,也就是文字的背景是不改变的。
*/SetBkMode(hdc,TRANSPARENT);//设置背景为透明色/*以下函数用来设置指定设备环境(HDC)的字体颜色,原型为DWORD SetTextColor (HDC, DWORD),其中DWORD是关于颜色的参数,常用RGB()获取。
当然设备环境(HDC)要通过BeginPaint(HWND,&PAINTSTRUCTURE)或GetDC(HWND)获得。
*/SetTextColor(hdc,RGB(255,255,0));//设置文本的颜色/*以下函数在指定的矩形里写入格式化的正文,根据指定的方法对正文格式化(扩展的制表符,字符对齐、折行等)。
*/DrawText(hdc, TEXT ("画出矩形!"), -1, &rc,DT_SINGLELINE | DT_CENTER | DT_VCENTER) ;//单行模式|中心对齐|垂直对齐//Rectangle(hdc,0,0,50,50);//矩形//FillRect(hdc,50,50,300,300);//填充矩形EndPaint (hwnd, &ps) ;//结束画return 0;case WM_DESTROY://关闭窗口时的操作PostQuitMessage (0) ;//弹出一个退出消息框return 0 ;}return DefWindowProc (hwnd, message, wParam, lParam) ;}四、运行结果及分析五、总结通过实验一,了解了如用使用基本函数绘制简单的图形,如在指定的位置输出基本图形线,方形的绘制。
设计2 直线生成算法一、实验目的1. 通过实现中点直线生成算法,对算法原理加深理解。
2. 对程序以及函数的细节有了更深入的把握。
二、实验要求实现一个直线的中点生成算法的程序三、设计说明1.算法主要思想:讨论斜率k ∈[1,+∞)上的直线段的中点算法。
对直线01p p ,左下方的端点为0p (x0,y0),右上方的端点为1p (x1,y1)。
直线段的方程为: y m x B =+⇔yy x B x y y x x B x∆=+⇔∆=∆+∆∆ (,)0F x y xy yx xB ⇔=∆-∆-∆= 现在假定已求得像素(,,i r i x y ),则如图得 ,,11(,]22i i r i r x x x ∈-+ 由于直线的斜率k ∈[1,+∞),故m=1/k ∈(0,1],则1,,13(,]22i i r i r x x x +∈-+ 在直线1i y y =+上,区间,,13(,]22i r i r x x -+内存在两个像素NE 和E 。
根据取整原则,当11(,)i i x y ++在中点M 11(,)2i i x y ++右方时,取像素NE ,否则取像素E ,即,11,,1()()01()()0i r i i r i r i x E F M x x x NE F M x +++⎧⇔≤=⎨+⇔>⎩i i 点当(,y +1)在左方时点当(,y +1)在右方时若取2()i d F M =,则上式变为 ,1,,()01(0i r i i r i r i x E d x x NE d +⎧≤=⎨+>⎩点当点)当计算i d 的递推公式如下:,11,12[(2)()]0122(,2)0122[(2)(1)]2i i r i i i i i i i rx y y x xB d d F x y d x y y x xB ++⎧∆+-∆+-∆⎪≤⎪=++=⎨>⎪∆+-∆++-∆⎪⎩=202()i i i i d x d d x y d +∆≤⎧⎨+∆-∆>⎩算法的初始条件为:00,00,0(,)(0,0)12(,1)22r r x y x y d F x y x y =⎧⎪⎨=++=∆-∆⎪⎩2.主要程序代码: 建立成员函数:void MidPointLine4(CDC*pDC,int x0,int y0,int x1,int y1,int color) { /*假定x0<x1,直线斜率m>1*/int dx,dy,incrE,incrNE,d,x,y; dx=x1-x0; dy=y1-y0; d=2*dx-dy; incrE=2*dx;incrNE=2*(dx-dy); x=x0;y=y0;pDC->SetPixel(x,y,color); while (x<x1) {if (d<=0) d+=incrE; else{ d+=incrNE; x++; } y++;p->SetPixel(x,y,color);} }编写OnDraw 函数:void CMy1_1View::OnDraw(CDC* pDC) { CMy1_1Doc* pDoc = GetDocument(); ASSERT_V ALID(pDoc); // TODO: add draw code for native data here MidPointLine4(pDC,200,200,300,300,RGB(0,0,0));MidPointLine4(pDC,300,200,400,300,RGB(0,0,0));MidPointLine4(pDC,400,200,500,300,RGB(0,0,0));}四、运行结果及分析编译运行程序得到如下结果:五、总结通过实验二,更透彻的理解了课本上的中点画线函数,学习了一些相关的内容,进一步的了解图形学的结构和思想。