用放大方格模拟像素的绘制直线(微分运算法)效果演示
这篇文章是展示绘制直线方法中的微分运算法。即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]]