[原创]如何编写自己的图形开发包 — 第三章 泥瓦匠,很开心 — 简单的绘图函数
本文出至[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]]