1. 程式人生 > >直線生成演算法的實現:分別利用DDA演算法、中點Bresenham演算法和改進的Bresenham演算法掃描轉換直線段P1P2

直線生成演算法的實現:分別利用DDA演算法、中點Bresenham演算法和改進的Bresenham演算法掃描轉換直線段P1P2

直線生成演算法的實現:分別利用DDA演算法、中點Bresenham演算法和改進的Bresenham演算法掃描轉換直線段P1P2,其中P1為(0, 0), P2為(8, 6)。

 

// fhk.cpp : 定義控制檯應用程式的入口點。
//

#include <iostream>
#include "stdio.h"
#include <stdlib.h>
#include <cmath>
#include <gl/glut.h>
using namespace std;

void DDALine(int x0,int y0,int x1,int y1)
{
	int dx,dy,esp;
	float x,y,xIncre,yIncre;
	dx = x1 - x0;
	dy = y1 - y0;
	x = x0;
	y = y0;

	esp = (abs(dx) < abs(dy)) ? abs(dx) : abs(dy);
	xIncre = (float)dx / (float)esp;
	yIncre = (float)dy / (float)esp;	 

	glClear(GL_COLOR_BUFFER_BIT);
	glColor3f(1.0f,0.0f,0.0f);
    glPointSize(3.0f);

	glBegin(GL_POINTS);
	glVertex2i((int)(x+0.5),(int)(y+0.5));
	glEnd();
	glFlush();

	for(int k = 0;k < esp;k++)
	{
		glBegin(GL_POINTS);
		glVertex2i((int)(x+0.5),(int)(y+0.5));
		glEnd();
		x += xIncre;
		y += yIncre;
		glFlush();
	}	
	

}

void BresenhamLine(int x0,int y0,int x1,int y1)
{
	 
	glColor3f(0.0f,1.0f,0.0f);
	glPointSize(3.0f);
	int dx = 0,dy = 0,d = 0;
	int x,y;	 
	x = x0,y = y0;
	dx = abs(x1 - x0);
	dy = abs(y1 - y0);
	d = dx - 2 * dy;

	glBegin(GL_POINTS);
	glVertex2i(x,y);
	glEnd();
	glFlush();

	while (x < x1)
	{
		if(d < 0)
		{
			x += 1;
			y += 1;
			d += 2 * (dx - dy);
		}
		if(d > 0)
		{
			x += 1;
			d -= 2 * dy;
		}
		glBegin(GL_POINTS);
		glVertex2i(x,y);
		glEnd();
		glFlush();
	}	
}

void Bresenham(int x0,int y0,int x1,int y1)
{
	glColor3f(0.0f,0.0f,1.0f);
	glPointSize(3.0f);
	int x = x0;
	int y = y0;
	int dx = x1 - x0;
	int dy = y1 - y0;
	int e = -dx;
	glBegin(GL_POINTS);
	glVertex2i(x,y);
	glEnd();
	glFlush();
	while(x <= x1)
	{
		glBegin(GL_POINTS);
		glVertex2i(x,y);
		glEnd();
		glFlush();
		x++;
		e += 2 * dy;
		if (e > 0)
		{
			y++;
			e -= 2 * dx;
		}
	}
}

void Inital(void)
{
	glClearColor(1.0f,1.0f,1.0f,0.0f);
	glMatrixMode(GL_PROJECTION);
	gluOrtho2D(0.0,200.0,0.0,150.0);
}

void Display(void)
{
	int x0 = 0,y0 = 0;
	int x1 = 100,y1 = 100;
	DDALine(x0,y0,x1,y1);
	BresenhamLine(x0+1,y0,x1+1,y1);
	Bresenham(x0+2,y0,x1+2,y1);
}
  

int main(int argc,char* argv[])
{
	glutInit(&argc,argv);
	glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
	glutInitWindowSize(400,300);
	glutInitWindowPosition(100,120);
	glutCreateWindow("DDALine");
	Inital();
	glutDisplayFunc(Display);	
	glutMainLoop();
	return 0;
}