计算机图形学实验之中点画线算法、Bresenham画线算法

实验目的: 掌握相关算法的原理及实现 了解绘图区域的坐标概念

实验要求: 掌握OpenGL或其他开发工具的环境配置 交互方便(鼠标点选、键盘输入等) 标注出绘图窗口的坐标系(原点、坐标轴) 可处理任意方向、斜率的直线段

可选要求: 对直线段端点非整数坐标情形进行处理 对算法效率进行对比测试(比如:与OpenGL等函数做时间对比)

以下是代码,可能有错误的地方,仅供参考

一、中点画线算法

#include<GL/glut.h> 
#include<math.h>
#include<iostream>
using namespace std;

void Midpoint_Line(float x11, float y11, float x22, float y22)
{
	glClear(GL_COLOR_BUFFER_BIT);
	//绘制坐标轴
	glBegin(GL_LINES);
	glColor3f(0, 1, 0);
	glVertex3f(-1.0, 0.0, 0.0);
	glVertex3f(1.0, 0.0, 0.0);
	glVertex3f(0.0, 1.0, 0.0);
	glVertex3f(0.0, -1.0, 0.0);
	glEnd();
	float a, b, d1, d2, d, x, y;
	float k;
	a = y11 - y22, b = x22 - x11;
	if (x22 < x11) {
		d = x11, x11 = x22, x22 = d;
		d = y11, y11 = y22, y22 = d;
	}
	if (b == 0)
		k = -1 * a * 100;
	else
		k = a / (x11 - x22);
	x = x11; y = y11;
	if (k >= 0 && k <= 1) {
		d = 2 * a + b;
		d1 = 2 * a;
		d2 = 2 * (a + b);
		while (x < x22)
		{
			glBegin(GL_POINTS);
			glColor3f(0, 0, 1);//设置图形颜色蓝色
			glVertex2f(x / 1000, y / 1000);
			glEnd();
			if (d <= 0) {
				x++, y++, d += d2;
			}
			else {
				x++, d += d1;
			}
		}
	}
	else if (k <= 0 && k >= -1)
	{
		d = 2 * a - b; d1 = 2 * a - 2 * b, d2 = 2 * a;
		while (x < x22)
		{
			glBegin(GL_POINTS);
			glColor3f(0, 0, 1);//设置图形颜色蓝色
			glVertex2f(x / 1000, y / 1000);
			glEnd();
			if (d > 0) {
				x++, y--;
				d += d1;
			}
			else {
				x++, d += d2;
			}
		}
	}
	else if (k > 1)
	{
		d = a + 2 * b; d1 = 2 * (a + b), d2 = 2 * b;
		while (y < y22)
		{
			glBegin(GL_POINTS);
			glColor3f(0, 0, 1);//设置图形颜色蓝色
			glVertex2f(x / 1000, y / 1000);
			glEnd();
			if (d > 0) {
				x++, y++, d += d1;
			}
			else {
				y++, d += d2;
			}
		}
	}
	else
	{
		d = a - 2 * b; d1 = -2 * b, d2 = 2 * (a - b);
		while (y > y22)
		{
			glBegin(GL_POINTS);
			glColor3f(0, 0, 1);//设置图形颜色蓝色
			glVertex2f(x / 1000, y / 1000);
			glEnd();
			if (d <= 0) {
				x++, y--, d += d2;
			}
			else {
				y--, d += d1;
			}
		}
	}
	glFlush();

}

void display() {
	float x11, y11, x22, y22;
	cout << "请输入直线起始点坐标和终点坐标:" << endl;
	cin >> x11 >> y11 >> x22 >> y22;
	Midpoint_Line(x11, y11, x22, y22);
}

int main(int argc, char** argv) {
	glutInit(&argc, argv); 
	glutCreateWindow("中点画线算法"); //创建窗口并赋予标题
	glutDisplayFunc(display);//调用renderScene把绘制传送到窗口
	glutMainLoop(); 
	return 0;
}

二、Bresenham画线算法

#include <GL/glut.h> 
#include<math.h>
#include<iostream>
using namespace std;

void Bresenham_line(float x11, float y11, float x22, float y22)
{
	glClear(GL_COLOR_BUFFER_BIT);
	//绘制坐标轴
	glBegin(GL_LINES);
	glColor3f(1, 0, 0);//设置坐标轴颜色,红色
	glVertex3f(-1.0, 0.0, 0.0);
	glVertex3f(1.0, 0.0, 0.0);
	glVertex3f(0.0, 1.0, 0.0);
	glVertex3f(0.0, -1.0, 0.0);
	glEnd();
	float x, y, dx, dy;
	x = x11; y = y11;
	float k, e;
	dx = abs(x22 - x11);
	dy = abs(y22 - y11);
	k = dy / dx; 
	e = -dx;
	int s1 = x22 > x11 ? 1 : -1;
	int s2 = y22 > y11 ? 1 : -1;
	bool flag = false; //默认|k|<1
	if (dy > dx) { //|k|>1的情况
		int temp = dx;
		dx = dy;
		dy = temp;
		flag = true;
	}
	for (int i = 0; i < dx; i++)
	{
		glBegin(GL_POINTS);
		glColor3f(0, 0, 1);//设置图形颜色蓝色
		glVertex2f(x / 1000, y / 1000);
		glEnd();
		if (e >= 0)
		{
			if (!flag)		// 当斜率 < 1 时,选取上下象素点
				y += s2;
			else					// 当斜率 > 1 时,选取左右象素点
				x += s1;
			e -= 2 * dx;
		}
		if (!flag)
			x += s1;				// 当斜率 < 1 时,选取 x 为步长
		else
			y += s2;				// 当斜率 > 1 时,选取 y 为步长
		e += 2 * dy;
	}
	glFlush();
}

void display() {
	int x11, y11, x22, y22;
	cout << "请输入直线起始点坐标和终点坐标:" << endl;
	cin >> x11 >> y11 >> x22 >> y22;
	Bresenham_line(x11, y11, x22, y22);
}

int main(int argc, char** argv)
{
	glutInit(&argc, argv); //初始化glut
	glutCreateWindow("Bresenham算法"); //创建窗口并赋予title
	glutDisplayFunc(display);//调用renderScene把绘制传送到窗口
	glutMainLoop(); //进入循环等待
	return 0;
}


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值