我正在尝试使用DDA(数字微分分析仪)绘制线条的算法,该算法还使用吴的算法作为抗锯齿。
问题是输出看起来不太好,特别是:
- 我选择的颜色,它会改变(我知道为什么,但我想知道是否必须这样)
- 像素的颜色越亮越亮
如何选择线条的颜色?考虑到它会受到算法的影响?
代码如下:
void dda(int x0, int y0, int x1, int y1, int z, float red, float green, float blue) {
float dy = y1-y0;
float dx = x1-x0;
float m = dy/dx;
if (m<=1) {
int x;
float y;
y = y0;
for (x=x0; x<x1; x++) {
pixel(x, round(y), z, frame, rfpart(red), rfpart(green), rfpart(blue));
pixel(x, round(y)+1, z, frame, fpart(red), fpart(green), fpart(blue));
y = y+m;
}
}
}
int round(float d) {
return floor(d + 0.5);
}
float fpart(float x) {
if (x < 0)
return 1 - (x - floor(x));
return x - floor(x);
}
float rfpart(float x) {
return 1 - fpart(x);
}
2条答案
按热度按时间iibxawm41#
1.您的代码仅适用于第一个八分圆
所以我希望您只在那里进行测试
1.您忘记混合背景颜色和线条颜色
因此,直接添加透明度或读取背景像素并自行混合颜色。
a,a0
系数将是透明度颜色混合的alpha。在这种情况下,您不应更改r,g,b
值,而只应更改alpha。此外,如果您知道背景颜色,您可以忽略像素的阅读,但结果将是与已渲染的内容交叉时的位。我将您的代码更改为与我的C++代码兼容:
更改为定点(8位小数部分)
f,df
将
round
更改为floor
(我的像素已经移动了一半)添加了与背景颜色的颜色混合
pnt(x,y,col);
使用颜色col
绘制像素x,y
col=pnt(x,y);
将像素从屏幕/图像读入col
col
是32位颜色(0x 00 RRGGBB),联合只是为了方便r,g,b
访问i2loujxw2#
这里是一个完整的源代码,似乎为我工作,与VCL(Embarcadero)。我把下面的修改,以解决一个问题,在长线,使位置错误的x1,y1图纸(pb发现与一个标准的Bresenham线,MoveTo()和LineTo比较):
还添加了一些Lambda,并使用了32位和8位的C++类型。尚未进行速度测试(
double
有时比float
快)。速度对我来说还可以,因为我在位图缓冲区中工作;这是必须要做的,因为直接在组件上绘图太慢了,与内存绘图相反(下面的pC是一个指向位图画布的指针)。2然后,所有的位图都被转移到颜料盒中。3感谢贡献者,@giogix和@Spektre。