justkain 发表于 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);
}

justkain 发表于 2006-12-12 00:03:59

斜率为+/-1时,重复画了ABS(X1-X0)-2个点,可以优化掉。

asmcos 发表于 2006-12-13 12:54:28

egui中还有很多算法值得推敲。 我会优化的。

Rayfox 发表于 2006-12-26 10:36:06

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);
    }
}

书上看到的一个画线算法

asmcos 发表于 2006-12-26 11:04:22

这个和eGUI差不多阿。没有太大区别。

Rayfox 发表于 2006-12-30 13:23:57

这个和eGUI差不多阿。没有太大区别。
这是计算机图形编程 第2版上面的一个画线算发.还有一些其他的. :lol:
问一下,在FB下有没有支持OpenGL的图形库?

asmcos 发表于 2006-12-30 13:25:10

〉〉在FB下有没有支持OpenGL的图形库?

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

sunmoon1997 发表于 2006-12-30 16:47:32

miniglx, egl等等(还有intel 自己的 gdl,并不是严格意义上的 FB)。
页: [1]
查看完整版本: 画斜线算法,此方法为自创,可以自动裁剪到指定矩形区域。