实验二 直线的生成算法
一、实验目的 理解直线生成的基本原理及几种常用的直线生成算法,利用VS 2017实现直 线生成的DDA算法、中点画线法、Bresenham算法。
二、实验内容 1.理解几种常用的直线生成算法。 2.利用VS 2017 在屏幕上生成一条直线。
三、实验步骤 1.复习直线生成的基本原理。 2.将代码补充完整。
实验环境:
vs 2017
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;
}