中点画直线算法

news/2024/7/8 5:17:52 标签: 算法, float, buffer, 出版, 图形

本博客计算机图形学系列文章索引:

地址:《计算机图形学系列相关文章索引(持续更新)》


中点画直线算法的具体内容不再给出,想知道的参考教材。

我们的教材是:《计算机图形学》 机械工业出版社 ,徐文鹏主编

具体算法实现时,需将直线划分为如图所示的四个区域。


一、①②区域的算法实现时,从X轴方向看。①区域下一个点应该是(x+1,y)或(x+1,y+1)。

区域下一个点应该是(x+1,y)或(x+1,y-1)。

二、③④区域的算法实现时,从Y轴方向看。③区域下一个点应该是(x,y+1)或(x-1,y+1)。

区域下一个点应该是(x,y+1)或(x+1,y+1)。

下面给出具体代码:

#include <tchar.h>
#include <GL/glut.h>
#include <cstdlib>
#include <iostream>

using namespace std;

//链接必要的库文件
#pragma comment( lib, "opengl32.lib" )	 
#pragma comment( lib, "glu32.lib" )	    
#pragma comment( lib, "glut32.lib" )	 

//画点
void print(float x,float y)
{
	glPointSize(2);
	glBegin (GL_POINTS);
	glColor3f (1.0f, 0.0f, 0.0f);
	glVertex2i ((int)x,(int)y);
	glEnd ();
}

void MidPointLine(float x0,float y0,float x1,float y1)
{	
	float a,b;
	float k,x,xmax,y,ymin,ymax;
	float d0,d1,d2;

	//直线和Y轴平行
	if(x0==x1)
	{
		x=x0;
		ymin=(y0<y1)?y0:y1;
		ymax=(y0>y1)?y0:y1;
		while(ymin<ymax)
		{
			print(x,ymin);
			ymin++;
		}

	}
	else
	{
		k=(y1-y0)/(x1-x0);
		xmax=(x0>x1)?x0:x1;

		//保证初始化x时取x0和x1中的最小值
		if(x1>x0)
		{
			a=y0-y1;
			b=x1-x0;
			x=x0;
			y=y0;
		}
		else
		{
			a=y1-y0;
			b=x0-x1;
			x=x1;
			y=y1;
		}

		//画区域一的直线
		if(k>=0&&k<=1)
		{
			d0=2*a+b;
			d1=2*a+2*b;
			d2=2*a;
			while(x<xmax)
			{
				if(d0<0)
				{
					x++;
					y++;
					d0+=d1;
				}
				else
				{
					x++;
					d0+=d2;
				}
				print(x,y);
			}
		}
				
		//画区域二的直线
		if(k>=-1&&k<0)
		{
			d0=2*a-b;
			d1=2*a-2*b;
			d2=2*a;
			while(x<xmax)
			{
				if(d0<0)
				{
					x++;
					d0+=d2;
				}
				else
				{
					x++;
					y--;
					d0+=d1;
				}

				print(x,y);
			}
		}

		//画区域三的直线
		if(k<-1)
		{
			d0=2*b-a;
			d1=2*b;
			d2=2*b-2*a;
			while(x<xmax)
			{
				if(d0<0)
				{
					y++;
					d0+=d1;
				}
				else
				{
					x--;
					y++;
					d0+=d2;
				}
				print(x,y);
			}
		}

		//画区域四的直线
		if(k>1)
		{
			d0=a+2*b;
			d1=2*b;
			d2=2*a+2*b;
			while(x<xmax)
			{
				if(d0<0)
				{
					y++;
					d0+=d1;
				}
				else
				{
					x++;
					y++;
					d0+=d2;
				}
				print(x,y);
			}
		}
	}
} 
 
void RenderScene(void)
{
	glClear(GL_COLOR_BUFFER_BIT);
	
	//画直线
	MidPointLine(150,80,50,50);
	MidPointLine(150,300,50,50);
	MidPointLine(50,50,-150,250);
	MidPointLine(50,50,-150,130);

	glFlush();
}

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,250.0f,0.0f,250.0f*h/w,1.0f,-1.0f);
	}
	else
	{
		glOrtho(0.0f,250.0f*w/h,0.0f,250.0f,1.0f,-1.0f);
	}

	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();

}

