标题:[原创]如何编写自己的图形开发包 — 第三章 泥瓦匠,很开心 — 简单的绘图函 ...
只看楼主
jig
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
帖 子:530
专家分:242
注 册:2005-12-27
结帖率:100%
 问题点数:0 回复次数:3 
[原创]如何编写自己的图形开发包 — 第三章 泥瓦匠,很开心 — 简单的绘图函数
本文出至[url]www.[/url]   作者:孙靖

[bold]第三章
泥瓦匠,很开心 — 简单的绘图函数[/bold]


    泥瓦匠?不是用砖头砌房子的吗?也俗称民工。(实质上做软件和民工有什么区别嘛,郁闷!)不错,有了前面的努力我们终于有了自己的画点函数,就像泥瓦匠有了水泥砖头。我们也要来做做砌房子的工作,用我们的画点函数构建一套简单的绘图函数。
    本章会很短,其实这样的工作任何一个学过C的朋友都可以很快的实现出来,只是既然我们已经制造出了画点函数总得让我们做点什么吧?
    我们来完成一个画线函数吧。

代码:查看Chap03-main1
void Line(INT16 x0, INT16 y0, INT16 x1, INT16 y1, UINT8 color);  /* 画线函数     */
void Line(INT16 x0, INT16 y0, INT16 x1, INT16 y1, UINT8 color)
{
    INT32   dx;         /* 直线x轴差值变量                              */
    INT32   dy;         /* 直线y轴差值变量                              */
    INT8    dx_sym;    /* x轴增长方向,为-1时减值方向,为1时增值方向   */
    INT8    dy_sym;    /* y轴增长方向,为-1时减值方向,为1时增值方向   */
    INT32   dx_x2;    /* dx*2值变量,用于加快运算速度                 */
    INT32   dy_x2;    /* dy*2值变量,用于加快运算速度                 */
    INT32   di;        /* 决策变量                                     */

    if (x0 == x1)        /* 画垂直线                                     */
    {
        if (y0 > y1)
        {
            dx = y0;
            y0 = y1;
            y1 = dx;
        }
        for (dx = y0; dx < y1+1; dx++)
        {
            Dot(x0, dx, color);
        }

        return ;
    }
   
    if (y0 == y1)        /* 画水平线                                     */
    {
        if(x0 > x1)
        {
            dy = x0;
            x0 = x1;
            x1 = dy;
        }
        for (dy = x0; dy < x1+1; dy++)
        {
            Dot(dy, y0, color);
        }

        return;
    }

                     /* 画斜线                   */
    dx = x1-x0;       /* 求取两点之间的差值       */         
    dy = y1-y0;
    if (dx > 0)        /* 判断x轴方向              */
    {  
        dx_sym = 1;    /* dx>0,设置dx_sym=1       */
    }
    else
    {  
        if (dx < 0)
        {  
            dx_sym = -1;    /* dx<0,设置dx_sym=-1      */
        }
    }
   
    if (dy > 0)          /* 判断y轴方向              */
    {  
        dy_sym = 1;     /* dy>0,设置dy_sym=1       */
    }
    else
    {  
        if (dy < 0)
        {  
            dy_sym = -1;     /* dy<0,设置dy_sym=-1      */
        }
    }
   
                                
    dx = dx_sym * dx;     /* 将dx、dy取绝对值         */
    dy = dy_sym * dy;                       
    dx_x2 = dx*2;         /* 计算2倍的dx及dy值        */
    dy_x2 = dy*2;
   
                        /* 使用Bresenham法进行画直线    */
    if (dx >= dy)          /* 对于dx>=dy,则使用x轴为基准  */
    {  
        di = dy_x2 - dx;
        while(x0!=x1)
        {  
            Dot(x0, y0, color);
            x0 += dx_sym;
            if (di < 0)
            {  
                di += dy_x2;     /* 计算出下一步的决策值         */
            }
            else
            {  
                di += dy_x2 - dx_x2;
                y0 += dy_sym;
            }
        }
        Dot(x0, y0, color);     /* 显示最后一点                 */
   }
   else                   /* 对于dx<dy,则使用y轴为基准   */
   {  
        di = dx_x2 - dy;
        while(y0!=y1)
        {  
            Dot(x0, y0, color);
            y0 += dy_sym;
            if (di < 0)
            {
                di += dx_x2;
            }
            else
            {
                di += dx_x2 - dy_x2;
                x0 += dx_sym;
            }
        }
        Dot(x0, y0, color);    /* 显示最后一点                 */
   }
}

    效果如图3.1

图3.1 画线函数效果

    很爽,吧?记得当初我是很激动的,看着屏幕上密密麻麻全是自己制造出来的,心里不提多有成就感啦。可没多久就没意思了。的确我们用什么自己的画点函数构建了一些简单的高级建筑,就像农村里的小土房,再过多的篇幅也不知道要写些什么。
    不过,我要强调的是:大家仔细看看这个画线函数。感觉很复杂吧?他可是经过优化算法实现的画线函数。如果你采用数学理论的正切,余切来做画线函数。那你做出来的程序肯定是惨不忍睹的,慢的够你去跳楼。
    所以,在很多时候精妙的数学算法在程序中是那么的重要。大家可以在论坛里仔细看看RockCarry的帖子,他有很多很好关于算法的帖子,值得大家学习揣摩。
    但,我希望大家记住的却是:对于整体系统工程来说,细节上的算法,或精明的表达语句只是实现高效的一种方式而已,最主要的还是你设计的这个系统在架构上是高效的,这才是程序高效的终极利剑。所以软件的最高境界是架构设计 — 系统工程师。总有一天你会觉得C编程也像在写脚本一样,就句法本身而言没多大意思。这就像,大家都会写汉字,可你写的出优美动人的文章吗?

    我们这个简陋的图形包还有几个简陋的绘图函数,在这就不一一展示代码,只给出个效果图。大家要有兴趣还是自己仔细去研读代码吧。
    
1.矩形框函数,查看代码Chap03-main2
 
图3.2 画矩形框效果

3.    矩形函数,查看代码Chap03-main3

图3.3 画矩形效果

    4.圆函数,查看代码Chap03-main4
 
图3.4 画圆效果

4.实心圆函数,查看代码Chap03-main5
 
图3.5 实心圆效果

本章就介绍到这里,当然您也可以根据您自己的想像制作更多绘图函数。后面我们要
做点更高级的创造 — 显示位图。


配套资料下载:
Chap03.rar (36.48 KB)


[[italic] 本帖最后由 jig 于 2008-1-23 14:43 编辑 [/italic]]
搜索更多相关主题的帖子: 函数 泥瓦匠 图形 民工 水泥 
2008-01-23 14:42
一笔苍穹
Rank: 1
等 级:新手上路
帖 子:640
专家分:0
注 册:2006-5-25
得分:0 
项,继续!
2008-01-23 14:44
liuzhu417
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2007-9-22
得分:0 
太感谢了
呵呵  苦恼了几天
2008-03-09 02:14
lianzerong
Rank: 1
等 级:新手上路
帖 子:53
专家分:0
注 册:2007-7-23
得分:0 
好好好  想不出说什么了  但愿lz能有更多文献  !!!!造福我们这些小白!!!
2008-04-01 19:02



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-198444-1-1.html




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

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