#include "math.h"
#include <windows.h>
#include <gl/glut.h>
float point[2][2];
int k1=0,k2=0;
void MiddleLine(float x0,float y0,float x1,float y1)
{
float a,b,d1,d2,d,x,y;float k;
k=(y0-y1)/(x0-x1);
if ((k>-1)&&(k<1))
{
if (x0>x1)
{
float t[2];
t[0]=x0;t[1]=y0;
x0=x1;y0=y1;
x1=t[0];y1=t[1];
}
x=x0;y=y0;
a=y0-y1;
b=x1-x0;
glBegin(GL_POINTS);
glVertex2f(x,y);
glEnd();
if ((k<1)&&(k>=0))
{
d=2*a+b;d1=2*a;d2=2*(a+b);
while (x<=x1)
{
if (d<0)
{x++;y++;d+=d2;}
else {x++;d+=d1;}
glBegin(GL_POINTS);
glVertex2f(x,y);
glEnd();
}
}
else if ((k<0)&&(k>-1))
{
d=2*(a-0.5*b);d1=2*a;d2=2*(a-b);
while (x<=x1)
{
if (d>0)
{ x++;y--;d+=d2;}
else {x++;d+=d1;}
glBegin(GL_POINTS);
glVertex2f(x,y);
glEnd();
}
}
}
else{
if (y0>y1)
{
float t[2];
t[0]=x0;t[1]=y0;
x0=x1;y0=y1;
x1=t[0];y1=t[1];
}
x=x0;y=y0;
a=y0-y1;
b=x1-x0;
glBegin(GL_POINTS);
glVertex2f(x,y);
glEnd();
if (k>=1)
{
d=a+2*b;d1=2*b;d2=2*(a+b);
while (y<=y1)
{
if (d>0)
{y++;x++;d+=d2;}
else {y++;d+=d1;}
glBegin(GL_POINTS);
glVertex2f(x,y);
glEnd();
}
}
else if (k<=-1)
{
d=-a+2*b;d1=2*b;d2=2*(-a+b);
while (y<=y1)
{
if (d<0)
{y++;x--;d+=d2;}
else {y++;d+=d1;}
glBegin(GL_POINTS);
glVertex2f(x,y);
glEnd();
}
}
}
}
void RenderScene()
{
glClear(GL_COLOR_BUFFER_BIT);
glLineWidth(1.0);
glColor3f(0.0,1.0,0.0);
if (k1==1)
{
MiddleLine(point[0][0],point[0][1],point[1][0],point[1][1]);
k1=0;
}
glFlush();
glutSwapBuffers();
}
void SetupRC()
{
glClearColor(0.0f,0.0f,0.0f,1.0f);
}
void Mouse(int button,int state,int x,int y)
{
y=600-y;
if (button==GLUT_LEFT_BUTTON&&state==GLUT_DOWN)
{
k1=k2%2;
point[k1][0]=x;
point[k1][1]=y;
if (k1==1)
{
glutPostRedisplay();
}
k2++;
}
}
void reshape(int w,int h)
{
glViewport(0,0,600,600);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0,600,0,600);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void main()
{
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA);
glutInitWindowSize(600,600);
glutCreateWindow("中点画线");
glutReshapeFunc(reshape);
glutDisplayFunc(RenderScene);
glutMouseFunc(Mouse);
SetupRC();
glutMainLoop();
}