步骤一:查找相关函数,了解其功能和调用
https://blog.csdn.net/hebbely/article/details/69951068
https://blog.csdn.net/beibiannabian/article/details/77534803
https://blog.csdn.net/su20145104009/article/details/50216979中点画线法
简单图元代码:
#include<GL/glut.h>
#include<math.h>
void MidPointLine(int x0, int y0, int x1, int y1)
{
float dx, dy,m,x,y,d,a,b;
a = y0 - y1;
b = x1 - x0;
dx = x1 - x0;
dy = y1 - y0;
x = x0;
y = y0;
m = 1.0*dy / dx;
glBegin(GL_POINTS);
glVertex2f(x, y);
glEnd();
if (m >= 0 && m <= 1)
{
d = 2 * a + b;
while (x <=x1)
{
if (d > 0)//取下面的点
{
x++;
d += 2 * a;
glBegin(GL_POINTS);
glVertex2f(x, y);
glEnd();
}
else
{
x++;
y++;
d = d + 2 * a + 2 * b;
glBegin(GL_POINTS);
glVertex2f(x, y);
glEnd();
}
}
}
else if (m > 1)
{
d =a + 2*b;
while (y<=y1)
{
if (d > 0)
{
d = d + 2 * a + 2 * b;
y++;
glBegin(GL_POINTS);
glVertex2f(x, y);
glEnd();
}
else
{
d += 2 * b;
x++;
y++;
glBegin(GL_POINTS);
glVertex2f(x, y);
glEnd();
}
}
}
else if (m<= 0&&m>= -1)
{
d = 2 * a - b;
while (x <=x1)
{
if (d > 0)
{
d = d + 2 * a - 2 * b;
x++;
glBegin(GL_POINTS);
glVertex2f(x, y);
glEnd();
}
else
{
d = d + 2 * a;
x++;
y--;
glBegin(GL_POINTS);
glVertex2f(x, y);
glEnd();
}
}
}
else
{
d = a - 2 * b;
while (y >=y1)
{
if (d > 0)
{
d = d - 2 * a;
x++;
y--;
glBegin(GL_POINTS);
glVertex2f(x, y);
glEnd();
}
else
{
d = d + 2 * a - 2 * b;
y--;
glBegin(GL_POINTS);
glVertex2f(x, y);
glEnd();
}
}
}
}
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, 500.0f, 0.0f, 500.0f * h / w, 1.0f, -1.0f);
}
else
{
glOrtho(0.0f, 500.0f * w / h, 0.0f, 500.0f, 1.0f, -1.0f);
}
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void init()
{
glClearColor(0.0f, 1.0f, 1.0f, 1.0f);
}
void RenderScene()
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0, 0.0, 0.0);
MidPointLine(100,250,250,50);
glFlush();
}
int main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
glutCreateWindow("Line");
init();
glutInitWindowPosition(100, 100);
glutInitWindowSize(500, 500);
glutDisplayFunc(RenderScene);
glutReshapeFunc(changeSize);
glutMainLoop();
return 0;
}
中点线算法代码:
#include<GL/glut.h>
#include<math.h>
void MidPointLine(int x0, int y0, int x1, int y1)
{
float dx, dy,m,x,y,d,a,b;
a = y0 - y1;
b = x1 - x0;
dx = x1 - x0;
dy = y1 - y0;
x = x0;
y = y0;
m = 1.0*dy / dx;
glBegin(GL_POINTS);
glVertex2f(x, y);
glEnd();
if (m >= 0 && m <= 1)
{
d = 2 * a + b;
while (x <=x1)
{
if (d > 0)//取下面的点
{
x++;
d += 2 * a;
glBegin(GL_POINTS);
glVertex2f(x, y);
glEnd();
}
else
{
x++;
y++;
d = d + 2 * a + 2 * b;
glBegin(GL_POINTS);
glVertex2f(x, y);
glEnd();
}
}
}
else if (m > 1)
{
d =a + 2*b;
while (y<=y1)
{
if (d > 0)
{
d = d + 2 * a + 2 * b;
y++;
glBegin(GL_POINTS);
glVertex2f(x, y);
glEnd();
}
else
{
d += 2 * b;
x++;
y++;
glBegin(GL_POINTS);
glVertex2f(x, y);
glEnd();
}
}
}
else if (m<= 0&&m>= -1)
{
d = 2 * a - b;
while (x <=x1)
{
if (d > 0)
{
d = d + 2 * a - 2 * b;
x++;
glBegin(GL_POINTS);
glVertex2f(x, y);
glEnd();
}
else
{
d = d + 2 * a;
x++;
y--;
glBegin(GL_POINTS);
glVertex2f(x, y);
glEnd();
}
}
}
else
{
d = a - 2 * b;
while (y >=y1)
{
if (d > 0)
{
d = d - 2 * a;
x++;
y--;
glBegin(GL_POINTS);
glVertex2f(x, y);
glEnd();
}
else
{
d = d + 2 * a - 2 * b;
y--;
glBegin(GL_POINTS);
glVertex2f(x, y);
glEnd();
}
}
}
}
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, 500.0f, 0.0f, 500.0f * h / w, 1.0f, -1.0f);
}
else
{
glOrtho(0.0f, 500.0f * w / h, 0.0f, 500.0f, 1.0f, -1.0f);
}
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void init()
{
glClearColor(0.0f, 1.0f, 1.0f, 1.0f);
}
void RenderScene()
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0, 0.0, 0.0);
MidPointLine(100,250,250,50);
glFlush();
}
int main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
glutCreateWindow("Line");
init();
glutInitWindowPosition(100, 100);
glutInitWindowSize(500, 500);
glutDisplayFunc(RenderScene);
glutReshapeFunc(changeSize);
glutMainLoop();
return 0;
}
原文:https://www.cnblogs.com/legendcong/p/9858873.html