用放大方格模拟像素的绘制直线(微分运算法)效果演示
这篇文章是展示绘制直线方法中的微分运算法。即x=x+dx;
y=y+dy;
用放大的方格模拟实际的像素,为的是使我们能看清楚每个像素。显示效果略。
程序代码:/*********************************************************
* Description: 微分法绘制直线,用放大方格模拟实际像素
* Author: hoodlum1980
* Date: 2008.03.17
*********************************************************/
#include <graphics.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#define CellSize 8 /*代表像素的格子的大小*/
int BorderColor=DARKGRAY; /*像素格子的边框颜色*/
/* 这是用微分法绘制直线的原本方法。*/
void DrawLine(int x1,int y1,int x2,int y2,int color)
{
int i,length;
double x,y,dx,dy;
length=max(abs(x2-x1),abs(y2-y1));
dx=(x2-x1)*1.0/length;
dy=(y2-y1)*1.0/length;
x=x1 + 0.5*(dx>0? 1:-1);
y=y1 + 0.5*(dy>0? 1:-1);
i=1;
while(i<=length)
{
putpixel((int)(x),(int)(y),color);
x=x+dx;
y=y+dy;
i++;
}
}
/*绘制一个代表像素的格子*/
void putcell(int x,int y,int color)
{
rectangle(x*CellSize,y*CellSize,(x+1)*CellSize,(y+1)*CellSize);
floodfill(x*CellSize+1,y*CellSize+1,BorderColor);
}
/* 绘制用方格代表像素的直线 */
void DrawLineByCells(int x1,int y1,int x2,int y2,int color)
{
int i,length;
double x,y,dx,dy;
length=max(abs(x2-x1),abs(y2-y1));
dx=(x2-x1)*1.0/length;
dy=(y2-y1)*1.0/length;
x=x1 + 0.5*(dx>0? 1:-1);
y=y1 + 0.5*(dy>0? 1:-1);
i=1;
setcolor(BorderColor);
setfillstyle(SOLID_FILL,color);
while(i<=length)
{
putcell((int)(x),(int)(y),color);
x=x+dx;
y=y+dy;
i++;
}
}
/* 在这里我绘制一个彩色线条的“金刚石”来展示结果 */
void main()
{
int i,j,n=5,r=20,cx=21,cy=21;
double angle=M_PI*2/n;
int a[5][2];
int gdriver=DETECT,gmode;
int colors[]={BLUE,RED,GREEN,CYAN,WHITE,YELLOW};
for(i=0;i<n;i++)
{
a[i][0]=(int)(cx+r*cos(angle*i));
a[i][1]=(int)(cy+r*sin(angle*i));
}
initgraph(&gdriver,&gmode,"c:\\tc\\"); /*注意第三个参数要设置正确!*/
for(i=0;i<(n-1);i++)
{
for(j=i+1;j<n;j++)
DrawLineByCells(a[i][0],a[i][1],a[j][0],a[j][1], colors[i%6]);
}
getch();
closegraph();
}下面的截图是用这种方法显示的UCDOS 24*24宋体字库的第一个汉字字符“啊”(具体代码略,可参考我的另一篇帖子,在图形模式下根据UCDOS字库绘制汉字),在最左侧一列我用了三种颜色标识出了字模数组的前三个字节,表示这种字库是按列扫描的。
[[it] 本帖最后由 hoodlum1980 于 2008-3-17 23:51 编辑 [/it]]








