安大计算机图形学实验——直线和圆的绘制

这篇博客主要介绍了使用C++和OpenGL进行计算机图形学实验,包括设置投影参数、DDA直线绘制、Bresenham算法绘制直线及圆,以及实现棋盘格的显示。实验目标是理解和应用相关函数,实验结果显示了各种图形的绘制效果。
摘要由CSDN通过智能技术生成

实验目的

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 
	
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值