CPT205——Computer Graphics——lab 3代码与解析

Tips:

  • 在VS中,多行注释的快捷键为ctrl+k+c,取消注释为ctrl+k+u。
  • 一个项目中只能有一个main()函数,同时如果本程序正在运行,则它不能被再次编译运行。所以在做其他task的时候要把同一个项目里其他源文件的main函数注释掉(或者干脆全注释)。
  • openGL中的各个语句的用法建议去看官方文档(英文):OpenGL 4 Reference Pages (khronos.org)

上面是OpenGL的文档,我们学的是freeglut: http://freeglut.sourceforge.net/docs/api.php

感谢none爹的支持和修改建议!!!!

Task 1:

task1主要是跟着pdf做,没什么好讲的,代码也比较直接干脆,就写在下面了。主要是熟悉OpenGL画图的结构和理解流程。

 //File ID: Lab03a.cpp
 //Title: Working with Graphics Primitives
 //Author: 
#define FREEGLUT_STATIC
#include <GL/freeglut.h>
#include <math.h>
void define_to_OpenGL();
/
int main(int argc, char** argv)
{
	glutInit(&argc, argv);
	 //Task 1
	glutCreateWindow("Graphics Primitives");
	glutDisplayFunc(define_to_OpenGL);
	glutMainLoop();
	return 0;
}
/
void define_to_OpenGL()
{
	glClearColor(1, 1, 1, 1);
	glClear(GL_COLOR_BUFFER_BIT);
	 //The stuff to appear on screen goes here
	glutInitWindowSize(600, 400);
	glutInitWindowPosition(50, 50);
	int L = -100, R = 500, B = -200, T = 200;
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	gluOrtho2D(L, R, B, T);
	 //Task 3
	glLineWidth(1.0);
	glColor3f(1 , 1 , 0);	
	glBegin(GL_LINES);
	glVertex2f(0.0, 0.0); // start location
	glVertex2f(450.0, 0.0); // end location
	glEnd();

	glColor3f(1, 0, 1);
	glBegin(GL_LINES);
	glVertex2f(0.0, -150.0); // start location
	glVertex2f(0.0, +150.0); // end location
	glEnd();
	 //Task 4
	glPointSize(10);
	glColor3f(0 , 0 , 0);
	glBegin(GL_POINTS);
	glVertex2f(0 , 0);
	glEnd();
	 //Task 5
	 // draw a sine wave
	int i;
	float x, y;
	glColor3f(0.0, 0.0, 1.0);
	glPointSize(1);
	glBegin(GL_POINTS);
	for (i = 0; i < 361; i = i + 5)
	{
		x = (float)i;
		y = 100.0 * sin(i * (6.284 / 360.0));
		glVertex2f(x, y);
	}
	glEnd();
	 //Tasks 6, 7 and 8
	
	glBegin(GL_TRIANGLES);
	glColor3f(1 , 0 , 0 );
	glVertex2f(-50 , -50 );
	glColor3f(0 , 1 , 0 );
	glVertex2f(-50 , 0 );
	glColor3f(0 , 0, 1 );
	glVertex2f(0 , 0 );
	glShadeModel(GL_FLAT);
	glEnd();

	glFlush();
}

输出:95717823d84c45168fa884f0db73ebac.png

Task 2: 

task2的主要难点是要使用cin和cout来得到四组坐标(两条直线),这一点居然可以在define_to_opengl()这个方法里面直接加入,也就是说这里面不止可以存在opengl的方法,其他想要在画图时实现的代码也可以。我感觉有其他的设计方式也可以实现,如果有其他的思路也欢迎分享。DDA的公式、计算长度斜率、判断平行的公式都包装成方法了。

#define FREEGLUT_STATIC
#include <GL/freeglut.h>
#include <math.h>
#include <iostream>
using namespace std;
void define_to_OpenGL(); // Draw geometric elements and output results
void init(); // Initialise coordinates of line end points

