应用技术大学实验——计算机图形学

本文介绍了如何在VS2017环境中实现DDA、中点画线法和Bresenham算法来生成直线,通过实例展示了如何在OpenGL中应用这些算法绘制屏幕上的线条。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实验二 直线的生成算法

一、实验目的 理解直线生成的基本原理及几种常用的直线生成算法,利用VS 2017实现直 线生成的DDA算法、中点画线法、Bresenham算法。

二、实验内容 1.理解几种常用的直线生成算法。 2.利用VS 2017 在屏幕上生成一条直线。

三、实验步骤 1.复习直线生成的基本原理。 2.将代码补充完整。

实验环境:

vs 2017

VS2017下载地址和安装教程(图解)-优快云博客

Visual Studio2017 配置OpenGL 

搜索NupenGL下载两个插件 

不下载#include <GL/glut.h> 文件会报错,因为没有这个文件

 代码:

 1.//DDA算法画直线

#include <Windows.h>
#include <GL/glut.h>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>

// DDA算法画直线
void DDAline() {
	int x1 = 101; // 起点 x 坐标
	int y1 = 101; // 起点 y 坐标
	int x2 = 300; // 终点 x 坐标
	int y2 = 200; // 终点 y 坐标

	int dx = x2 - x1;
	int dy = y2 - y1;

	int steps;
	if (abs(dx) > abs(dy))
		steps = abs(dx);
	else
		steps = abs(dy);

	float x_increment = (float)dx / (float)steps;
	float y_increment = (float)dy / (float)steps;

	float x = x1;
	float y = y1;

	glBegin(GL_POINTS);
	for (int k = 0; k < steps; k++) {
		glVertex2i(round(x), round(y));
		x += x_increment;
		y += y_increment;
	}
	glEnd();
}

void display() {
	glClear(GL_COLOR_BUFFER_BIT);
	glColor3f(1.0, 1.0, 1.0);

	DDAline(); // 使用DDA算法画直线

	glFlush();
}

int main(int argc, char** argv) {
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
	glutInitWindowSize(400, 400);
	glutInitWindowPosition(100, 100);
	glutCreateWindow("DrawLineByDDA");
	gluOrtho2D(0, 400, 0, 400);
	glutDisplayFunc(display);
	glutMainLoop();
	return 0;
}

2.中点画线法:

#include <Windows.h>
#include <GL/glut.h>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>

float X[65536], Y[65536];
int cnt = 0;

void MidPointline(int x1, int y1, int x2, int y2) {
	int dx = x2 - x1;
	int dy = y2 - y1;
	int d = 2 * dy - dx;
	int incrE = 2 * dy;
	int incrNE = 2 * (dy - dx);
	int x = x1, y = y1;

	X[cnt] = x;
	Y[cnt] = y;
	cnt++;

	while (x < x2) {
		if (d <= 0)
			d += incrE;
		else {
			d += incrNE;
			y++;
		}
		x++;
		X[cnt] = x;
		Y[cnt] = y;
		cnt++;
	}
}

void midPoints() {
	glClear(GL_COLOR_BUFFER_BIT);
	glColor3f(1.0, 1.0, 1.0);

	glBegin(GL_POINTS);
	for (int i = 0; i < cnt; i++) {
		glVertex2i(round(X[i]), round(Y[i]));
	}
	glEnd();

	glFlush();
}

int main(int argc, char* argv[]) {
	MidPointline(101, 101, 499, 499);
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
	glutInitWindowPosition(100, 100);
	glutInitWindowSize(400, 400);
	glutCreateWindow("DrawLineBymidPoints");
	gluOrtho2D(0, 400, 0, 400);
	glutDisplayFunc(&midPoints);
	glutMainLoop();
	return 0;
}

3.//Bresenham 算法画直线 

 

#include <Windows.h>
#include <GL/glut.h>
#include <stdlib.h>
#include <stdio.h>
#include <cmath>

void Bresenham(int x1, int y1, int x2, int y2) {
    int dx = abs(x2 - x1);
    int dy = abs(y2 - y1);
    int x, y;
    int p = 2 * dy - dx;
    int const1 = 2 * dy;
    int const2 = 2 * (dy - dx);
    int x_start, x_end, y_start, y_end;

    if (x1 < x2) {
        x_start = x1;
        x_end = x2;
    }
    else {
        x_start = x2;
        x_end = x1;
    }

    if (y1 < y2) {
        y_start = y1;
        y_end = y2;
    }
    else {
        y_start = y2;
        y_end = y1;
    }

    x = x_start;
    y = y_start;

    glBegin(GL_POINTS);
    glVertex2i(x, y);

    while (x < x_end) {
        x++;
        if (p < 0) {
            p += const1;
        }
        else {
            y++;
            p += const2;
        }
        glVertex2i(x, y);
    }
    glEnd();
}

void display() {
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(1.0, 1.0, 1.0);

    Bresenham(100, 100, 300, 200); // 使用Bresenham算法画直线

    glFlush();
}

int main(int argc, char* argv[]) {
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
    glutInitWindowPosition(100, 100);
    glutInitWindowSize(400, 400);
    glutCreateWindow("DrawLineByBresenham");
    gluOrtho2D(0, 400, 0, 400);
    glutDisplayFunc(display);
    glutMainLoop();
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值