DDA画线算法
程序员文章站
2024-03-16 20:15:46
...
1、算法介绍:
已知两个点,(已知的点),确定离散的若干个点,逐个点画起来,就可以形成一条直线。
2、公式推导:
设直线两端点为:起点A(x0,y0);终点为B(x1,y1)。
则直线的斜率和方程为:
下面分为两种情况考虑:当斜率小于等于1的时候,x每次增加1,y最多增加1。
而当斜率大于1的时候,让y每次递增1,x每次递增最多1。
3、代码如下:
#include "stdafx.h"
#include <windows.h>
#include <GL/glu.h>
#include <GL/gl.h>
#include <GL/glut.h>
#include<stdlib.h>
//DDA算法——digital differentialanalyzer,数字微分析法
void LineDDA(int x0, int y0, int xEnd, int yEnd)
{
int dx = xEnd - x0; //x的增量
int dy = yEnd - y0; //y的增量
int steps;
float xIncrement, yIncrement, x = x0, y = y0;
if (abs(dx) > abs(dy)) //谁的增量大
{
steps = abs(dx);
}
else
{
steps = abs(dy);
}
xIncrement = float(dx) / float(steps); //x每步骤增量
yIncrement = float(dy) / float(steps); //y的每步增量
glClear(GL_COLOR_BUFFER_BIT);
//开始画点
glBegin(GL_POINTS);
glVertex3f(x0, y0, 0); //起点要画下
for(int k = 0; k <= steps; ++k)
{
x += xIncrement; //x点+增量
y += yIncrement; //y点+增量
glVertex3f(x, y, 0);
}
glVertex3f(xEnd, yEnd, 0); //终点画下
glEnd();
glFlush();
}
//主循环方法
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glViewport(0, 0, 500, 500);
LineDDA(30, 30, 200, 180);
}
//初始化方法
void myInit(void)
{
glClearColor(1.0, 1.0, 1.0, 0.0);
glColor3f(1.0, 0.0, 0.0);
gluOrtho2D(0.0, 500.0, 0.0, 500.0);
glMatrixMode(GL_MODELVIEW);
}
int main(int argc, char* argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(400, 400);
glutInitWindowPosition(200, 200);
glutCreateWindow("Point");
glutDisplayFunc(display);
myInit();
glutMainLoop();
return(0);
}
上一篇: js获取日期中的 年,月,日 js日期