本博客计算机图形学系列文章索引:
地址:《计算机图形学系列相关文章索引(持续更新)》
中点画直线算法的具体内容不再给出,想知道的参考教材。
我们的教材是:《计算机图形学》 机械工业出版社 ,徐文鹏主编
具体算法实现时,需将直线划分为如图所示的四个区域。
一、①②区域的算法实现时,从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;
}
实验现象如图: