计算机图形学第一次实验

步骤一:查找相关函数,了解其功能和调用

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;
}

  

猜你喜欢

转载自www.cnblogs.com/legendcong/p/9858873.html