您的位置:首页 > 运维架构

opengl DDA直线算法的实现

2016-10-31 20:01 501 查看

DDA算法

数值微分法,根据直线的微风方程来计算x或者y的增加量生成直线的扫描转换算法。

设直线为:y=kx+b

有x2 = x1+1

推导:y1 = kx1+b ——-> y2 = kx2+b —->y2= k(x1+1)+b

——–>y2 = kx1+k+b ——>y2 = y1+k

即有推论:

假设x方向的增量为1:

|k|<=1:

yi = kxi +b(i为下标)

yi+1 = yi +k(i+1为下标)

同理|k|>1:

xi = 1/k*yi +b(i为下标)

xi+1 = xi +1/k(i+1为下标)

代码如下:

#include <GL/glut.h>
void DDA_Line(int x1, int y1, int x2, int y2) {
float k, t, x, y;
float dx = x2 - x1, dy = y2 - y1;
int d = 1;
if (abs(x2 - x1) >= abs(y2 - y1)) {
k = dy / dx;
t = dx;
} else {
k = dx / dy;
t = dy;
d = 0;
}
x = x1;
y = y1;
for (int i = 0; i <= t; i++) {
glPointSize(5.0);
glBegin(GL_POINTS);
if (d == 1) {
glVertex2f(x, int(y + 0.5));
glEnd();
x++;
y = y + k;
} else {
glVertex2f(int(x + 0.5), y);
glEnd();
x = x + k;
y++;
}

}

}

void display(void) {
glClearColor(1.0, 1.0, 1.0, 0.0);
glClear(GL_COLOR_BUFFER_BIT);
glViewport(0, 0, 500, 500);

//直线起点终点坐标
DDA_Line(0, 500, 500, 0);
DDA_Line(0, 0, 500, 600);
DDA_Line(250, 0, 250, 500);
DDA_Line(0, 250, 500, 250);

glFlush();
}

int main(int argc, char **argv) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RED);
glutInitWindowSize(500, 500);
glutInitWindowPosition(0, 0);
glutCreateWindow("DDA_line");
glutDisplayFunc(display);

glColor3f(0.0, 1.0, 1.0);//颜色
gluOrtho2D(0.0, 500.0, 0.0, 500.0);

glutMainLoop();
return 0;

}


效果截图:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: