本博客計算機圖形學系列文章索引:
中點畫直線算法的具體內容不再給出,想知道的參考教材。
我們的教材是:《計算機圖形學》 機械工業出版社 ,徐文鵬主編
具體算法實現時,需將直線劃分爲如圖所示的四個區域。
一、①②區域的算法實現時,從X軸方向看。①區域下一個點應該是(x+1,y)或(x+1,y+1)。
②區域下一個點應該是(x+1,y)或(x+1,y-1)。
二、③④區域的算法實現時,從Y軸方向看。③區域下一個點應該是(x,y+1)或(x-1,y+1)。
④區域下一個點應該是(x,y+1)或(x+1,y+1)。
下面給出具體代碼:
#include <tchar.h>
#include <GL/glut.h>
#include <cstdlib>
#include <iostream>
using namespace std;
//鏈接必要的庫文件
#pragma comment( lib, "opengl32.lib" )
#pragma comment( lib, "glu32.lib" )
#pragma comment( lib, "glut32.lib" )
//畫點
void print(float x,float y)
{
glPointSize(2);
glBegin (GL_POINTS);
glColor3f (1.0f, 0.0f, 0.0f);
glVertex2i ((int)x,(int)y);
glEnd ();
}
void MidPointLine(float x0,float y0,float x1,float y1)
{
float a,b;
float k,x,xmax,y,ymin,ymax;
float d0,d1,d2;
//直線和Y軸平行
if(x0==x1)
{
x=x0;
ymin=(y0<y1)?y0:y1;
ymax=(y0>y1)?y0:y1;
while(ymin<ymax)
{
print(x,ymin);
ymin++;
}
}
else
{
k=(y1-y0)/(x1-x0);
xmax=(x0>x1)?x0:x1;
//保證初始化x時取x0和x1中的最小值
if(x1>x0)
{
a=y0-y1;
b=x1-x0;
x=x0;
y=y0;
}
else
{
a=y1-y0;
b=x0-x1;
x=x1;
y=y1;
}
//畫區域一的直線
if(k>=0&&k<=1)
{
d0=2*a+b;
d1=2*a+2*b;
d2=2*a;
while(x<xmax)
{
if(d0<0)
{
x++;
y++;
d0+=d1;
}
else
{
x++;
d0+=d2;
}
print(x,y);
}
}
//畫區域二的直線
if(k>=-1&&k<0)
{
d0=2*a-b;
d1=2*a-2*b;
d2=2*a;
while(x<xmax)
{
if(d0<0)
{
x++;
d0+=d2;
}
else
{
x++;
y--;
d0+=d1;
}
print(x,y);
}
}
//畫區域三的直線
if(k<-1)
{
d0=2*b-a;
d1=2*b;
d2=2*b-2*a;
while(x<xmax)
{
if(d0<0)
{
y++;
d0+=d1;
}
else
{
x--;
y++;
d0+=d2;
}
print(x,y);
}
}
//畫區域四的直線
if(k>1)
{
d0=a+2*b;
d1=2*b;
d2=2*a+2*b;
while(x<xmax)
{
if(d0<0)
{
y++;
d0+=d1;
}
else
{
x++;
y++;
d0+=d2;
}
print(x,y);
}
}
}
}
void RenderScene(void)
{
glClear(GL_COLOR_BUFFER_BIT);
//畫直線
MidPointLine(150,80,50,50);
MidPointLine(150,300,50,50);
MidPointLine(50,50,-150,250);
MidPointLine(50,50,-150,130);
glFlush();
}
void ChangeSize(GLsizei w,GLsizei h)
{
if(h==0)
{
h=1;
}
glViewport(0,0,w,h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if(w<=h)
{
glOrtho(0.0f,250.0f,0.0f,250.0f*h/w,1.0f,-1.0f);
}
else
{
glOrtho(0.0f,250.0f*w/h,0.0f,250.0f,1.0f,-1.0f);
}
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void Init(void)
{
glClearColor(1.0f,1.0f,1.0f,0.0f);
glShadeModel(GL_FLAT);
}
int _tmain(int argc, _TCHAR* argv[])
{
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
glutCreateWindow("中點法畫直線");
Init();
glutDisplayFunc(RenderScene);
glutReshapeFunc(ChangeSize);
glutMainLoop();
return 0;
}
實驗現象如圖: