C DDA算法不是为所有坐标值绘制直线
我的DDA(数字微分分析仪)算法实现代码适用于绘制坡度小于45度的直线,但在坡度大于45度的直线上失败。C DDA算法不是为所有坐标值绘制直线,c,algorithm,line-drawing,dda,C,Algorithm,Line Drawing,Dda,我的DDA(数字微分分析仪)算法实现代码适用于绘制坡度小于45度的直线,但在坡度大于45度的直线上失败。 对于大于45°的角度,它的行为就像一条折线 代码 void dda(int x1,int y1,int x2,int y2) { float x,y,xinc,yinc,dx,dy; int k,step; dx = x2 - x1; dy = y2 - y1; step = abs(dx); xinc = dx / step; yi
对于大于45°的角度,它的行为就像一条折线
代码
void dda(int x1,int y1,int x2,int y2)
{
float x,y,xinc,yinc,dx,dy;
int k,step;
dx = x2 - x1;
dy = y2 - y1;
step = abs(dx);
xinc = dx / step;
yinc = dy / step;
x = x1;
y = y1;
putpixel(x,y,63);
for(k=1;k<=step;k++)
{
x = x + xinc;
y = y + yinc;
putpixel(x,y,63);
}
}
void dda(整数x1、整数y1、整数x2、整数y2)
{
浮点数x,y,xinc,yinc,dx,dy;
int k,步骤;
dx=x2-x1;
dy=y2-y1;
阶跃=abs(dx);
xinc=dx/步;
yinc=dy/step;
x=x1;
y=y1;
像素(x,y,63);
对于(k=1;k如果要绘制坡度大于1的直线,则必须迭代y值。这是很自然的,因为y方向的步数比x方向的步数多。如下所示:
考虑到具有正斜率的直线,如果斜率小于或等于1,我们将以单位x间隔采样
对于坡度大于1的直线,我们反转x和y的作用
所以,这就是你的答案。你需要有一个if
,检查斜率并将dx
或dy
固定为1。有关更多详细信息,请参阅我上面的维基百科链接。不,在DDA算法中没有这样的缺点,你应该使用以下代码,它肯定会起作用。
如果使用Bresenham的线条绘制算法,效果会更好
您只使用dx来计算算法的单位步长,因此它绘制角度<45o的直线。
在坡度>45o的程序代码中没有使用dy,这就是为什么您的行会断开。附加此代码,您的代码将正常工作
if(abs(dx)>abs(dy))
step=abs(dx);
else
step=abs(dy);