- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试使用 DDA(数字微分分析仪)制作一种绘制线条的算法,该算法还使用 Wu 的算法作为抗锯齿。
问题是输出看起来不太好。特别是:
如何选择我想要的线条颜色?考虑到它受算法的影响?
代码如下:
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);
}
最佳答案
您的代码仅适用于第一个八分圆
所以我希望你只在那里测试
你忘了混合背景颜色和线条颜色
因此添加透明度或直接读取背景像素并自行混合颜色。 a,a0
系数将是透明度颜色混合的 alpha。在这种情况下,您不应更改 r,g,b
值,而应仅更改 alpha。此外,如果您知道背景颜色,则可以忽略像素的读取,但在穿过已渲染的内容时结果会有点差。
我将您的代码更改为与我的 C++ 编码兼容:
void DDA_line_antialiasing(int x0,int y0,int x1,int y1,int col) // DDA antialiasing
{
int x,y,dx,dy,kx,ky,f,df;
DWORD a,a0;
union
{
DWORD dd;
BYTE db[4];
} c,c0;
dx=x1-x0; kx=0; if (dx>0) kx=+1; else if (dx<0) { kx=-1; dx=-dx; }
dy=y1-y0; ky=0; if (dy>0) ky=+1; else if (dy<0) { ky=-1; dy=-dy; }
if (dx+dy==0)
{
pnt(x0,y0,col);
pnt(x1,y1,col);
return;
}
if (dx>=dy)
for (df=(dy<<8)/dx,x=x0,y=y0,f=0;;f+=df,x+=kx)
{
// fixed point y step
if (f>=256) { f-=256; y+=ky; }
// line color + background color mixing
c.dd=col; c0.dd=pnt(x,y); a=256-f; a0=f;
c.db[0]=DWORD(((DWORD(c.db[0])*a)+(DWORD(c0.db[0])*a0))>>8);
c.db[1]=DWORD(((DWORD(c.db[1])*a)+(DWORD(c0.db[1])*a0))>>8);
c.db[2]=DWORD(((DWORD(c.db[2])*a)+(DWORD(c0.db[2])*a0))>>8);
pnt(x,y ,c.dd);
// line color + background color mixing
c.dd=col; c0.dd=pnt(x,y+ky); a=f; a0=256-f;
c.db[0]=DWORD(((DWORD(c.db[0])*a)+(DWORD(c0.db[0])*a0))>>8);
c.db[1]=DWORD(((DWORD(c.db[1])*a)+(DWORD(c0.db[1])*a0))>>8);
c.db[2]=DWORD(((DWORD(c.db[2])*a)+(DWORD(c0.db[2])*a0))>>8);
pnt(x,y+ky,c.dd);
if (x==x1) break;
}
else
for (df=(dx<<8)/dy,x=x0,y=y0,f=0;;f+=df,y+=ky)
{
// fixed point x step
if (f>=256) { f-=256; x+=kx; }
// line color + background color mixing
c.dd=col; c0.dd=pnt(x,y); a=256-f; a0=f;
c.db[0]=DWORD(((DWORD(c.db[0])*a)+(DWORD(c0.db[0])*a0))>>8);
c.db[1]=DWORD(((DWORD(c.db[1])*a)+(DWORD(c0.db[1])*a0))>>8);
c.db[2]=DWORD(((DWORD(c.db[2])*a)+(DWORD(c0.db[2])*a0))>>8);
pnt(x,y ,c.dd);
// line color + background color mixing
c.dd=col; c0.dd=pnt(x+kx,y); a=f; a0=256-f;
c.db[0]=DWORD(((DWORD(c.db[0])*a)+(DWORD(c0.db[0])*a0))>>8);
c.db[1]=DWORD(((DWORD(c.db[1])*a)+(DWORD(c0.db[1])*a0))>>8);
c.db[2]=DWORD(((DWORD(c.db[2])*a)+(DWORD(c0.db[2])*a0))>>8);
pnt(x+kx,y,c.dd);
if (y==y1) break;
}
}
改为定点(8位小数部分)f,df
将 round
更改为 floor
(我的像素已经移动了一半)
添加了与背景色的混色pnt(x,y,col);
绘制一个像素x,y
,颜色为col
col=pnt(x,y);
从屏幕/图像中读取像素到 col
col
是 32 位颜色 (0x00RRGGBB),union 的存在只是为了方便 r,g,b
访问
关于c++ - 在 OpenGL 中使用 Wu 算法的数字微分分析仪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30006412/
我想在elasticsearch中指定每个字段分析器。对于某些字段,我需要关键字分析器,而对于一个字段,我需要一个自定义数字分析器,它将删除所有非数字字符(请参见下面的代码中的number_analy
我正在编写一个程序来转换一些数据,主要是一堆 Tiff 图像。一些 Tiff 似乎对他们有一个小问题。它们在某些查看器(Irfanview,客户的旧系统)中显示良好,但在其他查看器(客户的新系统、Wi
分析状态泄漏问题,为什么? + (DebugOutput *) sharedDebug { @synchronized(self) { if (shar
我正在尝试将 ProxyImage 从 cameraX 分析器转换为位图,以使用 tensorflow 光分析图像。 所以我实现了cameraX Analyze回调,它将图像作为proxyImage。
我想为我的论文“网络取证挑战”创建一个应用程序,它可以获取任何 PCAP 文件并呈现包含尽可能多信息的 HTML 分析文件,可能与搜索 ip 查找的 API 相结合。我对 Python 或 C++ 的
从2020-12-09开始,VSCode的Rust Analyzer扩展不再为我加载。在启动时,它会打印出以下错误消息: Cannot activate rust-analyzer: bootstra
我正在尝试在 Ubuntu 16.04 上从总阶段运行 beagle I2C 分析器,而不是 super 用户。当我使用 sudo 运行它时,我能够看到 beagle USB 设备,当我以我的用户身份
我是一名优秀的程序员,十分优秀!