c语言画图讲解.docx

上传人:b****4 文档编号:11535167 上传时间:2023-03-19 格式:DOCX 页数:29 大小:51.22KB
下载 相关 举报
c语言画图讲解.docx_第1页
第1页 / 共29页
c语言画图讲解.docx_第2页
第2页 / 共29页
c语言画图讲解.docx_第3页
第3页 / 共29页
c语言画图讲解.docx_第4页
第4页 / 共29页
c语言画图讲解.docx_第5页
第5页 / 共29页
点击查看更多>>
下载资源
资源描述

c语言画图讲解.docx

《c语言画图讲解.docx》由会员分享,可在线阅读,更多相关《c语言画图讲解.docx(29页珍藏版)》请在冰豆网上搜索。

c语言画图讲解.docx

c语言画图讲解

VC绘图/游戏简易教程--1:

创建新项目

[本期目标]学会在VC里面创建项目,并写简单的程序。

VC写程序要有项目的概念,一个项目可以有多个.cpp文件,多个项目构成一个工作区。

先记住这两个英文单词吧:

∙Workspace:

工作区

∙Project:

项目

现在开始创建一个新项目。

∙VC6创建新项目请参考这个视频:

∙VC2008创建新项目请参考:

∙VC2010与VC2008相似。

看明白后,自己动手建立项目试试,并输入以下代码:

#include

voidmain()

{

printf("HelloWorld!

");

}

尤其是之前用tc的同学,请务必创建新项目试一试。

成功执行后,会看到屏幕上有“HelloWorld!

”几个字符。

然后,再重新输入以下代码试试(无需理解代码含义):

#include

#include

voidmain()

{

initgraph(640,480);

line(200,240,440,240);

line(320,120,320,360);

getch();

closegraph();

}

执行后应该可以看到屏幕正中央有一个十字。

看到该十字后,本节课结束。

VC绘图/游戏简易教程--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以至于看不到绘制的内容。

[作业]

用线条画出更多的图形,要求不少于10条直线。

[学习单步执行]

完成作业后(务必完成),开始试着单步执行刚才的程序,由于绘图和多线程等因素的限制,请务必按照以下步骤尝试(熟练了以后就不用了):

1.将VC取消最大化,并缩小窗口,能看到代码就行。

2.按一下F10(单步执行),会看到屏幕上出现一个黄色的小箭头,指示将要执行的代码。

3.当箭头指向initgraph语句时,按F10,能看到窗口发生了变化。

4.将新的绘图窗口和VC并排放,相互不要有覆盖。

这步很重要,否则绘图内容将会被VC窗口覆盖。

5.F10执行getch后,记得激活绘图窗口,并按任意键,否则程序不会继续执行。

6.closegraph后,直接按F5执行全部剩余程序,结束。

单步执行很重要,可以让你知道程序执行到哪里是什么效果,哪条语句执行出了问题等等。

更详细的调试资料,请打开:

下载里面的VC6_how_to_debug.zip

该文档写的调试的东西比较多,看一下大概有个了解,以后都会用到(不过以后我就不再讲了)

[作业2]

仍然是写一个用直线绘制的图形,并熟悉调试过程。

注:

1.许多学校都忽略了调试部分,如果你不曾用过调试,请务必熟练该过程。

2.win-tc不带有任何调试功能,即便你不用vc,也请不要使用win-tc。

调试是相当相当重要的。

VC绘图/游戏简易教程--3:

熟悉更多的绘图语句

[学习目标]

学会更多的绘图语句

[常用的绘图语句]

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

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

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

还有很多,如画椭圆、圆弧、矩形、多边形,等等,请参考绘图帮助文件(第一课的绘图库的下载里面有)

[设置颜色]

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

常用的颜色常量可以用:

BLACK黑DARKGRAY深灰

BLUE蓝LIGHTBLUE亮蓝

GREEN绿LIGHTGREEN亮绿

CYAN青LIGHTCYAN亮青

RED红LIGHTRED亮红

MAGENTA紫LIGHTMAGENTA亮紫

BROWN棕YELLOW黄

LIGHTGRAY浅灰WHITE白

[配出更多的颜色]

颜色除了前面写的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);

[用数字表示颜色]

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

0xrrggbb

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

[延时语句]

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

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

[作业]

1.简单看一下绘图库的帮助文件,了解更多的绘图语句。

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

3.将延时语句适当的插入上个作业的代码中,看看执行效果。

注:

绘图语句不需要记住,用的时候翻翻手册就行。

VC绘图/游戏简易教程--4:

结合流程控制语句来绘图

[学习目标]

熟练使用循环、判断语句

[熟悉for语句]

这步需要自学,看看自己手边的书,是怎样讲for语句的,简单看看就行。

[范例]

例如,画10条直线的代码:

#include

#include

voidmain()

{

initgraph(640,480);

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

line(100,y,300,y);

getch();

closegraph();

}

换一下循环的范围和间隔,看看效果。

还可以用来画渐变色,例如:

#include

#include

voidmain()

{

initgraph(640,480);

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

{

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

line(100,y,300,y);

}

getch();

closegraph();

}

[熟悉if语句]

这步需要自学,看看自己手边的书,是怎样讲if语句的,简单看看就行。

配合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.画国际象棋的棋盘,看手册找到颜色填充语句,实现过期象棋棋盘的区块填充。

4.自学while语句。

学到这里,已经可以画出很多东西了。

把自己想象中的图案绘制一下吧。

VC绘图/游戏简易教程--5:

数学知识在绘图中的运用

[学习目标]

理解数学的重要性

1.最简单的,来个全屏的渐变色吧,是上一课的扩展。

