| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4712 人关注过本帖
标题:用C语言实现画图功能有什么好教材?
只看楼主 加入收藏
剑人
Rank: 1
等 级:新手上路
帖 子:58
专家分:0
注 册:2005-9-21
收藏
 问题点数:0 回复次数:26 
用C语言实现画图功能有什么好教材?
我想学,但好像很少有这样的书籍,有高手介绍一下呀!

不要什么api库函数介绍之类的

我现在连怎么用c语言画图都不会呀

谢谢
搜索更多相关主题的帖子: C语言 画图 教材 c语言 
2006-04-23 16:09
cdmalcl
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:24
帖 子:4091
专家分:524
注 册:2005-9-23
收藏
得分:0 

什么教材都一样
你先把基本的几个图形库函数弄明白
然后再看看关于一些图形的算法的书

2006-04-23 16:48
cdmalcl
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:24
帖 子:4091
专家分:524
注 册:2005-9-23
收藏
得分:0 

我先在此给你介绍几个基本的(也是比较重要和常用的)几个图形库函数,为了照顾新手的兴趣,并且由于表达水平有限,在此只介绍函数的使用方法,具体原理请查阅其他资料:
图形模式和文本模式是C语言两个的基本模式。文本模式是为了进行简单的字符输入和输出,不能达到做图的目的。
那么首先就要知道如何进入图形模式。
void far initgraph(int far *driver,int far *mode,char far *path)
文件头在graphics.h中
通过这个库函数可以让我们从文本模式进入到图形模式。
driver和mode分别是图形驱动器和模式,path是指图形驱动程序所在的目录路径(因为程序往往在不同的环境下运行,所以一般采用自动搜索形式,既直接把path写成""就行)
图形的显示也有很多模式,如CGA,MCGA,EGA,VGA等。调取这些模式的任务是由driver(图形驱动器)来实现。(具体内容在此不做介绍)
一般情况下我们用DETECT这个常量来完成就可以。当driver=DETECT时,函数将自动检测目前系统屏显硬件的类型,并选用最大分辨率的屏显模式。
相同的图形驱动器下也有不同的模式,因此在一定的图形驱动器下调用不同的图形模式就用mode来实现。当然在driver=DETECT时,mode就不用设置拉。
关于driver和mode对应的分辨率表在此不做介绍。
在此给出几个例子:
#include<graphics.h>
main()
{
int driver,mode;
driver=DETECT;
initgraph(&driver,&mode,"");/*这样你就进入了图形模式*/

getch();
}

2006-04-23 17:29
cdmalcl
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:24
帖 子:4091
专家分:524
注 册:2005-9-23
收藏
得分:0 
进入了图形模式后我们就可以用图形函数进行画图拉!
在此先给大家介绍几个常用的和好理解的图形函数:
bar
【功能】画出一条栏目。
【原型】void far bar(int left,int top,int right,int bottom)
bar3d
【功能】画出一条3-D栏目。
【原型】void far bar3d(int left,int top,int right,int bottom,int depth,int topflag)
circle
【功能】以(x,y)为圆心按照指定的半径画出一个圆。
【原型】void far circle(int x,int y,int radius)
ellipse
【功能】画出一条椭圆形的圆弧。
【原型】void far ellipse(int x,int y,int stangle,int endangle,int xradius,int yradius)
【说明】中心点在(x,y),stangle和endangle表示一角度为单位的起始角和终止角。Xradius和yradius表示水平轴和垂直轴。
fillellipose
【功能】画出椭圆形圆弧,并填充。
【原型】void far fillllipse(int x,int y,int xradius,int yradius)
【说明】使用(x,y)作为中心点,然后使用当前的填充模式填充圆弧。Xradius和yradius表示水平轴和垂直轴。
line
【功能】在两个指定点之间画出一条直线。
【原型】lint(int x1,int y1,int x2,int y2)
【说明】使用当前颜色、线条样式和线条粗细从(x1,y1)画一条直线到(x2,y2)。
linerel
【功能】从当前位置(CP)画一条一直长度的直线。
【原型】linerel(int dx,int dy)
【说明】使用当前颜色、线条样式和线条粗细。
lineto
【功能】从当前位置(CP)到(x,y)之间画一条直线。
【原型】void far lineto(int x,int y)
pieslice
【功能】画出扇形区并加以填充。
【原型】void far pieslice(int x,int y,int stangle,int endangle,int radius)
rectangle
【功能】画出一个矩形(图形模式)。
【原型】void far rectangle(int left,int top,int right,int bottom)
【说明】使用当前线条样式、线条粗细和颜色。
sector
【功能】画出椭圆形的扇形区并加以填充。
【原型】void far sector(int x,int y,int stangle,int endangle,int xradius,int yradius)
【位置】graphics.h
【说明】x和y定义出中心点,stangle和endangle则定义起始和终止角。Xradius和yradius表示水平和垂直半径。

