VC60简单绘图说明.docx

上传人:b****6 文档编号:4296084 上传时间:2022-11-29 格式:DOCX 页数:36 大小:52.57KB
下载 相关 举报
VC60简单绘图说明.docx_第1页
第1页 / 共36页
VC60简单绘图说明.docx_第2页
第2页 / 共36页
VC60简单绘图说明.docx_第3页
第3页 / 共36页
VC60简单绘图说明.docx_第4页
第4页 / 共36页
VC60简单绘图说明.docx_第5页
第5页 / 共36页
点击查看更多>>
下载资源
资源描述

VC60简单绘图说明.docx

《VC60简单绘图说明.docx》由会员分享,可在线阅读,更多相关《VC60简单绘图说明.docx(36页珍藏版)》请在冰豆网上搜索。

VC60简单绘图说明.docx

VC60简单绘图说明

第二章VC6.0简单绘图说明

许多学编程的都是从C语言开始入门的,而目前的现状是:

有些学校以TurboC为环境讲C语言,只是TurboC的环境实在太老了,复制粘贴都很不方便。

有些学校直接拿VC来讲C语言,因为VC的编辑和调试环境都很优秀,并且VC有适合教学的免费版本。

可惜在VC下只能做一些文字性的练习题,想画条直线画个圆都很难,还要注册窗口类、建消息循环等等,初学者会受严重打击的。

初学编程想要绘图就得用TC,很是无奈。

还有计算机图形学,这门课程的重点是绘图算法,而不是Windows编程。

所以,许多老师不得不用TC教学,因为Windows绘图太复杂了,会偏离教学的重点。

新的图形学的书有不少是用的OpenGL,可是门槛依然很高。

要给初学者一个简单的学习平台,就要VC的开发平台和TC的简单的绘图功能,于是就有了这个EasyX库,我们需要在VC下下载安装EasyX库,下载地址:

http:

//

1.系统支持

操作系统版本:

Windows2000及以上系统。

编译环境版本:

VisualC++6.0/2008(x86&x64)/2010(x86&x64)。

2.安装

请先将下载的压缩包解压缩,然后执行Setup.hta,并跟随提示安装。

安装程序会检测已经安装的VC版本,并根据选择将对应的.h和.lib文件安装至VC的include和lib文件夹内。

安装程序不会修改注册表或者本机的任何文件。

如果需要手动安装,请根据下面的文件列表说明将安装包里的相关文件分别复制到VC对应的include和lib文件夹内,或者将include和lib文件夹放到任意位置,然后修改VC中的Lib和Include的引用路径。

3.卸载

由于安装程序并不改写注册表,因此在“添加删除程序”中不会看到EasyX的卸载项。

如需卸载,请执行相应版本的Setup.hta,并根据提示卸载

4.文件列表说明

下载的压缩包里文件列表及对应说明如下:

压缩包

 ├include<文件夹>

 │ └graphics.h     /*程序需要引用的头文件*/

 ├lib<文件夹>

 │ ├amd64<文件夹>

 │ │ ├graphicsw.lib /*VC2008/VC2010MBCS库文件(x64)*/

 │ │ └graphicswu.lib /*VC2008/VC2010Unicode库文件(x64)*/

 │ ├graphics.lib    /*VC6MBCS库文件*/

 │ ├graphicsu.lib   /*VC6Unicode库文件*/

 │ ├graphicsw.lib   /*VC2008/VC2010MBCS库文件(x86)*/

 │ └graphicswu.lib   /*VC2008/VC2010Unicode库文件(x86)*/

 ├EasyX_Help.chm     /*帮助文件*/

 └Setup.hta       /*安装程序项目依赖*/

使用上,基本和TurboC没太大区别。

启动VisualC++,创建一个控制台项目(Win32ConsoleApplication),然后添加一个新的代码文件(.cpp),并引用graphics.h头文件就可以了。

来看一个简单例子:

【例2-1】画一个圆。

#include/*就是需要引用这个图形库*/

#include

voidmain()

{

initgraph(640,480);/*这里和TC略有区别*/

circle(200,200,100);/*画圆,圆心(200,200),半径100*/

getch();/*按任意键继续*/

closegraph();/*关闭图形界面*/

}  

TC绘图有不少区别的,比如颜色上,TC只有16色,而这个库支持了真彩色。

还有,这个库增加了鼠标、批量绘图、读取图片(点阵或矢量)等功能。

2.1几个基本概念

1.颜色

EasyX使用24bit真彩色,不再支持调色板模式。

表示颜色有以下几种办法:

1)用预定义颜色常量,如下表所示:

常量

颜色

 

常量

颜色

BLACK

0

DARKGRAY

