| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2453 人关注过本帖
标题:[原创]如何编写自己的图形开发包 — 第二章 给你一个画点函数,你就能描绘整 ...
取消只看楼主 加入收藏
jig
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
帖 子:530
专家分:242
注 册:2005-12-27
结帖率:100%
收藏
 问题点数:0 回复次数:1 
[原创]如何编写自己的图形开发包 — 第二章 给你一个画点函数,你就能描绘整个世界! - 2.1
此文出至[url]www.[/url]   作者:孙靖

[bold]第二章
给你一个画点函数,你就能描绘整个世界![/bold]

[bold]2.1 构造基本的画点函数[/bold]
    这句话相信很多朋友都觉得眼熟,我们论坛置顶贴“[原创]给我一个画点函数,我能描绘出整个世界!”由 —— 一笔苍穹编写也实实在在的介绍了利用各种开发包进行画点工作。而接下来,我们要做的不仅是如何去画点而是真实的自己创造一个画点函数。看到这里,有不有做上帝的感觉?肯定很激动吧。记得当年我是多么的激动,往事不堪回首!呵呵。
    首先,简要的介绍画点具体是怎么一会事。真的,当初这个概念困扰了我很久,我还是那老办法。不懂?先记住。
      我们现在画点最通用的方法就是直接往显存里写数据。大家体会这个‘写’字,说白了就是给某个显存位置输入一个数值,那么显示器上就会有个对应的效果出来。要问具体硬件怎么实现的?呵呵,对不起我也不知道,那是硬件工程师的事情。虽然我提倡刨根问底但也要讲用在具体问题上。就本文介绍的内容,我想目前讨论的就够底啦,在底就吃不消啦。

代码:
UINT8 far  *VideoBuffer=(UINT8 far *)0xA0000000;  /* 定义画点函数的远指针 – 全局变量 */

看就只一行就可以基本完成我们画点的梦想。查看chap02-main1实例:
#include "GrTry.c"
int main()
{
    INT16   i, OldMade = GetSVGAMode();

    SetSVGAMode(TRY320X200X256);    /* 实现图形初始化   */
    for (i = 0; i < 256; i++)       /* 往显存写入数据   */
        VideoBuffer[i] = 100;

    getch();
    SetSVGAMode(OldMade);           /* 恢复原始的模式   */
}

其效果如图2.1:
图片附件: 游客没有浏览图片的权限,请 登录注册

图2.1 写显存效果

如上代码,我们写了VideoBuffer[0] – VideoBuffer[255] 共256个数据,其值都是100。可以看到上面的效果出现一个淡天蓝色的线条。有心的朋友一定明白了,原来画点就是给我们定义的ViderBuffer 指向的位置写必要的数据。下面我们来做个函数封装做个真正意义上的画点函数。

代码:
void    Dot(INT16 x, INT16 y, UINT8 color);    /* 画点函数 */
void    Dot(INT16 x, INT16 y, UINT8 color)
{
    VideoBuffer[y*320+x]  =  color;
}

    看,我们的画点函数出来了。由于什么现在使用的320X200的分辨率,那么一行有320个点。所以上面代码中“y*320+x”我想不用我多解释了吧?
    好的,我们将图2.1对应的代码稍做改动。请查看Chap02-main2:

代码:
#include "GrTry.c"
int main()
{
    INT16   i, OldMade = GetSVGAMode();

    SetSVGAMode(TRY320X200X256);    /* 实现图形初始化   */
    for (i = 0; i < 100; i++)       /* 利用画点函数画点 */
        Dot(i, i, i);

    getch();
    SetSVGAMode(OldMade);           /* 恢复原始的模式   */
}

    效果如图2.2:
图片附件: 游客没有浏览图片的权限,请 登录注册

图2.2 调用画点函数效果

    是不是很神奇?我们绘制了一条色彩绚烂的线条,也许这个效果您随便用其他的图形包都可以实现,可这却是实实在在我们自己动手建立的画点函数实现的。是不是很有成就感?
    好啦,有成就感之后,我们还是要思考一些问题的。我们实现的是8位色深模式,即我们现在看到的图形模式在颜色值上有0-255共256种颜色。也就是说,在显存里一个字节(8位)纪录当前位置的颜色。所以我们之前定义的VideoBuffer为(UINT8 *)类型,恰好VideoBuffer[1]就可以表示一个像素点位置。请先记住这段介绍,这很重要因为除了我们所见的模式,你还可能有兴趣去实现其他图形模式,比如16位模式。那么在定义指向显存首地址的VideoBuffer的类型就值得注意啦,要自己去斟酌。
    除此之外,我们应该还要想到:
1.    在320X200分辨率下,最大的显存位置应该就是右下角 (319, 199) 所以在此分辨率下我们应该保证我们的Dot()函数要排除输入范围无效的情况。
2.    我们实现的是8位色深模式,颜色值在0-255。所以你如果填写一个大于255的值,毫无疑问将会溢出。即你若填写256的颜色值,实际效果是溢出为0。当然,这样我们的Dot()函数并不会出错,只是你自己要清楚的知道此种情况。
3.    我们尝试一下其他分辨率模式是否也是这样的效果呢?

下一小节,我们将就上面提出的疑问来实验,你将发现更多你还不了解的知识。


配套代码下载:

[[italic] 本帖最后由 jig 于 2008-1-21 17:43 编辑 [/italic]]

Code.rar (1.24 MB)
搜索更多相关主题的帖子: 图形 函数 世界 编写 描绘 
2008-01-21 16:42
jig
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
帖 子:530
专家分:242
注 册:2005-12-27
收藏
得分:0 
下载后面的实例代码来看。

各位,看资料要细心。结合文章,文中提到要你看哪个实例就把后面的资料包DOWN下来仔细查阅。这样才会有收获啊

你学OPENGL,ALLAGERO不也是这样学的吗?

个人网站 -  http://.h001.
2008-01-22 08:55
快速回复:[原创]如何编写自己的图形开发包 — 第二章 给你一个画点函数,你就能 ...
数据加载中...
 
   



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

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