void DDA(double x1, double y1, double x2, double y2) {
	double m;
	m = double((y2 - y1) / (x2 - x1));
	cout <<"m = " << m << endl;
	if (m > 1) { //判断m大于或小于1两种情况, 若m大于1 则遍历x,否则遍历y
		double y = y1;
		double yi[100]; //记录y坐标的数组
		for (int x = x1; x <= x2; x++) {
			yi[x] = round(y);//四舍五入得到y坐标
			y += m;
		}
		for (int x = x1; x <= x2; x++) { //打印所有坐标
			cout << "x = " << x << " y = " << yi[x]<<endl;
		}
	}
	else { //与上类似
		double x = x1;
		double xi[100];
		for (int y = y1; y <= y2; y++) {
			xi[y] = round(x);
			x += 1 / m; //因为y' = m x'
		}
		for (int y = y1; y <= y2; y++) { //打印所有坐标
			cout << "x = " << xi[y] << " y = " << y<<endl;
		}
	}
	
}
double countLength(int x1, int y1, int x2, int y2) {
	double length;
	length = double(sqrt(pow(abs(x1 - x2), 2) + pow(abs(y1 - y2), 2)));
	return length;
}

double countGradient(int x1, int y1, int x2, int y2) {
	double gradient;
	if (x2 == x1) {
		gradient = 0;
	}
	else {
		/*cout << y2 - y1 << endl;
		cout << x2 - x1 << endl;*/
		gradient = double(double(y2 - y1) / double(x2 - x1));
	}
	return gradient;
}

void checkP(double g1, double g2) {
	if (g1 == g2) {
		cout <<"parallel"<<endl;
	}
	else {
		cout << "perpendicular"<<endl;
	}
}

void define_to_OpenGL() {
	int xa, ya, xb, yb, xc, yc, xd, yd;
	double l1, l2, g1, g2;

	cin >> xa >> ya;
	cin >> xb >> yb;
	cin >> xc >> yc;
	cin >> xd >> yd;
	l1 = countLength(xa, ya, xb, yb);
	l2 = countLength(xc, yc, xd, yd);
	g1 = countGradient(xa, ya, xb, yb);
	g2 = countGradient(xc, yc, xd, yd);

	//cout << xa << endl << ya << endl << xb << endl << yb<<endl;
	//cout << g1 << endl << g2 << endl;

	checkP(g1, g2);

	glClearColor(1, 1, 1, 1);
	glClear(GL_COLOR_BUFFER_BIT);
	 //The stuff to appear on screen goes here
	glutInitWindowSize(600, 400);
	glutInitWindowPosition(50, 50);
	int L = -100, R = 500, B = -200, T = 200;
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	gluOrtho2D(L, R, B, T);

	glLineWidth(1.00);
	glBegin(GL_LINES);
	glColor3f(1, 0, 0);
	glVertex2f(xa, ya); // start location
	glVertex2f(xb, yb); // end location
	glEnd();

	glLineWidth(1.0);
	glBegin(GL_LINES);
	glColor3f(1, 0, 0);
	glVertex2f(xc, yc); // start location
	glVertex2f(xd, yd); // end location
	glEnd();


	glPointSize(10);
	glColor3f(1, 0, 0);
	glBegin(GL_POINTS);
	glVertex2f(xa, ya);
	glVertex2f(xb, yb);
	glVertex2f(xc, yc);
	glVertex2f(xd, yd);
	glEnd();
	glFlush();
}
int main(int argc, char** argv)
{	//-100 -50 0 10 50 40 100 0
	//DDA(-2, 3, 10, 8);
	//DDA(-2, 3, -22, 33);
	glutInit(&argc, argv);
	glutCreateWindow("Graphics Primitives");
	glutDisplayFunc(define_to_OpenGL);
	glutMainLoop();
	return 0;
}

输入8个点的坐标:

b8af7f197a4b4b0a8e3a74ec32ec187b.png

输出:14a3a0ec146e406cbd7ee8862d6f0cb3.png判断是否平行

 a23f72bdefe3425f845935025422175b.png

猜你喜欢

转载自blog.csdn.net/m0_59056870/article/details/126997395
今日推荐