0x545454

深灰

BLUE

0xA80000

LIGHTBLUE

0xFC5454

亮蓝

GREEN

0x00A800

绿

LIGHTGREEN

0x54FC54

亮绿

CYAN

0xA8A800

LIGHTCYAN

0xFCFC54

亮青

RED

0x0000A8

LIGHTRED

0x5454FC

亮红

MAGENTA

0xA800A8

LIGHTMAGENTA

0xFC54FC

亮紫

BROWN

0x0054A8

YELLOW

0x54FCFC

LIGHTGRAY

0xA8A8A8

浅灰

WHITE

0xFCFCFC

表21预定义颜色常量

2)用16进制的颜色表示,形式为:

0xbbggrr(bb=蓝,gg=绿,rr=红)

3)用RGB宏合成颜色。

详见RGB。

4)用HSLtoRGB、HSVtoRGB转换其它色彩模型到RGB颜色。

详见HSLtoRGB、HSVtoRGB。

以下是部分设置前景色的方法:

setcolor(0xff0000);

setcolor(BLUE);

setcolor(RGB(0,0,255));

setcolor(HSLtoRGB(240,1,0.5));

2.坐标

在EasyX中,坐标分两种:

逻辑坐标和物理坐标。

1)逻辑坐标

逻辑坐标是在程序中用于绘图的坐标体系。

坐标默认的原点在屏幕的左上角,X轴向右为正,Y轴向下为正,度量单位是像素。

坐标原点可以通过setorigin()函数修改;

坐标轴方向可以通过setaspectratio()函数修改;

缩放比例可以通过setaspectratio()函数修改。

在本书中,凡是没有注明的坐标,均指逻辑坐标。

2)物理坐标

物理坐标是描述设备的坐标体系。

坐标原点在屏幕的左上角,X轴向右为正,Y轴向下为正,度量单位是像素。

坐标原点,坐标轴方向,缩放比例都不能改变。

3.设备

所谓“设备”,简单来说,就是绘图表面。

在EasyX中,设备分两种,一种是默认的绘图窗口,另一种是IMAGE对象。

通过SetWorkingImage()函数可以设置当前用于绘图的设备。

设置当前用于绘图的设备后,所有的绘图函数都会绘制在该设备上。

2.2函数说明

EasyX函数共分以下几大类:

1.绘图环境相关函数;

2.颜色表示及相关函数;

3.绘制图形相关函数;

4.文字输出相关函数;

5.图像处理相关函数;

6.鼠标相关函数;

7.其它函数。

函数的详细说明详见附录A。

2.3简单绘图

【例2-2】实现一个简单绘图。

#include/*绘图库头文件,绘图语句需要*/

#include/*控制台输入输出头文件,getch()语句需要*/

voidmain()

{

initgraph(640,480);/*初始化640x480的绘图屏幕*/

line(200,240,440,240);/*画线(200,240)-(440,240)*/

line(320,120,320,360);/*画线(320,120)-(320,360)*/

getch();/*按任意键*/

closegraph();/*关闭绘图屏幕*/

}

说明:

1.创建的绘图屏幕640x480,表示横向有640个点,纵向有480个点。

注意:

左上角是原点(0,0),也就是说,y轴和数学的y轴是相反的。

2.getch实现按任意键功能,按任意键后,程序继续执行。

否则,程序会立刻执行closegraph以至于看不到绘制的内容。

【练习题】

1)用线条画出更多的图形,要求不少于10条直线,并熟悉调试过程。

2.4常用的绘图语句

1.常用的绘图语句

line(x1,y1,x2,y2);/*画直线(x1,y1)-(x2,y2),都是整型*/

circle(x,y,r);/*画圆,圆心为(x,y),半径为r*/

putpixel(x,y,c);/*画点(x,y),颜色c*/

还有很多,如画椭圆、圆弧、矩形、多边形,等等,请参考2.2节函数说明。

2.设置颜色

setcolor(c);/*设置绘图颜色,如setcolor(RED)设置为红色等*/

常用的颜色常量可以用:

BLACK黑DARKGRAY深灰

BLUE蓝LIGHTBLUE亮蓝

GREEN绿LIGHTGREEN亮绿

CYAN青LIGHTCYAN亮青

RED红LIGHTRED亮红

MAGENTA紫LIGHTMAGENTA亮紫

BROWN棕YELLOW黄

LIGHTGRAY浅灰WHITE白

3.配出更多的颜色

颜色除了前面写的16种以外,还可以自由配色。

格式:

RGB(r,g,b)

r/g/b分别表示红色、绿色、蓝色,范围都是0~255。

例如,RGB(255,0,0)表示纯红色。

