计算机图形学第一次实验

Posted legendcong

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了计算机图形学第一次实验相关的知识,希望对你有一定的参考价值。

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

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

  

以上是关于计算机图形学第一次实验的主要内容,如果未能解决你的问题,请参考以下文章

计算机图形学实验二——二维图形几何变换及裁剪

计算机图形学实验一——基本图素的生成算法和图形填充

求代码注释:计算机图形学的OpenGL画四面体。高手来吧。争取每句都注释下。谢谢

计算机图形学实验四——投影变换

计算机图形学实验六——线型和线宽

计算机图形学实验三——自由曲线的绘制消隐