zoukankan      html  css  js  c++  java
  • 计算机图形学第一次实验

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

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

      

  • 相关阅读:
    列表框JList 及动作监听
    WindowListener(附带适配器改良方案)
    常用的几种文本组件(JTextComponent)
    JToggleButton组件
    java实现鼠标拖拽动作监听
    Flex读文本文件
    WPF socket通讯 UDP接收消息
    在线签名,并保存到本地
    flex直接访问服务器
    windows 8各种流之间的转换
  • 原文地址:https://www.cnblogs.com/legendcong/p/9858873.html
Copyright © 2011-2022 走看看