红色和绿色配成黄色,因此RGB(255,255,0)表示黄色。

嫌调色麻烦可以用画笔里面的调色试试,调好了以后直接将数值抄过来就行。

例如,画两条红色浓度为200的直线,可以写:

setcolor(RGB(200,0,0));

line(100,100,200,100);

line(100,120,200,120);

4.用数字表示颜色

除了用RGB(r,g,b)方式外,还可以用16进制表示颜色,格式:

0xrrggbb

例如,setcolor(0xff0000)和setcolor(RGB(255,0,0))是等效的。

5.延时语句

这个很简单Sleep(n)就可以表示n毫秒的延时。

例如延时3秒,可以用Sleep(3000);

【练习题】

1)绘制更丰富的图形内容,不低于20行。

2)将延时语句适当的插入上一小节的练习题的代码中,看看执行效果。

2.5结合流程控制语句来绘图

1.熟练使用循环语句来控制程序流程。

【例2-3】使用for循环语句画10条直线。

#include

#include

voidmain()

{

initgraph(640,480);

for(inty=100;y<200;y+=10)

line(100,y,300,y);

getch();

closegraph();

}

【例2-4】修改一下循环的范围和间隔。

#include

#include

voidmain()

{

initgraph(640,480);

for(inty=0;y<256;y++)

{

setcolor(RGB(0,0,y));

line(100,y,300,y);

}

getch();

closegraph();

}

2.熟练使用判断语句来控制程序流程。

【例2-5】配合if语句,实现红色、蓝色交替画线。

#include

#include

voidmain()

{

initgraph(640,480);

for(inty=100;y<200;y+=10)

{

if(y/10%2==1)/*判断奇数行偶数行*/

setcolor(RGB(255,0,0));

else

setcolor(RGB(0,0,255));

line(100,y,300,y);

}

getch();

closegraph();

}

【练习题】

1)画围棋棋盘。

2)画中国象棋的棋盘

3)画国际象棋的棋盘,看手册找到颜色填充语句,实现过期象棋棋盘的区块填充。

2.6数学知识在绘图中的运用

数学在绘图中起着重要作用。

1.绘一个全屏的渐变色问题

例如,如果需要将将0~255的颜色和0~479的y轴对应起来:

c表示颜色,范围0~255

y表示y轴,范围0~479

于是:

c/255=y/479

c=y/479*255=y*255/479

说明:

先算乘法再算除法可以提高精度。

【例2-6】绘一个全屏的渐变色。

#include

#include

voidmain()

{

initgraph(640,480);

intc;

for(inty=0;y<480;y++)

{

c=y*255/479;

setcolor(RGB(0,0,c));

line(0,y,639,y);

}

getch();

closegraph();

}

2.画一个圆形的渐变色问题

首先,我们要用到圆形的基本公式:

x*x+y*y=r*r;让弧度从0~2*3.14,然后需要根据弧度和半径算出(x,y),用pi表示圆周率;用r表示半径;用a表示弧度(小数);用c表示颜色。

于是:

x=r*cos(a)

y=r*sin(a)

c=a*255/(2*pi)

【例2-7】画一个圆形的渐变色。

#include

#include

#include

voidmain()

{

initgraph(640,480);

intc;

doublea;

intx,y,r=200;

for(a=0;a

{

x=(int)(r*cos(a)+320+0.5);

y=(int)(r*sin(a)+240+0.5);

c=(int)(a*255/(2*PI)+0.5);

setcolor(RGB(c,0,0));

line(320,240,x,y);

}

getch();

closegraph();

}

2.7实现简单动画

所谓动画,其实是连续显示一系列图形而已。

结合到程序上,我们需要以下几个步骤:

1.绘制图像;

2.延时;

3.擦掉图像;

循环以上即可实现动画。

【例2-8】举一个例子,我们实现一条直线从上往下移动。

#include

#include

voidmain()

{

initgraph(640,480);

for(inty=0;y<480;y++)

{

/*绘制绿色直线*/

setcolor(GREEN);

line(0,y,639,y);

Sleep(10);/*延时*/

/*绘制黑色直线(即擦掉之前画的绿线)*/

setcolor(BLACK);

line(0,y,639,y);

}

closegraph();

}

【例2-9】再看一个例子,实现一个圆从左往右跳动。

#include

#include

voidmain()

{

initgraph(640,480);

for(intx=100;x<540;x+=20)

{

/*绘制黄线、绿色填充的圆*/

setcolor(YELLOW);

setfillstyle(GREEN);

fillcircle(x,100,20);

Sleep(500);/*延时*/

/*绘制黑线、黑色填充的圆*/

setcolor(BLACK);

setfillstyle(BLACK);

fillcircle(x,100,20);

}

closegraph();

}

说明:

移动的间距小、延时短,动画就会越细腻。

但当画面较复杂时,会带来画面的闪烁。

【练习题】

1)绘制一个沿45度移动的球,碰到窗口边界后反弹。