[此贴子已经被作者于2006-4-23 19:17:28编辑过]

2006-04-23 17:53
cdmalcl
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:24
帖 子:4091
专家分:524
注 册:2005-9-23
收藏
得分:0 

putpixel
【功能】在指定点上画一个像素。
【原型】void far putpixel(int x,int y,int pixelcolor)
getimage
【功能】将制定区域的位图保存到内存中。
【原型】void far getimage(int left,int top,int right,int bottom,void far *bitmap)
着重指出这两个函数,他两个是非常常用的函数。
一般实现动画效果都少不了他俩

[此贴子已经被作者于2006-4-23 19:04:07编辑过]

2006-04-23 17:57
cdmalcl
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:24
帖 子:4091
专家分:524
注 册:2005-9-23
收藏
得分:0 

图片当然少不了颜色!先说明图形模式下一般只能实现0~15色的显示。
getcolor
【功能】返回当前画笔的颜色。
【原型】int far getcolor(void)
setcolor
【功能】设置当前画笔颜色。
【原型】void far setcolor(int color)
通过setcolor可以设置线,多边形、椭圆、圆的边框颜色。还能通过它设置图形模式下的文本输出的颜色。

如果你想填充,那你就会用到:

setfillstyle
【功能】设置填充模式和颜色。
【原型】void far setfillstype(int pattern,int color)
【位置】dos.h

关于pattern有一个填充表,可以去查阅一下资料,取值范围是0~12,其中0是用背景颜色填充,1是实填充,12是用户自定义填充。关于用户自定义填充要用到setfillpattern
setfillpattern
【功能】选择一个用户自定义的填充模式。
【原型】void far setfillpattern(char far *upattern,int color)
【位置】graphics.h
【说明】upattern指向一个8字节的区域,其中定义了一个8*8位的模式。
【参见】fill_patterns,getfillpattern,getfillsettings,setfillstyle
在此不做介绍!
color自然是指填充颜色拉!(0~16)

除此TC还提供一个设置背景的函数:
setbkcolor
【功能】使用调色板设置当前的背景颜色。
【原型】void far setbkcolor(int color)
这个很好理解,作个程序试一下就知道拉!

[此贴子已经被作者于2006-4-23 18:29:50编辑过]

2006-04-23 18:18
cdmalcl
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:24
帖 子:4091
专家分:524
注 册:2005-9-23
收藏
得分:0 

制作图形程序大家最关心的莫过于动画的实现,那我们首先想到的是如何清屏拉:
cleardevice
【功能】清除图形画面。
【原型】void far cleardevice(void)
通过它我们可以清楚屏显上的所有内容(但不能清楚背景颜色)。
clearviewport
【功能】清除当前可视区域。
【原型】clearviewport(void)
可视区域指的是通过setviewport定义的视口
setviewport
【功能】设置图形输出的当前视口。
【原型】void far setviewport(int left,int top,int right,int bottom,int clip)
其中(left, top),(right,bottom)指的是视口的左上角和右下角坐标
其中clip等于1时对定义视口后的超出视口的输出自动修剪,clip等于0时则不修剪。
注意的是当clip=1时,对putimage(见下)的输出不做修剪。
一般在对动画速度要求比较高的情况下不用它。

