计算机图形学OpenGL作业之画直线 / 画圆 / 画椭圆

最难的还是理解图形流水线,今天理解了一下坐标系

三次的代码合在一起

#include
#include
using namespace std;

void bresenham_line(int x0, int y0, int x1, int y1);
void bresenham_circle(int r);
void bresenham_ellipse(int a, int b);

void initial()
{
	glClearColor(1.0, 1.0, 1.0, 1.0);
	glMatrixMode(GL_PROJECTION);
	gluOrtho2D(-50, 50, -50, 50);					//这个很重要关于坐标系,后面详写
	//glOrtho(-10.0, 10.0, -10.0, 10.0, -1.0, 1.0);
}
void display()
{
	//int x0 = 0;					//直线数据
	//int y0 = 0;
	//int x1 = 5;
	//int y1 = 8;
	//int r = 20;					//圆的半径
	int a = 16;						//椭圆长短轴
	int b = 9;
	glClear(GL_COLOR_BUFFER_BIT);
	glColor3f(0.0, 0.0, 0.0);

	/*glBegin(GL_LINES);			//由起点终点确定的直线
	glVertex2i(x0, y0);
	glVertex2i(x1, y1);
	glEnd();*/
	glBegin(GL_LINES);				//x轴
	glVertex2i(-50,0);
	glVertex2i(50, 0);
	glEnd();

	glBegin(GL_LINES);				//y轴
	glVertex2i(0, 50);
	glVertex2i(0, -50);
	glEnd();

	glColor3f(1.0, 0.0, 0.0);	   //BH算法
	glPointSize(2.0);
	glBegin(GL_POINTS);
	//bresenham_line(x0,y0,x1,y1);
	//bresenham_circle(r);
	bresenham_ellipse(a, b);
	glEnd();
	glFlush();
}
void setPixel(GLint xCoord, GLint yCoord)
{
	glVertex2i(xCoord, yCoord);
}
void bresenham_ellipse(int a, int b)
{
	int d;
	int x = 0;
	int y = b;
	d = b * b + a * a * (-b + 0.25);
	while (2 * a * a * (y - 0.5) > 2 * b * b * (x + 1))
	{
		if (d >= 0)
		{
			cout << "(" << x << "," << y << ")" << endl;
			setPixel(x, y);
			setPixel(x, -y);
			setPixel(-x, -y);
			setPixel(-x, y);
			d = d + b * b * (2 * x + 3) + a * a * (-2 * y + 2);
			x++;
			y--;
		}
		else
		{
			cout << "(" << x << "," << y << ")" << endl;
			setPixel(x, y);
			setPixel(x, -y);
			setPixel(-x, -y);
			setPixel(-x, y);
			d = d + b * b * (2 * x + 3);
			x++;
		}
	}
	d = b * b * (x + 0.5) * (x + 0.5) + a * a * (y - 1) * (y - 1) - a * a * b * b;
	while (y != 0)
	{
		if (d >= 0)
		{
			cout << "(" << x << "," << y << ")" << endl;
			setPixel(x, y);
			setPixel(x, -y);
			setPixel(-x, -y);
			setPixel(-x, y);
			d = d + a * a * (-2 * y + 3);
			y--;
		}
		else
		{
			cout << "(" << x << "," << y << ")" << endl;
			setPixel(x, y);
			setPixel(x, -y);
			setPixel(-x, -y);
			setPixel(-x, y);
			d = b * b * (2 * x + 2) + a * a * (-2 * y + 3);
			x++;
			y--;
		}
	}
}
void bresenham_circle(int r)
{
	int d;
	int x = 0;
	int y = r;
	d = 1 - r;
	while (x <= y)
	{
		if (d >= 0)
		{
			cout << "(" << x << "," << y << ")" << endl;
			setPixel(x, y);
			setPixel(y, x);
			setPixel(x, -y);
			setPixel(y, -x);
			setPixel(-x, -y);
			setPixel(-y, -x);
			setPixel(-x, y);
			setPixel(-y, x);
			d = d + 2 * x - 2 * y - 5;
			x++;
			y--;
		}
		else
		{
			cout << "(" << x << "," << y << ")" << endl;
			setPixel(x, y);
			setPixel(y, x);
			setPixel(x, -y);
			setPixel(y, -x);
			setPixel(-x, -y);
			setPixel(-y, -x);
			setPixel(-x, y);
			setPixel(-y, x);
			x++;
			
			d = d + 2 * x + 3;
		}
	}
}
void bresenham_line(int x0, int y0, int x1, int y1)
{
	int dx = x1 - x0;
	int dy = y1 - y0;
	int d;
	int x = x0;
	int y = y0;
	if (dy >= dx)						//y为最大迁移方向
	{
		d = 2 * dx - dy;			//d初始值
		while (y <= y1)
		{
			cout << "(" << x << "," << y << ")" << endl;
			setPixel(x, y);
			y++;
			if (d > 0)
			{
				x++;
				d = d + 2 * dx - 2 * dy;
			}
			else
			{
				d = d + 2 * dx;
			}
		}
	}
	else                                //x为最大迁移方向
	{
		d = dx - 2 * dy;
		while (x <= x1)
		{
			setPixel(x, y);
			x++;
			if (d > 0)
			{
				y++;
				d = d - 2 * dy;
			}
			 else
			{
				d = d + 2 * dx - 2 * dy;
			}
		}
	}
}
int main(int argc, char* argv[])
{
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
	glutInitWindowPosition(100, 100);
	glutInitWindowSize(400, 400);
	glutCreateWindow("LINE");
	glutDisplayFunc(&display);
	initial();
	glutMainLoop();
	return 0;
}
一些直线和圆的中点BH算法的推导
  1. 圆的推导及绘制的图
    计算机图形学OpenGL作业之画直线 / 画圆 / 画椭圆_第1张图片
    计算机图形学OpenGL作业之画直线 / 画圆 / 画椭圆_第2张图片
  2. 直线的推导和图片
    计算机图形学OpenGL作业之画直线 / 画圆 / 画椭圆_第3张图片
    计算机图形学OpenGL作业之画直线 / 画圆 / 画椭圆_第4张图片
  3. 椭圆的没推导,公式啥的照着书上抄的
    计算机图形学OpenGL作业之画直线 / 画圆 / 画椭圆_第5张图片
    啊! 窗口上的字忘改了!..
最后说一说我的一些理解

今天的作业不难,就是上次作业的推广,我一直在想的就是怎么展现四个象限,原来做的都是第一象限.下面是我现阶段对这个的理解,可能还有很多错误。慢慢改正。

  1. 世界坐标系,我觉得应该就是物体放置的那个坐标系(笛卡尔右手坐标系),在这个坐标系下,我们是站在坐标原点的,也就是我们的视线在坐标原点。右侧是x正半轴,上侧是y的正半轴,视线方向是z的负半轴。
  2. 这个函数glOrtho(left,right , down, top, near, far);就是用多大的一个框去框住物体。
    参考文章:opengl中对glOrtho()函数的理解

你可能感兴趣的:(学习中的电子笔记,opengl)