1. 程式人生 > >計算機圖形學——直線生成演算法

計算機圖形學——直線生成演算法

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

#include <iostream>
#include "stdio.h"
#include <stdlib.h>
#include <cmath>
#include <gl/glut.h>
using namespace std;
void Inital(void)
{
 glClearColor(1.0f,1.0f,1.0f,1.0f);
 glMatrixMode(GL_PROJECTION);
 glColor3f(0.0f,0.0f,0.0f);
 gluOrtho2D(0.0,200.0,0.0,150.0);
}
void DDALine(int x0,int y0,int x1,int y1)
{
 int dx,dy,esp;
 float x,y,xIncre,yIncre;
  glPointSize(1.0f);
 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);
    glPointSize(1.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)
{
 
 glPointSize(1.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)
{
 glPointSize(1.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 Display(void)
{
 
 DDALine(0,0,8,6);
 BresenhamLine(0,0,8,6);
 Bresenham(0,0,8,6);
}

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

}