选修了图形学的结果,就是十一假期多出来两个实验🤣
下面这个代码仅仅是我参考别人博客的,不是提交的作业,因为没听过课所以放在这给大家入门食用哈~
/*
* 本次实验要求实现:
* 点、线、圆形、多边形的绘制以及基本的着色
*/
#include <gl\glut.h>
void draw()
{
glClearColor(0.0, 0.0, 0.0, 0.0);
glClear(GL_COLOR_BUFFER_BIT);
//绘制
//红色画点
glColor3f(1.0, 0.0, 0.0);
glBegin(GL_POINTS);
glVertex2f(0.0, 0.0);
glVertex2f(0.1, 0.1);
glVertex2f(0.1, 0.2);
glVertex2f(0.1, 0.3);
glVertex2f(0.1, 0.4);
glEnd();
//绿色画线
glColor3f(0.0, 1.0, 0.0);
glBegin(GL_LINES);
glVertex2f(0.0, 0.0);
glVertex2f(0.0, -0.1);
glVertex2f(-0.1, 0.0);
glVertex2f(-0.1, -0.1);
glEnd();
//蓝色画相邻点相连,首尾不连的线
glColor3f(0.0, 0.0, 1.0);
glBegin(GL_LINE_STRIP);
glVertex2f(-0.2, 0.0);
glVertex2f(-0.2, -0.1);
glVertex2f(-0.3, 0.0);
glVertex2f(-0.3, -0.1);
glEnd();
//粉色画相邻点相连,首尾连的线
glColor3f(1.0, 0.5, 0.5);
glBegin(GL_LINE_LOOP);
glVertex2f(-0.4, 0.0);
glVertex2f(-0.4, -0.1);
glVertex2f(-0.5, 0.0);
glVertex2f(-0.5, -0.1);
glEnd();
//橘黄色画填充面
glColor3f(1.0, 0.5, 0.25);
glBegin(GL_POLYGON);
glVertex2f(-0.1, 0.1);
glVertex2f(-0.2, 0.1);
glVertex2f(-0.3, 0.3);
glVertex2f(-0.2, 0.5);
glVertex2f(-0.1, 0.3);
glEnd();
//碧蓝色画填充面,每四个点画一个四边形,相邻不连接
glColor3f(0.0, 1.0, 1.0);
glBegin(GL_QUADS);
glVertex2f(-0.3, 0.1);
glVertex2f(-0.4, 0.1);
glVertex2f(-0.5, 0.3);
glVertex2f(-0.4, 0.5);
glVertex2f(-0.5, 0.1);
glVertex2f(-0.6, 0.1);
glVertex2f(-0.7, 0.3);
glVertex2f(-0.6, 0.5);
glEnd();
//彩色画填充面,每两个点构成一条线,每两个线构成一个四边形
glBegin(GL_QUAD_STRIP);
//线1
glColor3f(1.0, 0.0, 0.0);
glVertex2f(-0.3, 0.6);
glVertex2f(-0.2, 0.8);
//线2
glColor3f(0.0, 1.0, 0.0);
glVertex2f(-0.4, 0.6);
glVertex2f(-0.5, 0.9);
//线3
glColor3f(0.0, 0.0, 1.0);
glVertex2f(-0.5, 0.5);
glVertex2f(-0.7, 0.7);
glEnd();
//褐色填充三角形(将每三个点围成的三角形进行填充,相邻的点之间不填充)
glColor3f(0.5, 0.25, 0.0);
glBegin(GL_TRIANGLES);
glVertex2f(0.2, 0.1);
glVertex2f(0.3, 0.2);
glVertex2f(0.4, 0.1);
glVertex2f(0.5, 0.1);
glVertex2f(0.6, 0.3);
glVertex2f(0.7, 0.1);
glEnd();
//白色填充三角形(将每三个点围成的三角形进行填充,相邻的点之间填充)
glColor3f(1.0, 1.0, 1.0);
glBegin(GL_TRIANGLE_STRIP);
glVertex2f(0.2, 0.4);
glVertex2f(0.3, 0.7);
glVertex2f(0.4, 0.4);
glVertex2f(0.5, 0.8);
glVertex2f(0.6, 0.4);
glEnd();
//淡蓝色填充三角形(将每三个点围成的三角形进行填充,相邻的点之间填充)
glColor3f(0.5, 0.5, 1.0);
glBegin(GL_TRIANGLE_FAN);
glVertex2f(0.2, -0.2);
glVertex2f(0.2, -0.5);
glVertex2f(0.3, -0.4);
glVertex2f(0.4, -0.3);
glVertex2f(0.3, -0.1);
glEnd();
//这是另一段代码
glColor3f(1.0,0.0,0.0); //设置颜色为红 RGB(255,0,0)
glPointSize( 10 );//设置点的大小为10
glBegin( GL_POINTS); //画点
glVertex2i(0,1); //起始点
glVertex2i(0,-1); //终结点
glEnd();
glColor3f(0.0,1.0,0.0); //设置颜色为绿色
glLineWidth( 6 );//设置线的宽度为6
glBegin( GL_LINES); //画线
glVertex2i(1,1); //起始线段
glColor3f(0.0,1.0,1.0); //设置颜色为青绿
glVertex2i(-1,-1); //终止线段
glColor3f(1.0,1.0,0.0); //设置颜色为黄
glVertex2i(1,-1); //起始线段
glColor3f(1.0,0.0,1.0); //设置颜色为紫红
glVertex2i(-1,1); //终止线段
glEnd();
glFlush();
}
void reshape(int x, int y)
{
int dis = x > y ? y : x; //取小的
glViewport(0, 0, dis, dis);
}
void main()
{
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA);
glutInitWindowPosition(0, 0);
glutInitWindowSize(500, 500);
glutCreateWindow("绘制点、线、面");
glutDisplayFunc(draw);
glutReshapeFunc(reshape);
glutMainLoop();
}
绘制点
首先我们来画点
//绘制点
glColor3f(1.0,0.8,0.0);//设置颜色:黄色的点
glPointSize(8);//设置点的大小
glBegin(GL_POINTS);//画点
glVertex2i(0,0.5);//起始点
glEnd();
绘制直线
//绘制线段
glLineWidth(5);//设置线的宽度为5
glBegin(GL_LINES);//画线
//定义起始点
glColor3f(0.0,0.8,0.2);//设置颜色为绿
glVertex3f(0.25,0.25,0);
//定义终点
glColor3f(1.0,1.0,0.0); //设置颜色为黄
glVertex3f(0.85,0.25,0);
//函数默认会将两个点连起来
glEnd();
绘制多边形
这边给出两套代码,看看就会哦
//绘制多边形并着色
//彩色画填充面,每两个点构成一条线,每两个线构成一个四边形
glBegin(GL_QUAD_STRIP);
//线1
glColor3f(1.0, 0.0, 0.0);
glVertex2f(-0.3, 0.6);
glVertex2f(-0.2, 0.8);
//线2
glColor3f(0.5, 0.2, 0.0);
glVertex2f(-0.2, 0.6);
glVertex2f(-0.5, 0.9);
//线3
glColor3f(0.2, 0.5, 1.0);
glVertex2f(-0.1, 0.5);
glVertex2f(-0.11, 0.7);
glEnd();
//
//橘黄色画填充面
glColor3f(1.0, 0.5, 0.25);
glBegin(GL_POLYGON);
glColor3f(1.0, 0.5, 0.25);
glVertex2f(-0.1, 0.1);
glVertex2f(-0.2, 0.1);
glColor3f(1.0, 1.0, 0.25);
glVertex2f(-0.3, 0.3);
glVertex2f(-0.4, 0.5);
glColor3f(1.0, 0.5, 0.25);
glVertex2f(-0.5, 0.3);
glEnd();
除了圆之外的完整代码
/*
* 本次实验要求实现:
* 点、线、圆形、多边形的绘制以及基本的着色
*/
#include <gl\glut.h>
#include<math.h>
void draw()
{
glClearColor(0.0, 0.0, 0.0, 0.0);
glClear(GL_COLOR_BUFFER_BIT);
//绘制
//绘制点
glColor3f(1.0,0.8,0.0);//设置颜色:黄色的点
glPointSize(8);//设置点的大小
glBegin(GL_POINTS);//画点
glVertex2i(0,0.5);//起始点
glEnd();
//绘制线段
glLineWidth(5);//设置线的宽度为5
glBegin(GL_LINES);//画线
//定义起始点
glColor3f(0.0,0.8,0.2);//设置颜色为绿
glVertex3f(0.25,0.25,0);
//定义终点
glColor3f(1.0,1.0,0.0); //设置颜色为黄
glVertex3f(0.85,0.25,0);
//函数默认会将两个点连起来
glEnd();
//绘制多边形并着色
//彩色画填充面,每两个点构成一条线,每两个线构成一个四边形
glBegin(GL_QUAD_STRIP);
//线1
glColor3f(1.0, 0.0, 0.0);
glVertex2f(-0.3, 0.6);
glVertex2f(-0.2, 0.8);
//线2
glColor3f(0.5, 0.2, 0.0);
glVertex2f(-0.2, 0.6);
glVertex2f(-0.5, 0.9);
//线3
glColor3f(0.2, 0.5, 1.0);
glVertex2f(-0.1, 0.5);
glVertex2f(-0.11, 0.7);
glEnd();
//
//橘黄色画填充面
glColor3f(1.0, 0.5, 0.25);
glBegin(GL_POLYGON);
glColor3f(1.0, 0.5, 0.25);
glVertex2f(-0.1, 0.1);
glVertex2f(-0.2, 0.1);
glColor3f(1.0, 1.0, 0.25);
glVertex2f(-0.3, 0.3);
glVertex2f(-0.4, 0.5);
glColor3f(1.0, 0.5, 0.25);
glVertex2f(-0.5, 0.3);
glEnd();
glFlush();
}
void reshape(int x, int y)
{
int dis = x > y ? y : x; //取小的
glViewport(0, 0, dis, dis);
}
void main()
{
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA);//设置显示方式
glutInitWindowPosition(0, 0);//指定窗口位置
glutInitWindowSize(500, 500);//指定窗口大小
glutCreateWindow("绘制点、线、圆、多边形");
glutDisplayFunc(draw);//执行绘图函数
glutReshapeFunc(reshape);
glutMainLoop();//显示窗口,关闭窗口时跳出循环
}
关于画圆
也不知道是不是我的配置的问题,好几个博客的代码利用将圆弧划分成若干点的代码我这边都是报错
破案了:是因为别人用的是CPP我用的是C,大概吧……
换了语言之后跑通了
实验一最终提交版本
后来发现原来可以用c++调用opengl,被老师的文档坑惨啦😅
#include <gl\glut.h>
#include "math.h"
#include <iostream>
/*
实验一:
完成基本图形的绘制
*/
using namespace std;
int n=3600; //圆绘制次数
float PI=3.1415926f;
float R=0.1f; //半径
void myDisplay(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glClearColor(0,0,0,0);
glColor4f(0,0,1,0);
//绘制点
glColor3f(1.0,0.8,0.0);//设置颜色:黄色的点
glPointSize(5);//设置点的大小
glBegin(GL_POINTS);//画点
glVertex2f(-1,-1);
glVertex2f(-0.90,-0.8);
glVertex2f(-0.8,-0.9);
glVertex2f(-0.85,-0.9);
glVertex2f(-0.8,-0.95);
glVertex2f(-0.89,-0.96);
glVertex2f(-0.70,-0.8);
glVertex2f(-0.8,-0.7);
glVertex2f(-0.85,-0.75);
glVertex2f(-0.75,-0.95);
glVertex2f(-0.89,-0.96);
glEnd();
//绘制线段
glLineWidth(5);//设置线的宽度为5
glBegin(GL_LINES);//画线
//定义起始点
glColor3f(0.0,0.8,0.2);//设置颜色为绿
glVertex3f(0.25,0.25,0);
//定义终点
glColor3f(1.0,1.0,0.0); //设置颜色为黄
glVertex3f(0.85,0.25,0);
//函数默认会将两个点连起来
glEnd();
//绘制多边形并着色
//彩色画填充面,每两个点构成一条线,每两个线构成一个四边形
glBegin(GL_QUAD_STRIP);
//线1
glColor3f(1.0, 0.0, 0.0);
glVertex2f(-0.3, 0.6);
glVertex2f(-0.2, 0.8);
//线2
glColor3f(0.5, 0.2, 0.0);
glVertex2f(-0.2, 0.6);
glVertex2f(-0.5, 0.9);
//线3
glColor3f(0.2, 0.5, 1.0);
glVertex2f(-0.1, 0.5);
glVertex2f(-0.11, 0.7);
glEnd();
//
//橘黄色画填充面
glColor3f(1.0, 0.5, 0.25);
glBegin(GL_POLYGON);
glColor3f(1.0, 0.5, 0.25);
glVertex2f(-0.1, 0.1);
glVertex2f(-0.2, 0.1);
glColor3f(1.0, 1.0, 0.25);
glVertex2f(-0.3, 0.3);
glVertex2f(-0.4, 0.5);
glColor3f(1.0, 0.5, 0.25);
glVertex2f(-0.5, 0.3);
glEnd();
//画圆
glColor4f(0,0,1,0);
glBegin(GL_POLYGON);
for(int i=0;i<n;i++)
{
glVertex2f(R*cos(2*PI*i/n),R*sin(2*PI*i/n)); //定义顶点
}
glEnd();
glFlush();
}
int main(int argc, char *argv[])
{
glutInit(&argc, argv); //初始化GLUT
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
glutInitWindowPosition(100, 100);
glutInitWindowSize(400, 400);
glutCreateWindow("高宏艳 实验一");
glutDisplayFunc(&myDisplay); //回调函数
glutMainLoop(); //持续显示,当窗口改变会重新绘制图形
}
乱写的茶壶的梦境啊哈哈
/*
绘制三维图形,
实现他们的旋转、缩放和平移
*/
#include <windows.h>
#include <gl/gl.h>
#include <gl/glu.h>
#include <gl/glut.h>
#include <math.h>
// 旋转参数
static GLfloat xRot = 0.0f;
static GLfloat yRot = 0.0f;
// 绘制函数
void RenderScene(void)
//绘制的思路:梦里一只红色的茶壶周围绕着黄色小茶壶
{
// 绕原子核的角度
static float fElect1 = 0.0f;
// 默认颜色请空窗口
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// 重置模型视图矩阵
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
//初始化
//glTranslatef:定义一个平移矩阵,该矩阵与当前矩阵相乘,使后续的图形进行平移变换
glTranslatef(0.0f, 0.0f, -100.0f);
// 红色的电子
glColor3ub(255, 0, 0);
//glutSolidSphere(10.0f, 15, 15);
glutSolidTeapot(20);//绘制实心茶壶
// 黄色电子
glColor3ub(255,255,0);
// First Electron Orbit
// Save viewing transformation
glPushMatrix();
// Rotate by angle of revolution
glRotatef(fElect1, 0.0f, 1.0f, 0.0f);
// Translate out from origin to orbit distance
glTranslatef(90.0f, 0.0f, 0.0f);
// Draw the electron
//glutSolidSphere(6.0f, 15, 15);
glutSolidTeapot(8);
// Restore the viewing transformation
glPopMatrix();
// Second Electron Orbit
glPushMatrix();
glRotatef(45.0f, 0.0f, 0.0f, 1.0f);
glRotatef(fElect1, 0.0f, 1.0f, 0.0f);
glTranslatef(-70.0f, 0.0f, 0.0f);
glutSolidSphere(6.0f, 15, 15);
glPopMatrix();
// Third Electron Orbit
glPushMatrix();
glRotatef(360.0f-45.0f,0.0f, 0.0f, 1.0f);
glRotatef(fElect1, 0.0f, 1.0f, 0.0f);
glTranslatef(0.0f, 0.0f, 60.0f);
glutSolidSphere(6.0f, 15, 15);
glPopMatrix();
// Increment the angle of revolution
fElect1 += 10.0f;
if(fElect1 > 360.0f)
fElect1 = 0.0f;
// Show the image
glutSwapBuffers();
}
// This function does any needed initialization on the rendering
// context.
void SetupRC()
{
glEnable(GL_DEPTH_TEST); // Hidden surface removal
glFrontFace(GL_CCW); // Counter clock-wise polygons face out
glEnable(GL_CULL_FACE); // Do not calculate inside of jet
// Black background
glClearColor(0.0f, 0.0f, 0.0f, 1.0f );
}
void SpecialKeys(int key, int x, int y)
{
if(key == GLUT_KEY_UP)
xRot-= 5.0f;
if(key == GLUT_KEY_DOWN)
xRot += 5.0f;
if(key == GLUT_KEY_LEFT)
yRot -= 5.0f;
if(key == GLUT_KEY_RIGHT)
yRot += 5.0f;
if(xRot > 356.0f)
xRot = 0.0f;
if(xRot < -1.0f)
xRot = 355.0f;
if(yRot > 356.0f)
yRot = 0.0f;
if(yRot < -1.0f)
yRot = 355.0f;
// Refresh the Window
glutPostRedisplay();
}
void TimerFunc(int value)
{
glutPostRedisplay();
glutTimerFunc(100, TimerFunc, 1);
}
void ChangeSize(int w, int h)
{
GLfloat nRange = 100.0f;
// Prevent a divide by zero
if(h == 0)
h = 1;
// Set Viewport to window dimensions
glViewport(0, 0, w, h);
// Reset coordinate system
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
// Establish clipping volume (left, right, bottom, top, near, far)
if (w <= h)
glOrtho (-nRange, nRange, nRange*h/w, -nRange*h/w, -nRange*2.0f, nRange*2.0f);
else
glOrtho (-nRange*w/h, nRange*w/h, nRange, -nRange, -nRange*2.0f, nRange*2.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
int main(int argc, char* argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutCreateWindow("OpenGL Atom");
glutReshapeFunc(ChangeSize);
glutSpecialFunc(SpecialKeys);
glutDisplayFunc(RenderScene);
glutTimerFunc(500, TimerFunc, 1);
SetupRC();
glutMainLoop();
return 0;
}