QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 5056|回复: 7

画斜线算法,此方法为自创,可以自动裁剪到指定矩形区域。

[复制链接]
发表于 2006-12-11 23:20:32 | 显示全部楼层 |阅读模式
今天看了Egui中的画线算法,对比了一下,各画了100000次,  
/* Bresenham */ 算法效率比我的高,快2-3秒,也比我的稍直一些,
不过由于我的算法可自动裁减到指定矩形区域(我用的是屏幕矩形区域),
有这么个优点,比方说重绘窗口中的线,而窗口一部分在屏幕里面不需要画,
这时,就能发挥作用,而不需要额外计算窗口被屏幕裁剪后的矩形,
和要画的线在裁剪后的矩形中的两点。
现把脑动成果贡献出来,希望大家喜欢。:)
/*----------------------------------------------------------------------------*/
/*                        Wrote By Kain,2006-12-8                               */
/*----------------------------------------------------------------------------*/
void Screen_Draw_Line(int x0, int y0, int x1, int y1, int Color)
{
        int mx,my,dx,dy;

/* all not in screen, user can't see it*/
        if(        (x0<0 && x1<0)||(x0 >Screen.Width - 1 && x1> Screen.Width - 1) ||
                        (y0<0 && y1<0)||(y0>=Screen.Height -1 && y1>=Screen.Height -1) )
                return;

        if( y0 == y1 )
        {
                Screen_Draw_Hline(y0,x0,x1,Color);
                return;
        }
        if( x0 == x1 )
        {
                Screen_Draw_Vline(x0,y0,y1,Color);
                return;
        }
       
        mx = x1 + x0;
        my = y1 + y0;

        dx = 0;
        dy = 0;
        if(mx & 0x1)
        {
                dx = 1;
        }
        if(my & 0x1)
        {
                dy = 1;
        }
        if(x0 > x1)
                dx = -dx;
        if(y0 > y1)
                dy = -dy;
        Screen_Draw_Line(x0,y0,(mx - dx)/2,(my - dy)/2,Color);
        Screen_Draw_Line((mx + dx)/2,(my + dy)/2,x1,y1,Color);
}
 楼主| 发表于 2006-12-12 00:03:59 | 显示全部楼层
斜率为+/-1时,重复画了ABS(X1-X0)-2个点,可以优化掉。
回复

使用道具 举报

发表于 2006-12-13 12:54:28 | 显示全部楼层
egui中还有很多算法值得推敲。 我会优化的。
回复

使用道具 举报

发表于 2006-12-26 10:36:06 | 显示全部楼层
[code:1]void draw_point(void * pixels, int x, int y, int color)
{
        if (app == NULL) return;
        if ((x < 0) && (y < 0)) return;

        char * pointer = pixels + (x + y * xres) * pixel_size;
        memcpy(pointer, &color, pixel_size);
}

void draw_line(int xa, int ya, int xb, int yb, int color)
{
    int dx = xb - xa;
    int dy = yb - ya;
    int steps, k;
    float xIncrement, yIncrement, x = xa, y = ya;
   
    if (abs(dx) > abs(dy)) steps = abs(dx);
    else steps = abs(dy);
   
    xIncrement = dx / (float)steps;
    yIncrement = dy / (float)steps;
   
    draw_point(pixels, ((int)(x + 0.5)), ((int)(y + 0.5)), color);
   
    for (k = 0;k < steps;k ++) {
        x += xIncrement;
        y += yIncrement;
        draw_point(pixels, ((int)(x + 0.5)), ((int)(y + 0.5)), color);
    }
}
[/code:1]
书上看到的一个画线算法
回复

使用道具 举报

发表于 2006-12-26 11:04:22 | 显示全部楼层
这个和eGUI差不多阿。没有太大区别。
回复

使用道具 举报

发表于 2006-12-30 13:23:57 | 显示全部楼层
[quote:1e7c1472c3="asmcos"]这个和eGUI差不多阿。没有太大区别。[/quote]
这是计算机图形编程 第2版上面的一个画线算发.还有一些其他的.
问一下,在FB下有没有支持OpenGL的图形库?
回复

使用道具 举报

发表于 2006-12-30 13:25:10 | 显示全部楼层
〉〉在FB下有没有支持OpenGL的图形库?

到目前为止,我还没有发现。
回复

使用道具 举报

发表于 2006-12-30 16:47:32 | 显示全部楼层
miniglx, egl等等(还有intel 自己的 gdl,并不是严格意义上的 FB)。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-2 02:32 , Processed in 0.098290 second(s), 16 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表