1. 程式人生 > >圖形學的幾道基礎練習(計算機圖形學)

圖形學的幾道基礎練習(計算機圖形學)

整理資料夾時發現曾經做的幾個作業練習,發出來和大家一起學習吧。

================================(題目①)=================================

在一個黑色的視窗中央畫出矩形、三角形、點和線。

踩坑記錄:一開始畫線部分,因為省略了glEnd(),導致生成影象時顯示空白視窗。

效果圖

題目①原始碼

#pragma warning(disable:4996)
#include<GL/glut.h>
void myDisplay(void)
{
	glClearColor(0.0, 0.0, 0.0, 0.0);  //將清空顏色設為黑色
	glClear(GL_COLOR_BUFFER_BIT);  //將視窗的背景設定為:清空顏色
	glColor3f(1.0f, 1.0f, 1.0f);  //畫一個矩形
	glRectf(-0.8f, -0.8f, 0.8, 0.8f);
	glBegin(GL_TRIANGLES);  //畫兩個三角形
	glColor3f(1.0f, 1.0f, 0.0f);  glVertex2f(0.0f, -1.0f);//黃
	glColor3f(1.0f, 0.0f, 1.0f);  glVertex2f(0.8f, 0.5f);//品紅
	glColor3f(0.0f, 1.0f, 1.0f);  glVertex2f(-0.8f, 0.5f);//青
	glColor3f(1.0f, 0.0f, 0.0f);  glVertex2f(0.0f, 1.0f);//紅
	glColor3f(0.0f, 1.0f, 0.0f);  glVertex2f(0.8f, -0.5f);//綠
	glColor3f(0.0f, 0.0f, 1.0f);  glVertex2f(-0.8f, -0.5f);//藍
	glEnd();
	glPointSize(10);  //設定點的大小
	glBegin(GL_POINTS);  //畫7個點
	glColor3f(1.0f, 1.0f, 0.0f);  glVertex2f(0.0f, 0.7f);//黃
	glColor3f(1.0f, 1.0f, 1.0f);  glVertex2f(0.0f, 0.0f);//白
	glColor3f(0.0f, 1.0f, 1.0f);  glVertex2f(0.53f, -0.33f);//青
	glColor3f(1.0f, 0.0f, 1.0f);  glVertex2f(-0.53f, -0.33f);//品紅
	glColor3f(0.0f, 0.0f, 1.0f);  glVertex2f(0.53f, 0.33f);//藍
	glColor3f(0.0f, 1.0f, 0.0f);  glVertex2f(-0.53f, 0.33f);//綠
	glColor3f(1.0f, 0.0f, 0.0f);  glVertex2f(0.0f, -0.7f);//紅
	glEnd();
	glBegin(GL_LINES);//線
	glColor3f(0.0, 0.0, 0.0);
	glLineWidth(6);//線的寬度
	glVertex2f(-0.8f, 0.5f);
	glVertex2f(0.8f, -0.5f);
	glVertex2f(0.0f, -1.0f);
	glVertex2f(0.0f, 1.0f);
	glVertex2f(0.8f, 0.5f);
	glVertex2f(-0.8f, -0.5f);
	glEnd();
	glFinish();  //強制前面的OpenGL命令立即執行,不駐留快取
}
int main(int argc, char *argv[])
{
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
	glutInitWindowPosition(100, 100);  //設定視窗在螢幕中的位置
	glutInitWindowSize(400, 400);  //設定視窗的大小
	glutCreateWindow("Hello World!");
	glutDisplayFunc(&myDisplay);
	glutMainLoop();
	return 0;
}

================================(題目②)=================================

利用OpenGL實現直線光柵化的DDA演算法和Bresenham演算法。

效果圖

題目②原始碼

#pragma warning(disable:4996)
#include<math.h>
#include <GL/glut.h>
#include<cstdio>
void LineDDA(int x0, int y0, int x1, int y1)/*  LineDDA函式畫線  */
{
	int x, y, dx, dy;
	float m;
	dx = x1 - x0;
	dy = y1 - y0;
	m = dy / dx;
	y = y0;
	glColor3f(1.0f, 1.0f, 0.0f);
	glPointSize(1);
	for (x = x0;x <= x1;x++) {
		glBegin(GL_POINTS);
		glVertex2i(x, (int)(y + 0.5));
		glEnd();
		y += m;
	}
}
void Bresenhamline(int x0, int y0, int x1, int y1)/*  Bresenham函式畫線  */
{
	int x, y, dx, dy;
	float e;
	dx = x1 - x0;
	dy = y1 - y0;
	e = -dx;
	x = x0;
	y = y0;
	for (int i = 0;i<dx;i++) {
		glBegin(GL_POINTS);
		glVertex2i(x, y);
		x++;
		e = e + 2 * dy;
		if (e >= 0) {
			y++;
			e = e - 2 * dx;
		}
	}
}

