VC60简单绘图说明.docx
《VC60简单绘图说明.docx》由会员分享,可在线阅读,更多相关《VC60简单绘图说明.docx(36页珍藏版)》请在冰豆网上搜索。
![VC60简单绘图说明.docx](https://file1.bdocx.com/fileroot1/2022-11/28/d7a96c4a-5880-4c42-a0c7-7b85cd112355/d7a96c4a-5880-4c42-a0c7-7b85cd1123551.gif)
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绘图中的位运算
位运算和绘图有什么关系?
先