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; }
效果截图:
相关文章推荐
- opengl实现直线扫描算法和区域填充算法
- 实验二 直线DDA生成算法的GDI实现
- 直线的DDA生成算法C++实现
- 【OpenGL】直线生成算法DDA+Bresenham
- 实验二 直线DDA生成算法的GDI实现
- Mac下OpenGL实现直线算法-OpenGL教程(2)
- 用OpenGL实现DDA画线算法
- opengl实现直线扫描算法和区域填充算法
- OpenGL光照阴影算法的实现
- [OpenGL] 网格细分算法 Loop Subdivision - 附我的实现结果
- 《计算机图形学》实验一:利用OpenGL实现直线光栅化的DDA算法
- 计算机图形学 学习笔记(一):概述,直线扫描转换算法:DDA,中点画线算法,Bresenham算法
- OpenGL编程(五)绘直线以及分析绘直线的算法
- bresenham直线,画圆算法(附OpenGL代码)
- ActionScript实现两直线相交弧跨越算法
- openGL一之直线DDA,正负法,Bresenham算法,圆弧正负法,Bresenham算法
- 直线生成算法---对称DDA
- 基于OpenGL的三种直线生成算法
- OPENGL—DDA画直线
- 计算机图形学—DDA直线生成算法