就是需要将0~255的颜色和0~479的y轴对应起来

c表示颜色,范围0~255

y表示y轴,范围0~479

于是:

c/255=y/479

c=y/479*255=y*255/479(先算乘法再算除法可以提高精度)

看代码:

#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)

看看代码:

#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();

}

VC绘图/游戏简易教程--6:

实现简单动画

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

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

1.绘制图像

2.延时

3.擦掉图像

循环以上即可实现动画。

举一个例子,我们实现一条直线从上往下移动:

#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();

}

再看一个例子,实现一个圆从左往右跳动:

#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();

}

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

但当画面较复杂时,会带来画面的闪烁(怎样消除闪烁是以后的话题)。

[作业]

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

VC绘图/游戏简易教程--7:

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

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

getch()

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

charc=getch();

然后再做判断即可。

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

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

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

kbhit()

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

即:

charc;

if(kbhit())

c=getch();

举一个简单的例子,如果有按键,就输出相关按键。

否则,输出“.”。

每隔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);

}

}

结合上一课的简单动画,就可以做出来靠按键移动的图形了吧,看以下代码,实现as控制圆的左右移动:

#include

#include

voidmain()

{

initgraph(640,480);

intx=320;

//画初始图形

setcolor(YELLOW);

setfillstyle(GREEN);

fillellipse(x,240,20,20);

charc;

while(c!

=27)

{

//获取按键

c=getch();

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

setcolor(BLACK);

setfillstyle(BLACK);

fillellipse(x,240,20,20);

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

switch(c)

{

case'a':

x-=2;break;

case'd':

x+=2;break;

case27:

break;

}

//绘制新的图形

setcolor(YELLOW);

setfillstyle(GREEN);

fillellipse(x,240,20,20);

//延时

Sleep(10);

}

closegraph();

}

[作业]

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

1.上下的控制;

2.边界检测;

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

注:

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

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

VC绘图/游戏简易教程--8:

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

例如,我们需要画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();//关闭图形窗口

}

再结合循环等控制条件,就能绘制更复杂漂亮的图案了。

试试运行下面程序,理解一下函数的用处:

#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();//关闭图形窗口

}

运行效果:

本节作业:

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

VC绘图/游戏简易教程--9:

绘图中的位运算

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

先举个例子来个感性认识:

使用XOR运算可以实现擦除图形后不破坏背景,这在时钟程序中绘制表针是很有用的。

稍后我们会给出这样的例子。

一、位运算的运算法则

位运算主要分4种:

NOT、AND、OR、XOR

位运算的运算对象是二进制数(十进制要转换为二进制,计算机会自动转换)。

运算法则如下:

1.NOT

表示“取反”,将二进制位的1变0、0变1。

C语言用符号~表示。

如:

二进制:

~1101=0010用十进制表示就是:

~13=2

2.AND

表示“并且”,只有两数的对应二进制位都为1,结果的二进制位才为1;否则,结果的二进制位为0。

C语言用符号&表示。

如:

二进制:

1101&0110=0100

用十进制表示就是:

13&6=4

3.OR

表示“或者”,两数的对应二进制位只要有一个是1,结果的二进制位就是1;否则,结果的二进制位为0。

C语言用符号|表示。

如:

二进制:

0101|0110=0111

用十进制表示就是:

5|6=7

4.XOR

表示“异或”,两数的对应二进制位不同,结果的二进制位为1;相同,结果的二进制位为0。

C语言用符号^表示。

如:

二进制:

0101^1110=1011

以上只是简单介绍一下,详细的还是请大家看课本上的讲解。

二、位运算的应用

位运算的应用很多,例如AND和OR在获取和设置标志位时经常使用。

更多的,以后大家会逐渐遇到,暂时先记下有这么回事。

这里着重说一下XOR运算,它有一个重要的特性:

(a^b)^b=a

也就是说,a^b之后可能是某些其它数字,但是只要再^b一下,就又成了a。

一些简单的加密就用的XOR的这个特性。

至于绘图,假如a是背景图案,b是将要绘制的图案,只要用XOR方式绘图,连续绘两次,那么背景是不变的。

三、演示

我们来一个简单的绘图XOR运算演示:

#include

#include

voidmain()

{

initgraph(640,480);//初始化640x480的绘图窗口

setlinestyle(PS_SOLID,NULL,10);//设置线宽为10,这样效果明显

rectangle(100,100,200,200);//画一个矩形,当做背景图案

setwritemode(R2_XORPEN);//设置XOR绘图模式

setcolor(RED);//设置画线颜色

line(50,0,200,300);//画线

getch();//等待按任意键

line(50,0,200,300);//画线(XOR方式重复画线会恢复背景图案)

getch();//等待按任意键

closegraph();//关闭绘图窗口

}

运行一下,看到第一次画线后,矩形与直线相交的部分,颜色变成了青色,青色就是白色和红色XOR的值。

当再次以红色画线时,青色部分消失了,还原为完整的白色矩形框。

四、完整的范例

来一个相对完整的范例吧,就是钟表程序,三个表针用的都是XOR方式绘制,请大家运行体会一下XOR的作用:

#include

#include

#include

voidDraw(inthour,intminute,intsecond)

{

doublea_hour,a_min,a_sec;//时、分、秒针的弧度值

intx_hour,y_hour,x_min,y_min,x_sec,y_sec;//时、分、秒针的末端位置

//计算时、分、秒针的弧度值

a_sec=second*2*PI/60;

a_min=minute*2*PI/60+a_sec/60;

a_hour=hour*2*PI

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

当前位置:首页 > 外语学习 > 日语学习

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

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