void myDisplayLine(void)
{
	glClear(GL_COLOR_BUFFER_BIT);
	glColor3f(1.0f, 0.0f, 0.0f);
	glRectf(25.0, 25.0, 75.0, 75.0);
	glPointSize(5);
	glBegin(GL_POINTS);
	glColor3f(0.0f, 1.0f, 0.0f);
	glVertex2f(0.0f, 0.0f);
	glEnd();
	LineDDA(0, 0, 200, 300);  //呼叫LineDDA函式畫線
	glBegin(GL_LINES);
	glColor3f(1.0f, 0.0f, 0.0f);
	glVertex2f(100.0f, 0.0f);
	glColor3f(0.0f, 1.0f, 0.0f);
	glVertex2f(180.0f, 240.0f);
	glEnd();
	glFlush();
}
void myDisplayBres(void)
{
	glClear(GL_COLOR_BUFFER_BIT);
	glColor3f(1.0f, 0.0f, 0.0f);
	glRectf(25.0, 25.0, 75.0, 75.0);
	glPointSize(5);
	glBegin(GL_POINTS);
	glColor3f(0.0f, 1.0f, 0.0f);
	glVertex2f(0.0f, 0.0f);
	glEnd();
	Bresenhamline(0, 0, 200, 300);  //呼叫Bresenhamline函式畫線
	glBegin(GL_LINES);
	glColor3f(1.0f, 0.0f, 0.0f);
	glVertex2f(100.0f, 0.0f);
	glColor3f(0.0f, 1.0f, 0.0f);
	glVertex2f(180.0f, 240.0f);
	glEnd();
	glFlush();
}
void Init() {
	glClearColor(0.0, 0.0, 0.0, 0.0);
	glShadeModel(GL_FLAT);
}
void Reshape(int w, int h) {
	glViewport(0, 0, (GLsizei)w, (GLsizei)h);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	gluOrtho2D(0.0, (GLdouble)w, 0.0, (GLdouble)h);
}
int main(int argc, char *argv[])
{
	int i;
	printf("請選擇實現直線光柵化的演算法:\n1.DDA\t2.Bresenham\n");
	while (scanf("%d", &i))
	{
		if (i == 1 || i == 2)  break;
		else{}
	}
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
	glutInitWindowPosition(100, 100);
	glutInitWindowSize(400, 400);
	glutCreateWindow("Hello World!");
	Init();
	if(i==1)  glutDisplayFunc(myDisplayLine);  //設定mydisplay函式,當需要進行畫圖時,這個函式就會被呼叫 
	else if(i==2)  glutDisplayFunc(myDisplayBres);
	else  return 0;
	glutReshapeFunc(Reshape);  //呼叫此函式,重新建立用作新渲染畫布的矩形區域
	glutMainLoop();  //進行一個訊息迴圈(現在只需要知道這個函式可以顯示視窗,並且等待視窗關閉才會返回)
	return 0;
}

================================(題目③)=================================

畫頂點分別為A(1,1),B(2,5), C(6,3) 的三角形ABC,同時畫出繞B點逆時針旋轉90度的三角形A’B’C’,最後在以上基礎上再畫出繞B點順時針旋轉90度的三角形A’’B’’C’’。

效果圖

題目③原始碼

#pragma warning(disable:4996)
#include <GL/glut.h>;
void init(void)
{
	glClearColor(1.0, 1.0, 1.0, 0.0);
	glMatrixMode(GL_PROJECTION);
	gluOrtho2D(-15.0, 15.0, -15.0, 15.0);  //設定x、y顯示的範圍
	glMatrixMode(GL_MODELVIEW);
}
void drawSquare(void)  //繪製三角形
{
	glBegin(GL_TRIANGLES);  //頂點指定需要按逆時針方向
	glVertex2f(1.0f, 1.0f);
	glVertex2f(2.0f, 5.0f);
	glVertex2f(6.0f, 3.0f);
	glEnd();
}
void myDraw(void)
{
	glClear(GL_COLOR_BUFFER_BIT);  //清空
	glLoadIdentity();  //將當前矩陣設為單位矩陣
	glPushMatrix();  //a:此處的push是為了表明堆疊當前狀態
	glColor3f(1.0f, 0.0f, 0.0f);  //紅色三角形
	drawSquare();  //呼叫drawSquare
	glPopMatrix();  //這個pop使得堆疊狀態回到a狀態
	glPushMatrix();  //作用同a,表明堆疊當前狀態
	glTranslatef(7.0, 3.0, 0.0);  //平移變換,x正方向平移7個單位,y正方向平移3個單位
	glPushMatrix();  //c:這裡的push儲存了上面平移矩陣
	glRotatef(90.0, 0.0, 0.0, 1.0);  //旋轉變換,逆時針旋轉90°	
	glColor3f(0.0f, 1.0f, 0.0f);
	drawSquare();  //綠色三角形,進行一個旋轉和一個平移變換
	glPopMatrix();  //這個pop使得堆疊狀態回到c狀態,棧裡有(7.0, 3.0, 0.0)
	glTranslatef(-10.0, 4.0, 0.0);
	glPushMatrix();  //d:這裡的push儲存了上面平移矩陣,棧裡由底到頂有(7.0, 3.0, 0.0),(-10.0, 4.0, 0.0)
	glRotatef(-90.0, 0.0, 0.0, 1.0);  //旋轉變換,順時針旋轉90°
	glColor3f(0.0f, 0.0f, 1.0f);
	drawSquare();  //藍色三角形,進行一個旋轉和一個平移變換
	glFlush();
}
void main(int argc, char** argv)
{
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
	glutInitWindowPosition(0, 0);
	glutInitWindowSize(600, 600);
	glutCreateWindow("Hello World !");
	init();
	glutDisplayFunc(myDraw);
	glutMainLoop();
}

✎﹏﹏₯㎕《晴天》re so so si la si la so la si si si si la si la so ...﹍﹍﹍﹍﹍﹍