2.8捕获按键,实现动画的简单控制

最常用的一个捕获按键的函数:

getch();

前几课,都把这个函数当作“按任意键继续”来用,现在我们用变量保存这个按键:

charc=getch();

然后再做判断即可。

不过程序执行到getch()是会阻塞的,直到用户有按键才能继续执行。

可游戏中总不能因为等待按键而停止游戏执行吧?

所以,要有一个函数,判断是否有用户按键:

kbhit()

这个函数返回当前是否有用户按键,如果有,再用getch()获取即可,这样是不会阻塞的。

即:

charc;

if(kbhit())

c=getch();

【例2-10】如果有按键,就输出相关按键。

否则,输出“.”。

每隔100毫秒输出一次。

按ESC退出。

注:

ESC的ASCII码是27。

#include

#include

#include

voidmain()

{

charc=0;

while(c!

=27)

{

if(kbhit())

c=getch();

else

c='.';

printf("%c",c);

Sleep(100);

}

}

结合上一课的简单动画,就可以做出来靠按键移动的图形了。

【例2-11】实现as控制圆的左右移动。

#include

#include

voidmain()

{

initgraph(640,480);

intx=320;

/*画初始图形*/

setcolor(YELLOW);

setfillstyle(GREEN);

fillcircle(x,240,20);

charc;

while(c!

=27)

{

/*获取按键*/

c=getch();

/*先擦掉上次显示的旧图形*/

setcolor(BLACK);

setfillstyle(BLACK);

fillcircle(x,240,20);

/*根据输入,计算新的坐标*/

switch(c)

{

case'a':

x-=2;break;

case'd':

x+=2;break;

case27:

break;

}

/*绘制新的图形*/

setcolor(YELLOW);

setfillstyle(GREEN);

fillcircle(x,240,20);

/*延时*/

Sleep(10);

}

closegraph();

}

【练习题】

请继续完成这个程序,实现以下功能:

1)上下的控制;

2)边界检测;

3)结合kbhit实现惯性移动(即按一下方向键,圆就会一直向这个方向移动)

注:

上下左右等按键的控制,会返回2个字符。

由于该系列教程面向初学者,因此有兴趣的请查看MSDN。

2.9用函数简化相同图案的制作

实际中有许多类似的图案,如果一一单独绘制,太麻烦。

于是,我们需要一个公用的绘制过程,就是函数。

例如,我们需要画5个三角形,位于不同的位置。

我们可以将绘制单个三角形的过程写成函数,函数内是一个独立的程序段,这个绘制过程很简单。

然后,在需要绘制的时候,调用这个函数即可。

可以通过参数来解决细微差异(图案的坐标、颜色等)。

【例2-12】画5个位于不同位置的三角形。

#include

#include

/*在坐标(x,y)处,用颜色c绘制三角形*/

voidsanjiaoxing(intx,inty,intc)

{

/*设置画线颜色*/

setcolor(c);

/*画三角形的三条边*/

line(x,y,x+50,y);

line(x,y,x,y+50);

line(x+50,y,x,y+50);

}

voidmain()

{

initgraph(640,480);/*初始化图形窗口*/

sanjiaoxing(100,100,RED);

sanjiaoxing(120,160,BLUE);

sanjiaoxing(140,220,GREEN);

sanjiaoxing(160,120,BLUE);

sanjiaoxing(160,160,GREEN);

sanjiaoxing(220,140,GREEN);

getch();/*按任意键继续*/

closegraph();/*关闭图形窗口*/

}

【例2-13】结合循环等控制条件,绘制更复杂漂亮的图案。

#include

#include

voidsanjiaoxing(intx,inty,intcolor)

{

/*设置画线颜色*/

setcolor(color);

/*画三角形的三条边*/

line(x,y,x+10,y);

line(x,y,x,y+10);

line(x+10,y,x,y+10);

}

voidmain()

{

initgraph(640,480);/*初始化图形窗口*/

for(intx=0;x<640;x+=10)

for(inty=0;y<480;y+=10)

sanjiaoxing(x,y,RGB(x*255/640,y*255/480,0));

getch();/*按任意键继续*/

closegraph();/*关闭图形窗口*/

}

运行效果如下图:

图21运行效果图

【练习题】

1)绘制Windows自带游戏“扫雷”的初始界面。

2.10绘图中的位运算

位运算和绘图有什么关系?

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 理化生

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1