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();
}
输出:
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个点的坐标:
输出:判断是否平行