| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1092 人关注过本帖
标题:用放大方格模拟像素的绘制直线(微分运算法)效果演示
取消只看楼主 加入收藏
hoodlum1980
Rank: 2
来 自:浙江大学
等 级:论坛游民
威 望:2
帖 子:289
专家分:23
注 册:2008-2-24
收藏
 问题点数:0 回复次数:0 
用放大方格模拟像素的绘制直线(微分运算法)效果演示
这篇文章是展示绘制直线方法中的微分运算法。即
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]]

character_ah.jpg (105.28 KB)
图片附件: 游客没有浏览图片的权限,请 登录注册
搜索更多相关主题的帖子: 微分 方格 像素 直线 演示 
2008-03-17 20:46
快速回复:用放大方格模拟像素的绘制直线(微分运算法)效果演示
数据加载中...
 
   



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

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