举报

直线抗锯齿

0

大佬们好,萌新刚刚接触easyx,想请教大家用什么方法能绘制出没有锯齿的平滑的直线或者圆。如果有大佬能为小弟指出一条明路,感谢不尽。

我现在采用的方法是把直线先画在另外一个2*2倍的图上,原图中的一个点对应新图4个,将这4个的均值像素值花在原图上,效果不错,但是时间非常慢,一秒左右,请问大佬有什么方法能够快一点(比如不用getpixel)?

const int scr_width = 800, scr_height = 600;
COLORREF temp[800][600];
BYTE r, g, b;
COLORREF c1,c2,c3,c4;
IMAGE* img2 = new IMAGE(2*scr_width, 2*scr_height);//生成2*2新图像

setbkcolor(BLACK);
cleardevice();
//在新图像画线
SetWorkingImage(img2);
setcolor(YELLOW);
setlinestyle(PS_SOLID | PS_JOIN_BEVEL, 10);
line(600, 400, 300, 240);
//计算均值
for (int i = 0; i <= scr_width-1; i++) {
	for (int j = 0; j <= scr_height-1; j++) {
		c1 = getpixel(2*i,2* j);
		c2 = getpixel(2*i+1,2*j);
		c3=  getpixel(2*i, 2*j+1);
		c4=  getpixel(2*i+1,2*j+1);
		r = (GetRValue(c1) + GetRValue(c2) + GetRValue(c3) + GetRValue(c4)) / 4;
		g = (GetGValue(c1) + GetGValue(c2) + GetGValue(c3) + GetGValue(c4)) / 4;
		b = (GetBValue(c1) + GetBValue(c2) + GetBValue(c3) + GetBValue(c4)) / 4;			
		temp[i][j]=RGB(r,g,b);
	}
}
//在窗口绘图
SetWorkingImage(NULL);
for (int i = 0; i <= scr_width - 1; i++) {
	for (int j = 0; j <= scr_height - 1; j++) {
		putpixel(i, j, temp[i][j]);
	}
}
ava

2020-3-17

举报
0

抗锯齿是一个非常大的话题,到目前为止,有很多种抗锯齿的算法出现。

在 EasyX 里面,要实现抗锯齿的输出,需要自己写算法来实现。比如抗锯齿的直线,要计算出直线上每一个点,以及每个点覆盖到不同像素上的值是多少,然后分别在相邻的点上绘制不同的亮度,来实现抗锯齿效果。

例如,你可以参考一下这篇文章里面的算法:https://www.codeproject.com/articles/21520/antialiasing-using-windows-gdi

ava
慢羊羊

2020-3-17

非常感谢,正在努力写代码中 -   2020-3-18
举报
技术讨论社区
相关提问