画斜线算法,此方法为自创,可以自动裁剪到指定矩形区域。
今天看了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);
} 斜率为+/-1时,重复画了ABS(X1-X0)-2个点,可以优化掉。 egui中还有很多算法值得推敲。 我会优化的。 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);
}
}
书上看到的一个画线算法 这个和eGUI差不多阿。没有太大区别。 这个和eGUI差不多阿。没有太大区别。
这是计算机图形编程 第2版上面的一个画线算发.还有一些其他的. :lol:
问一下,在FB下有没有支持OpenGL的图形库? 〉〉在FB下有没有支持OpenGL的图形库?
到目前为止,我还没有发现。 miniglx, egl等等(还有intel 自己的 gdl,并不是严格意义上的 FB)。
页:
[1]