动画的实现离开不了图形的保存:
imagesize
【功能】返回存储位图所需的字节数。
【原型】unsigned far imagesize(int left,int top,int right,int bottom)
getimage
【功能】将制定区域的位图保存到内存中。
【原型】void far getimage(int left,int top,int right,int bottom,void far *bitmap)
putimage
【功能】在屏幕上输出一副位图。
【原型】void far putimage(int left,int top,void far *bitmap,int top)
【说明】bitmap指向一副位图,该位图通常由getimage函数创建。Op的数值说明如何在(left,top)点将图像与区域中的当前内容结合起来。
通过它们我们可以实现动画的保存。
举个例子来说明:
#include<graphics.h>
#include<stdlib.h>
#include <time.h>
#include <math.h>
main()
{
int gd,gm;
int i,t;
unsigned int size;
void *buf;
gd=DETECT;
initgraph(&gd,&gm,"");
srand((unsigned) time(&t));
/*随机函数初始化*/
/******************借此也复习一下以前说过的东西********************/
setcolor(random(15));
setbkcolor(random(15));
circle(200,100,50);
fillellipse(100,200,25,30);

for(i=1;i<100;i++)
{
setfillstyle(1,random(15));
fillellipse(random(100)+200,random(100)+200,random(100),random(100));
}
getch();

size=imagesize(100,100,200,200);/*把存储位图(100,100)到(200,200)所需的字节数给size*/
buf=malloc(size);/*给指针buf分配所需空间*/
getimage(100,100,200,200,buf);/*将(100,100)到(200,200)区域的位图保存到buf中*/
cleardevice();
putimage(250,150,buf,COPY_PUT);/*将buf中的位图放在左上角为(250,150)上*/

getch();
free(buf);/*释放buf*/
closegraph();/*关闭图形模式*/
}

LdhMsj63.txt (992 Bytes)

[此贴子已经被作者于2006-4-26 11:08:48编辑过]

2006-04-23 19:01
cdmalcl
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:24
帖 子:4091
专家分:524
注 册:2005-9-23
收藏
得分:0 

在图形模式下也常常需要进行文字输出。想想我们在文本模式下经常用的输出函数————printf putc cprintf fprintf等等。但是如果你曾经进行过图形模式下的文字输出你会发现以前用的输出函数变的很不舒适拉,而且还不能用gotoxy去定位!————这可是太要命拉!!那么在图形模式下就不能象文本模式下那样舒适输出文字吗?
回答自然是否拉!在图形模式下需要一些新的文字输出函数:
outtext
【功能】在视窗中(图形模式)显示一个字符串。
【原型】void far outtext(char far *textstring)
用它就可以!
当然还有一个定位问题:
moveto
【功能】从当前位置(CP)移动到(x,y)点。
【原型】void far moveto(int x,int y)
moveto就类似的相当于文本模式下的gotoxy(当然还有很多不同点,在此不做介绍)
把它们结合在一起你就会随意地在图形模式下进行文字输出拉!
除死之外,还有一个更方便的输入函数,把它们两个进行了中和:
outtextxy
【功能】在指定位置(图形模式)发送一个字符串。
【原型】void far outtextxy(int x,int y,char far *textstring)

为什么说比文本模式下输出更舒适呢?:
settextstyle
【功能】设置当前文本属性。
【原型】void far settextstyle(int font,int direction,int charsize)
其中font是字体的类型,符值范围是0~4 分别是
0:8×8点阵
1:三倍笔划
2:小号笔划
3:无衬线笔划
4:黑体笔划
direction是字体的方向,符值范围是0和1,0时是横向输出字符,1是纵向输出字符
size是字符大小系数,符值范围是0~10
应该注意的是这个函数只是在tc平台下好使,在win-tc下就不灵拉!!!

在使用这几个输出文本函数时可能会发现一个问题,就是outtext只能输入一些常量,不能输出一般的数字变量.解决这个问题的方法就是先把数字转换为字符.这就用到了ltoa(长整数转换成字符串),itoa(整形数转换成字符串),sprintf等函数,这些函数属于变量类型转化函数,在此不做介绍,

学会了这些函数后,基本上就可以看明白这个程序拉∨
http://www.bc-cn.net/bbs/dispbbs.asp?boardID=5&ID=59192&page=2
你可以通过更改其中的一些绘图函数来改变程序运行时的效果,进而体会巩固图形函数的用法.




以上教程比较适合初学者学习C语言的绘图功能.如果想学一些更深入的绘图问题可去看一看相关的书籍.我用的是<turbo c函数大全>感觉还可以
希望谁有什么更好书拿出来让大家分享!!!

[此贴子已经被作者于2006-4-24 14:05:26编辑过]

2006-04-23 19:29
剑人
Rank: 1
等 级:新手上路
帖 子:58
专家分:0
注 册:2005-9-21
收藏
得分:0 
谢谢

越多越好呀!
2006-04-23 23:19
feng1256
Rank: 4
等 级:贵宾
威 望:14
帖 子:2899
专家分:0
注 册:2005-11-24
收藏
得分:0 

建议楼主自己去搜索


叁蓙大山:工謪、稅務、嗣發 抱歉:不回答女人的问题
2006-04-23 23:20
快速回复:用C语言实现画图功能有什么好教材?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.032989 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved