- 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/
我有一个模型,我怀疑内生性。我想通过 Wu hausman 测试来测试是否是这种情况,尽管我找不到任何方法来执行此操作。 已执行以下回归: library(AER) ivreg1 |t|) # (In
我从这里实现了 Xiaolin Wu 圆算法:https://create.stephan-brumme.com/antialiased-circle/在 C++ 中: float radiusX =
我正在努力实现“快速抗锯齿圆圈生成器”例程,吴晓林在他的论文“一种有效的抗锯齿技术”中描述了 Siggraph '91。 这是我使用 Python 3 和 PySDL2 编写的代码: def draw
是否有任何 Android API 允许我读取音频文件的声级?因为我需要编写一个由播放轨道的音频级别生成的视觉效果。 最佳答案 那不是真正的Android主题。我想使用音频缓冲区会帮助你。查看此链接:
我正在为我的应用程序使用 firebase firestore。每当我尝试调用 firebase.firestore().collection("users") , 我得到 undefined is
我正在尝试使用 DDA(数字微分分析仪)制作一种绘制线条的算法,该算法还使用 Wu 的算法作为抗锯齿。 问题是输出看起来不太好。特别是: 我选择的颜色,它会改变(我知道为什么,但我想知道是否必须这样)
我正在寻找用 C 语言实现 Xiaolin Wu 的抗锯齿线条绘制算法的一个漂亮而高效的实现,有人可以与我分享这段代码吗? 谢谢 最佳答案 维基百科有 pseudo code . Google 有很多
我正在尝试将 BigInteger 数字转换为其十六进制格式,以便我可以将其用于进一步的 HMAC 计算。我已使用以下帖子来获取执行此操作的代码。 Converting a 64 bit number
我正在尝试调用 Xiaolin wu 的线路算法。我从 rosettacode.org 找到了一个版本,但我不知道如何调用它。 这是链接: https://rosettacode.org/wiki/X
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我以非root访问方式完成了docker安装,即 1.define a docker user group 2.add my current user to the docker group 通过测试
我是一名优秀的程序员,十分优秀!