void Init(void)
{
	glClearColor(1.0f,1.0f,1.0f,0.0f);
	glShadeModel(GL_FLAT);
}

int _tmain(int argc, _TCHAR* argv[])
{
	glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
	glutCreateWindow("中点法画直线");
	Init();
	glutDisplayFunc(RenderScene);
	glutReshapeFunc(ChangeSize);
    glutMainLoop();
	return 0;

}



实验现象如图:




http://www.niftyadmin.cn/n/1332082.html

相关文章

PageHelper 被曝有性能问题,你中招了吗?

点击上方蓝色字体&#xff0c;选择“设置星标”优质文章&#xff0c;第一时间送达作者&#xff1a;岁月安然blog.csdn.net/baidu_38083619/article/details/82463058前因项目一直使用的是PageHelper实现分页功能&#xff0c;项目前期数据量较少一直没有什么问题。随着业务扩增&…

Windows的窗口类风格、鼠标光标风格

一、窗口类 一个窗口类不是一个C类&#xff0c;而是早于并存在于C之外的窗口专有的类。窗口类的作用就像一个模板&#xff0c;可以由此创建其他的窗口&#xff0c;并可共享某些特征&#xff0c;包括下面的特征&#xff1a; 1、类风格&#xff1a;包括能给与窗口的微小的特征。…

面试官问:为什么 SpringBoot 的 jar 可以直接运行?

点击上方 果汁简历 &#xff0c;选择“置顶公众号”优质文章&#xff0c;第一时间送达来源&#xff1a;http://fangjian0423.github.io/SpringBoot提供了一个插件spring-boot-maven-plugin用于把程序打包成一个可执行的jar包。在pom文件里加入这个插件即可&#xff1a;<buil…

软件设计师考试资料大放送,持续更新中……(历年试题分析与解析。。。)!!!

本人参加了2011年下半年的软件设计师考试&#xff0c;当时考试的时候收集了一些资料。现在成绩出来了&#xff0c;就把这些资料共享出来&#xff0c;供各位需要的下载。 几个比较重要的网址&#xff1a; 中国计算机技术职业资格网&#xff1a;http://www.rkb.gov.cn/ 资料存在了…

MySQL用得好好的,为什么要转ES?

来源&#xff1a;京东技术&#xff08;ID: jingdongjishu&#xff09;京东到家订单中心系统业务中&#xff0c;无论是外部商家的订单生产&#xff0c;或是内部上下游系统的依赖&#xff0c;订单查询的调用量都非常大&#xff0c;造成了订单数据读多写少的情况。我们把订单数据存…

SQL Server学习系列——准备工作

最近决定重新把SQL Server学习一遍&#xff0c;把我的学习笔记都记录在这里&#xff0c;定期更新。如有不对的地方&#xff0c;欢迎指教…………。 首先是一些准备工作&#xff0c;我安装的是SQL Server 2008 R2试用版。然后最近主要看的书籍是《SQL Server 2005 编程入门经典…

2021年2月程序员工资统计,又拖后腿了……

点击上方 果汁简历 &#xff0c;选择“置顶公众号”优质文章&#xff0c;第一时间送达2021年2月采集样本370020人。2021年2月程序员平均工资15144元&#xff0c;工资中位数12500元&#xff0c;其中95%的人的工资介于5250元到37500元。一年工资变化&#xff1a;这里出现了神奇的…

SQL Server学习系列(一)——内部连接查询

关系数据库中的查询往往不是仅限于单表的&#xff0c;而是在很多表之间的连接查询。连接包括以下几种&#xff1a; 一、内部连接&#xff1b;二、外部连接&#xff1b;三、完全连接&#xff1b;四、交叉连接。今天就介绍第一种——内部连接。 首先看一下内部连接的语法结构&a…