×

windows实现dda算法

windows实现dda算法(dda算法伪代码)

admin admin 发表于2023-03-30 21:47:09 浏览45 评论0

抢沙发发表评论

本文目录一览:

根据两点画出直线,c++ windows编程 函数。帮忙实现

CDC类不是有现成的函数么?

CDC *pdc = CDC::FromHandle(hdc);

pdc-MoveTo(ps);

pdc-LineTo(pe);

以下是引用:

直线段的扫描转换算法

1 数值微分(DDA)法

我的理解就是以一个坐标轴为步长值(增量为1),另一个坐标根据直线的斜率(K)为

增量,然后四舍五入进行计算机,确定每一个点的坐标。

具体算法(我用OPENGL模拟)

void setPixel(GLint xCoord,GLint yCoord)

{

glBegin(GL_POINTS);

glVertex2i(xCoord,yCoord);

glEnd();

}

inline int round(const float a)

{

return int(a+0.5);

}

void lineDDA(int x0,int y0,int xEnd,int yEnd)

{

int dx = xEnd - x0,dy = yEnd - y0,steps,k;

float xIncrement,yIncrement,x = x0,y=y0;

if(abs(dx)abs(dy))

{

steps = abs(dx);

}

else

{

steps = abs(dy);

}

xIncrement = float(dx)/float(steps);

yIncrement = float(dy)/float(steps);

setPixel(round(x),round(y));

for(k = 0;ksteps;k++)

{

x+=xIncrement;

y+=yIncrement;

setPixel(round(x),round(y));

}

}

2中点画线法

同样我理解的算法就是,以一个增量为多的坐标轴为步长值(为1),而另一个坐标

值是加1,还是不变取决于这两个坐标值中点是在这条直线的上方,还是下方。

具体算法如下:

void lineMiddle(int x0,int y0,int xEnd,int yEnd)

{

int a,b,c,d1,d2,d;

a = y0-yEnd;

b = xEnd-x0;

d = 2*a+b;//判别试(2a+b为初始值)

d1 = 2*a;//中点在直线下方增量值

d2 = 2*a+b;//中点在真线上方的增量值

int x,y;

x = x0;y=y0;

setPixel(x,y);

while(xxEnd)

{

if(d0)//中点在直线下方

{

x++;

y++;

d+=d2;

}

else//中点在直线上方

{

x++;

d+=d1;

}

setPixel(x,y);

}

}

3.Bresenham画线算法程序:

用一个坐标轴来当步长值(即+1),另一个坐标轴是否加1则跟据斜率(k)来确定,K

如果大于0.5,那么也加+1,如果小于0.5那么即不变。为了方便计算,如果d大于1

,那么就减一,归0。可设e,e=d-0.5,于是就有e0时,加1,e0时不变,这样便

于硬件实现。

算法实现如下:

void lineBresenham(int x0,int y0,int x1,int y1)

{

int x,y,dx,dy;

float k,e;

dx = x1 - x0;

dy = y1 - y0;;

k = (float)dy/dx;

e = -0.5;

x = x0;

y = y0;

setPixel(x,y);

for(int i =0;idx;i++)

{

x = x+1;

e = e+k;

if(e=0)

{

y++;

e = e-1;

}

setPixel(x,y);

}

}

VC++怎么实现用户给出两点,用DDA算法连成线段?

在你的CXXXview类上右键 添加成员函数类型void 函数名DDALine(参数是两个点的xy坐标 还有颜色值RGB 一共五个参数)

再次鼠标右键CXXXView添加成员变量 参数两个点的坐标 四个参数 都是float 公有成员public

如果直接在窗体里根据已知参数话直线的话 把你的代码放在OnDraw()函数里

如果用鼠标操作的话 那你要添加windows消息 按快捷键ctrl+w 类向导找到你的CXXXView在消息里添加WM_OnLButtonDown(鼠标按下) WM_OnMouseMove(鼠标移动) WM_OnButtonUp(鼠标抬起) 并设置一个BOOL变量控制画线-windows实现dda算法

在OnLButtonDown里传递参数point.x point.y等于初始点xy坐标 bool量=true

OnMouseMove里的point是第二坐标的xy

OnButtonUp bool量等于false

用C++实现DDA算法

加上

includewindow.h试试

可能是没有引入相关的类库

对DDA直线生成算法进行反走样处理;

这其实是一道数学题,只不过用 C 语言编写罢了。建议你去数学分类里面提问这个问题。

我的C++DDA算法的程序出了错,望各位解决之。

你调用SetPixel是你自己的函数还是打算调用Windows

API?

如果调用Windows

API,要包含windows.h

另外Windows

API

SetPixel有四个参数,第一个参数是DC的

句柄

。后面三个如你这样子。

而且控制台程序也没有DC句柄,要选

Win32

工程,不过Win32工程的入口不是main而是WinMain。