实验目的
1.本次实验着重学习以下常用函数,在实验报告中的实验原理部分对下列函数进行参数介绍和用法介绍。
glBegin(GL_POINTS)
glVertex()
绘制一个点
glEnd();
glLoadIdentity();
设置投影参数:
glMatrixMode(GL_PROJECTION);
视景体裁剪(创建一个正交平行的视景体,即正投影):
glOrtho(left, right, bottom, top, near, far);
2.数字微分法(DDA)绘制一条直线,直线起点坐标为(-100,-100)
,终点为(50,20)
。中点Brensenham算法绘制一条直线,直线起点坐标为(-100,-100)
,终点为(50,-10)
3.用中点Bresenham算法绘制一个圆心点在(0,0)
,半径为20的圆
4.绘制棋盘
实验结果
最终结果通过改变main函数中
glutDisplayFunc();
决定展示哪一个效果
#include<gl/glut.h>
#include<cmath>
void dda(float x1, float y1, float x2, float y2);
void MidpointLine(float xs, float ys, float xe, float ye);
void ManyGlVertex2f(float absX, float absY, float x, float y);
void Bresenham(float xs, float ys, float xe, float ye);
void pnarc(float radius, float m, float n);
void bresenham_arc(float R, float m, float n);
void myinit(void);
//直线DDA法
void dda(float x1, float y1, float x2, float y2) {
float k, i;
float x, y, dx, dy;
k = fabsf(x2 - x1);
if (fabsf(y2 - y1) > k)
k = fabsf(y2 - y1);
dx = float(x2 - x1) / k;
dy = float(y2 - y1) / k;
x = float(x1);
y = float(y1);
for (i = 0.0; i < k; i++) {
glVertex2f(x, y);
x = x + dx;
y = y + dy;
}
}
void Display1(void) {
glClear(GL_COLOR_BUFFER_BIT);
glPointSize(2.0);
glColor3f(1.0, 0.0, 0.0);
glBegin(GL_POINTS);
dda(-100, -100, 50, 20);
glEnd();
glFlush();
}
//直线正负法
void MidpointLine(float xs, float ys, float xe, float ye) {
float a, b, dt1, dt2, d, x, y;
float absY = ye - ys;
float absX = xe - xs;
//采用对称的方法来绘画其他象限的图案
if ((fabsf(absY) > fabsf(absX)) && absX > 0 && absY > 0) {
//斜率大于1
float m = ys;
ys = xs;
xs = m;
float n = ye;
ye = xe;
xe = n;
}
else if (absY < 0 && absX>0 && (fabsf(absY) <= fabs(absX))) {
ys = -ys;
ye = -ye;
}
else if (absY < 0 && absX>0 && (fabsf(absY) > fabs(absX))) {
float m = ys;
ys = xs;
xs = -m;
float n = ye;
ye = xe;
xe = -n;
}
else {
//斜率0到1
//do nothing